1

我想用 Struts 2 经典getter/setter方式向我的动作类提交一个表单。所有其他字段都获得了它们的值,除了一个boolean字段,false当我选中它对应的复选框时,它仍然存在。

我的jsp中有一个这样的复选框:

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

在我的行动课上,我有:

private boolean soloIda;

及其getter/setter。但是当我检查它时它仍然是错误的。

我注意到在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 的工作方式。知道为什么它不起作用吗?我一定做错了什么。

4

1 回答 1

1

这不是你的拦截器的错......只是复选框是一个丑陋的东西

要知道的事情:

  1. 当未指定值时,浏览器发送的复选框是特定于浏览器的;
  2. 浏览器不会为未检查的值发送任何内容(这在布尔值的情况下可能无关紧要,因为默认值为 false,但仍然......)

然后你可以用

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

然后你需要处理未经检查的值。

为了处理这种情况,Struts2 为您提供了<s:checkbox />(和<s:checkboxlist />)标签,以及它的valuefieldValue属性,以及标签生成的隐藏参数(__checkbox_something),即使未选中复选框也可以发送内容。然后Checkbox Interceptor会读取此参数。

例如。来自文档:

<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 />以及此 SO 答案,以更好地了解从哪里开始。

始终考虑使用特定于框架的标签(至少一开始),它已经为您透明地处理了许多问题。

于 2015-10-26T21:45:06.493 回答