Значение флажка `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¶m2=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 ответ
Это не вина твоего Перехватчика... просто чекбоксы - ужасная вещь.
Что нужно знать:
- То, что браузеры отправляют для флажков, когда значение не указано, зависит от браузера;
- Браузеры ничего не отправляют для непроверенных значений (это может быть неактуально в случае логических значений, поскольку по умолчанию установлено значение 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 />
а также этот так ответ, чтобы лучше понять, с чего начать.
Всегда рассматривайте возможность использования специальных тегов фреймворка (по крайней мере, на первый взгляд), которые уже прозрачно решают многие проблемы.