我正在努力将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选项标记。
答案 0 :(得分:1)
确实Struts2 select
标记不允许在标记正文中使用html option
标记。这是因为它使用list
属性以具有键/值对的对象的形式提供数据。您可以使用listKey
和listValue
来定义对象的哪些属性将用于呈现选项。您可以查看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中看到select
和autocompleter
小部件的所有示例。
从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。