jsp:getProperty null, когда используется атрибут enctype=multipart/form-data

В соответствии с Отправка дополнительных данных с помощью multipart, request.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. Но мне нужно работать с сервлетом 3.0 и tomcat 8.5. Есть ли другой способ передачи данных при использовании enctype="multipart/form-data" в Jsp в 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>

процесс.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...

}

person Byaku    schedule 10.03.2019    source источник


Ответы (2)


Я выяснил, почему 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.

При работе с enctype="multipart/form-data" проблема заключается в Enumeration<String> e = request.getParameterNames(). Элемент не найден, поэтому introspecthelper никогда не выполняется.

Потому что JspRuntimeLibrary.introspect является статическим методом. Я не могу переопределить его поведение. Итак, написав собственный тег или следуя Как загрузить файлы на сервер с помощью JSP/Servlet? — единственный способ решить проблему.

person Byaku    schedule 11.03.2019

Вы можете использовать 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>

Вам нужно включить jar файл commons-fileupload с jar сервлета.

person Sanjay    schedule 23.03.2019