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

问题描述 投票:1回答:1

我正在努力将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 select标签甚至无法使用普通的html选项标签。

jsp struts2 struts
1个回答
1
投票

确实Struts2 select标签不允许在标签的正文中使用html option标签。这是因为它使用list属性以具有键/值对的对象的形式提供数据。您可以使用listKeylistValue来定义对象的哪些属性将用于渲染选项。您可以看到select标签的UI标签参考指南。它有许多属性,允许您自定义渲染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小部件。您还可以将自动填充程序用作选择框,或选择窗口小部件作为自动填充程序。你可以在select看到所有autocompleterStruts2 Jquery Showcase小部件的例子。

从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

© www.soinside.com 2019 - 2024. All rights reserved.