小编典典

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

jsp

我正在将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选项标记一起正常工作。


阅读 266

收藏
2020-06-08

共1个答案

小编典典

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

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中看到的所有示例selectautocompleter小部件。

从Struts1迁移到Struts2时,您会遇到呈现呈现的htmlselect标签的问题,因为Struts2不允许在标签主体内使用选项。因此,可以通过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

2020-06-08