1

想象一下,您希望下面的 JSP 代码片段位于多个页面中,其中唯一不同的是传递给它的列表(xxx在示例中)。

<s:iterator value="%{#xxx}" var="module" status="stat">
  <s:property value="#module.name"/>            
</s:iterator>

我的第一个想法是将它放入myFragment.jsps:include在其他页面中使用以包含它,并将列表作为 传递s:param,例如:

<s:include value="/myFragment.jsp">
  <s:param name="xxx" value="%{#myModules}"></s:param>
</s:include>

问题是<s:param>似乎只传递字符串,所以上面的代码不起作用。

我也尝试过使用<s:set var="myParam">${param.xxx}</s:set>(并尝试放入myParam迭代器,但没有运气。

问题:

  1. 正确的方法是什么?

  2. 对于这种情况,您想通过将公共代码重构到统一位置来删除 JSP 中的代码重复,是否有更优雅的解决方案?

编辑(示例):

  • 您拥有Page1.jsp和的示例Page2.jsp。两者都使用非常相似s:iterator的 ,唯一的区别是传递给它的变量。目标是将 重构s:iterator到某个地方,以便您只编写一次。

s:iterator自然地,在现实生活中,除了要重构的代码之外,还有更多的代码。

Page1.jsp:

<s:action name="MyAction" var="xxx"></s:action>
<s:iterator value="%{#xxx}" var="module" status="stat">
  <s:property value="#module.name"/>            
</s:iterator>

Page2.jsp:

<s:iterator value="%{#variableFromStack.modules}" var="module" status="stat">
  <s:property value="#module.name"/>            
</s:iterator>
4

1 回答 1

0

我看不出有任何理由将参数传递给s:include标记。请注意,参数仅作为请求参数访问:

参数作为请求参数传递,因此使用${param.ParamName}符号来访问它们。不要使用s:property标签访问包含文件中的参数。


正确的方法是在valueStack.

优雅的解决方案是使用 Tiles 框架。

Tiles 是一个模板框架,旨在轻松创建具有一致外观和感觉的 Web 应用程序页面。它可以用于页面装饰和组件化


Tiles 2Tiles 3集成插件。

于 2016-03-10T11:39:33.937 回答