在struts2中的同一隐藏变量中传递多个相同类型的值

时间:2012-09-10 10:00:10

标签: java jquery struts2 struts

首先,我使用struts2,java和javascript来完成我的工作。我已将问题概述如下。

我的页面上有以下表格 -

___________________________
checkbox  |  phone  | Name      
---------------------------
   []     | 123-456 | abcde

   []     | 234-567 | testname
____________________________

(这是一个大纲,但留在我身边)

该表的代码如下:

<s:if test="reportFilter.huntGroups!=null && reportFilter.huntGroups.size()>0">
    <s:iterator var="huntGroupVO" value="reportFilter.huntGroups" status="huntGroupKey">
      <tr <s:if test="#huntGroupKey.odd">class="oddRows"</s:if>>
        <td width="40px"><s:checkbox id="specHg_checkbox_%{#huntGroupKey.index}" name="reportFilter.selectedHuntGroups"  fieldValue="%{#huntGroupVO.phoneNumber}" value="%{reportFilter.selectedHuntGroups!=null && reportFilter.selectedHuntGroups.contains(#huntGroupVO.phoneNumber)?true:false}" theme="simple"></s:checkbox></td>
      <td>
        <s:if test="#huntGroupVO.phoneNumber.length()>0">
          <s:property value="#huntGroupVO.phoneNumber"/>
        </s:if>
        <s:else>
          <s:property value="#huntGroupVO.userGroupId"/>
        </s:else>
      </td>

      <td class="hntName"><s:property value="#huntGroupVO.name"></s:property></td>
    </tr>
  </s:iterator>
</s:if>

很明显,当我勾选复选框时,我将电话号码作为值传递。 问题是,我也想传递这个名字。

我知道我们可以使用连字符这样的电话号码传递它。

假设我有另一个变量ArrayList<String> hiddenName,我想填充与此变量中勾选复选框对应的名称。 (我正在考虑通过s:hidden参数)

如果听起来有些混乱,我道歉,但请帮忙!

1 个答案:

答案 0 :(得分:0)

显然,您只能在任何给定的表单字段中传递单个值。

您有许多选项,从简单使用字符串并将其拆分为两个值,通过中间传递ID并在Java中检索适当的值,到复杂自定义类型转换。

哪个最有意义取决于您的数据位置, 您的数据等等。


无关,但我发现JSP很难阅读。我会重构很多。以下是未经测试的,但更接近于我在代码审查后的预期。

<s:if test="reportFilter.showGroups">
  <s:iterator value="reportFilter.huntGroups" status="status">
    <tr>
      <td>
        <s:checkbox id="specHg_checkbox_%{#status.index}" theme="simple"
                    name="reportFilter.selectedHuntGroups" 
                    fieldValue="phoneNumber" 
                    value="%{reportFilter.hasNumber(phoneNumber)}" />
      </td>

      <td>
        <s:set var="num" value="${phoneNumber.length() > 0 ? phoneNumber : userGroupId" />
        <s:property value="#num"/>
      </td>

      <td class="hntName"><s:property value="name"/></td>
    </tr>
  </s:iterator>
</s:if>

注意事项:

  • 判断我们是否会显示用Java封装的组的逻辑。使测试更容易。
  • 迭代对象的合理,较短的名称:它是一个组(或huntGroup)。
  • 提取(电话号码||组ID)值,消除一堆JSP标记。
  • (理想情况下,逻辑将隐藏在Java中,无论是在VO中还是装饰器中。)
  • 迭代器标记将迭代对象推送到值堆栈,无需按名称直接引用它。这个有点不确定;这取决于你的需求。
  • 在现实生活中,我可能会将整个组内容放入单独的JSP或自定义标记中。