Я выяснил, почему 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 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
. Элемент не был найден, поэтому introspecthelper
никогда не выполняется.
Потому что JspRuntimeLibrary.introspect
является статическим методом. Я не могу отменить его поведение. Итак, написание пользовательского тега или следование Как загрузить файлы на сервер с помощью JSP / Servlet? - единственный способ решить эту проблему.
Сообщение LB_GETSEL не возвращает индекс выбранного элемента, оно возвращает выбранное СОСТОЯНИЕ ПУНКТА, который вы передаете в WPARAM.
У вас также есть серьезная ошибка, при которой, если ни один элемент не выбран, вы попытается получить строку элемента с индексом -1, что явно неверно. Проверка возвращаемых значений этих вызовов SendMessage помогла бы вам диагностировать проблему.
Вот пример того, как получить текст первого выбранного элемента;
// get the number of items in the box.
count = SendMessage(control, LB_GETCOUNT, 0, 0);
int iSelected = -1;
// go through the items and find the first selected one
for (int i = 0; i < count; i++)
{
// check if this item is selected or not..
if (SendMessage(control, LB_GETSEL, i, 0) > 0)
{
// yes, we only want the first selected so break.
iSelected = i;
break;
}
}
// get the text of the selected item
if (iSelected != -1)
SendMessage(control, LB_GETTEXT, (WPARAM)iSelected , (LPARAM)text);
В качестве альтернативы вы можете использовать LB_GETSELITEMS, чтобы получить список элементов, которые выбраны.