我正在将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 select标签实现类似的目的。
AFAIK,Struts2选择标记甚至无法与纯html选项标记一起正常工作。
实际上,Struts2 select标签不允许在option标签正文中使用html 标签。这是因为它使用list属性以具有键/值对的对象形式提供数据。您可以使用listKey和listValue定义对象的哪些属性将用于呈现选项。您可以查看《 UI标签参考指南》中的select标签。它具有许多属性,可让您自定义呈现html。
select
option
list
listKey
listValue
select标记的实际用法:很少使用。如果要显示固定大小的列表或在JSP中通过OGNL创建的地图,这将很有用。例如
<s:select label="Months" name="months" headerKey="-1" headerValue="Select Month" list="#{'01':'Jan', '02':'Feb', [...]}" value="selectedMonth" required="true" />
对于大列表,请考虑使用autocompleter小部件。您还可以使用自动完成程序作为选择框,或选择小部件作为自动完成程序。您可以在Struts2Jquery Showcase中看到的所有示例select和autocompleter小部件。
autocompleter
从Struts1迁移到Struts2时,您会遇到呈现呈现的htmlselect标签的问题,因为Struts2不允许在标签主体内使用选项。因此,可以通过prepare()操作方法来构造选项列表。您可以通过阅读此答案找到此用例的示例。
prepare()
为什么选择这种方法是可取的,因为您是 从控制器 而不是从视图中使用模型,并且当模型 准备 显示时,您正在使用一些标签或小部件来呈现html或填充DOM。或者,您可以使用Ajax或Angular服务从Struts2控制器加载模型。数据以JSON格式传输。JSON是在Java和JavaScript框架之间传输数据的非常强大的工具。
现在,如果您仍想使用地图select通过迭代器呈现html 标签,则可以使用以下代码。
<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变量。请参阅我们如何在框架中使用JSTL。