Я выяснил, почему 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);
}
}
Выше запроса карты кодапараметры и имена (имена свойств бина), а затем introspecthelper
будут переданы значения соответствующим методам установки с использованием java.lang.reflect.Method.invoke
.
При работе с enctype="multipart/form-data"
проблема заключается в Enumeration<String> e = request.getParameterNames()
.Элемент не найден, поэтому introspecthelper
никогда не выполняется.
Поскольку JspRuntimeLibrary.introspect
является статическим методом.Я не могу отменить его поведение.Итак, написание пользовательского тега или следование Как загрузить файлы на сервер с помощью JSP / Servlet? - единственный способ решить проблему.