Struts2 select 标签 - 动态添加选项

Struts2 select tag - Dynamically add options

我正在努力将 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>

它检查迭代器中的值,如果满足条件,则动态地将选项添加到 select 列表。

如何使用 Struts2 select 标签实现类似的效果。

AFAIK,Struts2 select 标签甚至无法与普通 html 选项标签一起正常工作。

实际上 Struts2 select 标签不允许在标签正文中使用 html option 标签。这是因为它使用 list 属性以具有 key/value 对的对象形式提供数据。您可以使用 listKeylistValue 来定义对象的哪些属性将用于渲染选项。您可以查看 UI Tags Reference Guide for 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 widget. You can also use an autocompleter as select box or select widget as autocompleter. All examples of select and autocompleter widgets you can see in Struts2 Jquery Showcase

从 Struts1 迁移到 Struts2 时,您遇到了呈现 html select 标签的问题,因为 Struts2 不允许选项在标签的主体内。因此,可以在操作的 prepare() 方法中构建选项列表。您可以通过阅读 this answer.

找到此用例的示例

为什么这种方法更可取,因为您使用来自控制器的模型,而不是来自视图,并且当模型准备就绪时[=48] =] 来显示您正在使用一些标签或小部件来呈现 html 或填充 DOM。或者您可以使用 Ajax 或 Angular 服务从 Struts2 控制器加载模型。数据以 JSON 格式传输。 JSON 是在 Java 和 Java 脚本框架之间传输数据的非常强大的工具。


现在如果你还想使用地图通过迭代器渲染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 请求包装器,用于预先 select 选项的 EL 表达式应该可以访问 valueStack 变量。参见 How we use JSTL with the framework