2015-10-26 1 views
1

Я хочу отправить форму своему классу действий с помощью Struts 2 classic getter/setter. Все остальные поля получают свою ценность, за исключением поля boolean, которое остается false, когда я устанавливаю флажок в нем.Значение флажка `on` не передается классу Action. Должен ли я получить параметр из HttpServletRequest напрямую?

У меня есть флажок, как это в моем 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. Браузеры не отправлять что-либо для непроверенных значений (это может быть неуместным в случае Booleans, поскольку по умолчанию является ложным, но все же ...)

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

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

, а затем вам нужно будет иметь дело с незанятыми значениями.

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

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

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

будет переводить на следующий HTML (с Simple Theme и 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 example on <s:checkbox />, а также this SO answer, чтобы лучше понять, с чего начать.

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

+0

Извините за поздний ответ. Я не знаю, почему, но '' не соответствует моим правилам Boostrap CSS, а '' отлично. И наконец, поэтому я решил использовать '' и получить параметры с 'HttpServletSession' напрямую ... Но в любом случае спасибо. Это не проект для производства, а только домашняя работа, поэтому я часто теряю руки сейчас. Но я приму ваш ответ и сохраню его для использования, потому что вы предоставляете отличные ссылки и много информации здесь. – FaithReaper

+1

@FaithReaper не сдаётся: я точно знаю, почему он не соответствует вашим правилам CSS Bootstrap, [все это объяснено здесь] (http://stackoverflow.com/a/28558436/1654265). Затем, если вы не используете плагин Bootstrap (и вам не нужно, если вы уже знаете, как писать простой Bootstrap), просто добавьте 'theme =" simple "' в ваши '' теги. Вот и все. Я предлагаю вам попробовать, даже если вы уже переехали после этого, чтобы узнать лучшие практики вместо вуду, с которым вы столкнулись. Пожалуйста, рассмотрите ** upvoting ** ответ (-ы), который вам помог, это лучшее спасибо их авторам –

+0

Я пробовал 'theme =" simple "', и это сработало, отлично! Но я не могу представить свою ценность моему классу action, который является «Integer». Когда я устанавливаю этот флажок, я хочу передать «ID» этого рейса в мой класс, но он не работает (ошибка в консоли: «Отсутствует ключ [invalid.fieldvalue.reservaChecked]» в пакетах [[org/apache/struts2/struts -messages, com/opensymphony/xwork2/xwork-messages]]! ', в то время как я установил' fieldValue = "true" '. Но' 'работает. Кроме того, я хочу, чтобы это было – FaithReaper