Значение флажка `on` не передается в класс Action. Должен ли я получить параметр из HttpServletRequest напрямую?

Я хочу отправить форму в свой класс действий с Struts 2 classic getter/setter путь. Все остальные поля получают свое значение, кроме boolean поле, которое остается false когда я проверяю флажок, это соответствует.

У меня есть флажок, как это в моем JSP:

<div class="col-md-3">
   <input class="input-md" type="checkbox" id="soloIdaId" name="soloIda" />
</div>

И в моем классе действий у меня есть:

private boolean soloIda;

и его получатель / установщик. Но это остается ложным, когда я проверял это.

Я заметил, что в queryString содержит:

...&soloIda=on&... (I am testing with FF)

И, если я пытаюсь получить параметр запроса, я получаю true:

HttpServletRequest request = ServletActionContext.getRequest();
String soloIdaParam = request.getParameter("soloIda"); //"true" when I debug

Не знаю, имеет ли это значение, но я использую свой перехватчик. Но я всегда включаю defaultStackи я считаю, что перехватчик по умолчанию обрабатывает этот вид работы (используя getter / setter для присвоения значений полям). Так почему же?

Прикрепление моего struts.xml Вот:

 <interceptors>
    <interceptor name="authentication"
        class="com.WindThunder.interceptor.LoginInterceptor">
    </interceptor>
    <interceptor name="query"
        class="com.WindThunder.interceptor.QueryInterceptor">
    </interceptor>
    <interceptor-stack name="authStack">
        <interceptor-ref name="authentication"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref> <!-- this
          line is necessary for every stack!!!! -->
    </interceptor-stack>
    <interceptor-stack name="pageStack">
        <interceptor-ref name="query"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
</interceptors>

<action name="searchCiudad" class="com.WindThunder.action.VueloAction"
      method="searchCiudad">
<interceptor-ref name="pageStack"/>
  <result name="success">/listaCiudads.jsp</result>
  <result name="error">/common/error.jsp</result>
  <result name="vacio">/common/listaVacia.jsp</result>
</action>

И мой QueryInterceptor.java:

@Override
public String intercept(ActionInvocation invocation) throws Exception {
    //get previous action name = pagePath. (/searchxxx.action)
    this.session = invocation.getInvocationContext().getSession();
    HttpServletRequest request = ServletActionContext.getRequest();
    String path = request.getRequestURI(); //contaits domain
    String pagePath = path.substring(path.lastIndexOf("/"));

    //get previous query string (param1=xx&param2=xx, or null)
    String queryString = request.getQueryString();
    addParamToSession(queryString, session);
    String prePage = "";
    if (!pagePath.equalsIgnoreCase("/login.action")){
        prePage = pagePath;
    }
    if (prePage != null && !prePage.equals("")){
        session.put("prePage",prePage);
    }
    return invocation.invoke();
}

Теперь я хочу получить параметр "soloIda" прямо из request и сделать какое-то ручное задание, но я думаю, что это способ работы Struts 1. Есть идеи, почему это не работает? Я должен делать что-то не так.

1 ответ

Решение

Это не вина твоего Перехватчика... просто чекбоксы - ужасная вещь.

Что нужно знать:

  1. То, что браузеры отправляют для флажков, когда значение не указано, зависит от браузера;
  2. Браузеры ничего не отправляют для непроверенных значений (это может быть неактуально в случае логических значений, поскольку по умолчанию установлено значение false, но все же...)

Тогда вы можете заставить значение с

<input class = "input-md"
        type = "checkbox" 
          id = "soloIdaId" 
        name = "soloIda" 
       value = "true" />

и тогда вам придется иметь дело с непроверенными значениями.

Чтобы справиться с этой ситуацией, Struts2 предоставляет вам <s:checkbox /><s:checkboxlist />) тегом, со своим value а также fieldValue атрибуты и скрытый параметр (__checkbox_something) что тег генерирует для отправки чего-либо, даже если флажок не установлен. Этот параметр затем читается флажком-перехватчиком.

Например. из документов:

<s:checkbox cssClass = "input-md"
                  id = "soloIdaId"
                name = "soloIda" 
          fieldValue = "true"
               value = "aBoolean" 
/>

переведет на следующий HTML (с простой темой и Boolean aBoolean = true;):

<input type = "checkbox" 
      class = "input-md"
         id = "soloIdaId"
       name = "soloIda" 
      value = "true" 
    checked = "checked"
/>
<input type = "hidden"  
         id = "__checkbox_soloIdaId" 
      value = "true" 
       name = "__checkbox_soloIda" 
/>

Прочитайте пример Mkyong на <s:checkbox /> а также этот так ответ, чтобы лучше понять, с чего начать.

Всегда рассматривайте возможность использования специальных тегов фреймворка (по крайней мере, на первый взгляд), которые уже прозрачно решают многие проблемы.

Другие вопросы по тегам