Win32 LB_GETTEXT возвращает мусор

Я выяснил, почему 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 e = request.getParameterNames(). Элемент не был найден, поэтому introspecthelper никогда не выполняется.

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

5
задан Cory 10 April 2009 в 22:45
поделиться

1 ответ

Сообщение 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, чтобы получить список элементов, которые выбраны.

11
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: