【问题标题】:jsp:getProperty null when enctype="multipart/form-data" attribute is used当使用 enctype="multipart/form-data" 属性时 jsp:getProperty null
【发布时间】:2019-03-10 18:58:36
【问题描述】:

根据Sending additional data with multipartrequest.getParameter; 不能与enctype="multipart/form-data" 一起使用。在 process.jsp,我没有使用request.getParameter。但是jsp:getProperty 返回空值。 删除 enctype="multipart/form-data" 工作正常。 我想知道 enctype="multipart/form-data" 如何影响jsp:setProperty and jsp:getProperty。它们是如何连接的?我知道jsp:setProperty 不是首选方式。 当我使用旧代码时,没有使用框架或没有使用 MVC。但我必须使用 servlet 3.0 和 tomcat 8.5 运行。在使用enctype="multipart/form-data" to Jsp to Jsp的同时,有没有其他方法可以传递数据?

form.jsp

<!--    <form action="process.jsp" method="post" enctype="application/x-www-form-urlencoded"> -->
<!--    <form action="process.jsp" method="post"> -->
    <form action="process.jsp" method="post" enctype="multipart/form-data">
        Name:<input type="text" name="name"><br> 
        Password:<input type="password" name="password"><br> 
        Email:<input type="text" name="email"><br> 
        File:<input type="file" name="fileName"><br> 
        <hr>
        <input type="submit" value="register">
    </form>

process.jsp

<jsp:useBean id="bean" class="dao.User" scope="page">
<jsp:setProperty property="*" name="bean"/>  
</jsp:useBean>  

Record:<br>  
<jsp:getProperty property="name" name="bean"/><br>  
<jsp:getProperty property="password" name="bean"/><br>  
<jsp:getProperty property="email" name="bean" /><br>  

用户.java

public class User {

    private String name;
    private String password;
    private String email;
    private String fileName;

// getter and setter...

}

【问题讨论】:

    标签: java jsp java-8 servlet-3.0 tomcat8.5


    【解决方案1】:

    我发现了为什么 enctype="multipart/form-data" 不能与 jsp:setProperty and jsp:getProperty 一起使用。当我使用 tomcat 运行时,process.jsp 生成为 process_jsp.java。

      dao.User bean = null;
      bean = (dao.User) _jspx_page_context.getAttribute("bean", javax.servlet.jsp.PageContext.PAGE_SCOPE);
      if (bean == null){
        bean = new dao.User();
        _jspx_page_context.setAttribute("bean", bean, javax.servlet.jsp.PageContext.PAGE_SCOPE);
        out.write('\n');
        org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("bean"), request);
        out.write(' ');
        out.write(' ');
        out.write('\n');
      }
    

    根据上面的源代码org.apache.jasper.runtime.JspRuntimeLibrary.introspect被调用了。

       public static void introspect(Object bean, ServletRequest request) throws JasperException
        {
            Enumeration<String> e = request.getParameterNames();
            while ( e.hasMoreElements() ) {
                String name  = e.nextElement();
                String value = request.getParameter(name);
                introspecthelper(bean, name, value, request, name, true);
            }
        }
    

    上面的代码映射请求参数和名称(bean 属性名称)然后introspecthelper 将通过使用java.lang.reflect.Method.invoke 将值传递给适当的setter 方法。

    使用enctype="multipart/form-data" 时,Enumeration&lt;String&gt; e = request.getParameterNames() 是问题所在。未找到任何元素,因此永远不会执行 introspecthelper

    因为JspRuntimeLibrary.introspect 是静态方法。我不能覆盖它的行为。因此,编写自定义标签或关注How to upload files to server using JSP/Servlet?是解决问题的唯一方法。

    【讨论】:

      【解决方案2】:

      您可以使用jsp将文件上传到带有其他输入字段的服务器。

      例如。 index.jsp

      <form action="upload.jsp" method="post" enctype="multipart/form-data">
      <input type="file" name="file" size="50" />
      <br>
      <input type="text" name="name" />
      <br />
      <input type="submit" value="Upload File" />
      </form>
      

      上传.jsp

      <%@ page import="java.io.*,java.util.*, javax.servlet.*"%>
      <%@ page import="javax.servlet.http.*"%>
      <%@ page import="org.apache.commons.fileupload.*"%>
      <%@ page import="org.apache.commons.fileupload.disk.*"%>
      <%@ page import="org.apache.commons.fileupload.servlet.*"%>
      <%@ page import="org.apache.commons.io.output.*"%>
      <html>
      <head>
      </head>
      <body>
          <%
              File file;
              int maxFileSize = 5000 * 1024;
              int maxMemSize = 5000 * 1024;
              String filePath = "D:/";
      
              String contentType = request.getContentType();
              if ((contentType.indexOf("multipart/form-data") >= 0)) {
      
                  DiskFileItemFactory factory = new DiskFileItemFactory();
                  factory.setSizeThreshold(maxMemSize);
                  factory.setRepository(new File("c:\\temp"));
                  ServletFileUpload upload = new ServletFileUpload(factory);
                  upload.setSizeMax(maxFileSize);
                  try {
                      List fileItems = upload.parseRequest(request);
                      Iterator i = fileItems.iterator();
                      out.println("<html>");
                      out.println("<body>");
                      while (i.hasNext()) {
                          FileItem fi = (FileItem) i.next();
                          if (!fi.isFormField()) {
                              String fieldName = fi.getFieldName();
                              String fileName = fi.getName();
                              boolean isInMemory = fi.isInMemory();
                              long sizeInBytes = fi.getSize();
                              file = new File(filePath + fileName);
                              //fi.write(file);
                              out.println("Uploaded Filename: " + filePath + fileName + "<br>");
                          }else{
                              System.out.println(fi.getFieldName() +":"+fi.getString());
                          }
                      }
                      out.println("</body>");
                      out.println("</html>");
                  } catch (Exception ex) {
                      System.out.println(ex);
                  }
              } else {
                  out.println("<html>");
                  out.println("<body>");
                  out.println("<p>No file uploaded</p>");
                  out.println("</body>");
                  out.println("</html>");
              }
          %>
      </body>
      </html>
      

      您需要在 servlet jar 中包含 jar 文件 commons-fileupload。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 2017-12-17
        • 2016-04-02
        • 1970-01-01
        相关资源
        最近更新 更多