Struts2选择标记 - 动态添加选项

时间:2016-05-25 20:18:15

标签: jsp struts2 struts

我正在努力将Struts1项目迁移到Struts2。我遇到了以下一段代码。

<html:select ...>
  <logic:iterate id="something" name="" type="">
    <logic:equal name="something" property="" value="">
      <html:option value=""><bean:write ... /></html:option>
    </logic:equal>
  </logic:iterate>
</html:select>

它检查迭代器中的值,并在满足条件时动态地向选择列表添加选项。

如何使用Struts2选择标记实现类似的功能。

AFAIK,Struts2选择标记甚至无法使用普通的html选项标记。

1 个答案:

答案 0 :(得分:1)

确实Struts2 select标记不允许在标记正文中使用html option标记。这是因为它使用list属性以具有键/值对的对象的形式提供数据。您可以使用listKeylistValue来定义对象的哪些属性将用于呈现选项。您可以查看select代码的UI代码参考指南。它有许多属性,允许您自定义渲染html。

选择标签的实际用法:它很少使用。如果要在JSP中显示固定大小列表或通过OGNL创建的映射,这很有用。例如

<s:select label="Months"
       name="months"
       headerKey="-1" headerValue="Select Month"
       list="#{'01':'Jan', '02':'Feb', [...]}"
       value="selectedMonth"
       required="true"
/>    

对于大型列表,请考虑使用autocompleter小部件。您还可以将自动填充程序用作选择框,或选择窗口小部件作为自动填充程序。您可以在Struts2 Jquery Showcase中看到selectautocompleter小部件的所有示例。

从Struts1迁移到Struts2时,您遇到了呈现渲染的html select标记的问题,因为Struts2不允许在标记正文中使用选项。因此,可以在操作的prepare()方法中构建选项列表。您可以通过阅读this answer找到此用例的示例。

为什么这种方法更受欢迎,因为您使用控制器中的模型,而不是从视图中工作,当模型准备就绪时显示您正在使用某些方法用于呈现html或填充DOM的标记或小部件。或者您可以使用Ajax或Angular服务从Struts2控制器加载模型。数据以JSON格式传输。 JSON是在Java和JavaScript框架之间传输数据的非常强大的工具。

现在,如果您仍想使用地图通过迭代器呈现html select标记,则可以使用以下代码。

<select id="monthId" name="form.monthId">
  <s:iterator var="month" value="%{months}">
    <s:if test="month.value != 'May'">
      <option value="${month.key}" ${month.key == form.monthId?'selected="selected"':''}>
        <s:property value="%{month.value}"/>
      </option>
    </s:if>
   </s:iterator>
</select>

注意,由于Struts请求包装器,用于预选选项的EL表达式应该可以访问valueStack变量。请参阅How we use JSTL with the framework