struts2 include标签传入参数的调用 收藏
最近用Struts2框架开发一个项目。为保证页面代码美观,想把那些高度模式化的代码归并到同一个jsp中,然后利用标签初始化调用。
不过遇到一个问题。就是当利用Struts2的 <s:include>标签在主页面引用子页面时,通过<s:param/>标签传入的值在子页面中无法获取:
主页面:
<s:include value="./pair_ticket.jsp">
<s:param name="operation" value="'active'"></s:param>
</s:include>
pair_ticket.jsp是被引用的页面。但是如果在pair_ticket.jsp中利用
<s:property value="#request.operation"/>
或是<s:property value="operation"/>
或是<s:property value="%{#attr.operation}"/>
都无法获得从主页面中传过来的值。
看了Struts2的文档,说是由于include不会更新valueStack的缘故,所以ognl无法从valueStack中获取。同时文档介绍使用jstl可以在页面中获取:
${param.operation}
尝试过以后,发现果不其然。不过由于本人的子页面中充斥着大使用ognl的Struts2标签,而Struts2标签中又无法嵌套jstl标签或el表达式。所以这样无异于要求我重写页面代码,将所有需要变量的地方用html标签重写,这个哪里受得了?!
思量许久,突然想到,既然引入的时候,Struts2不会设置valueStack,为何不自己亲手设置?
因为文档中提到虽然ognl不能使用,但是jstl和scriptlet依然有效。于是子在页面开头写下如下代码:
<%@page import="com.opensymphony.xwork2.ognl.OgnlValueStack"%>
<%
((OgnlValueStack) request.getAttribute("struts.valueStack")).set(
"operation", request.getParameter("operation"));
%>
第一个伪指令引入了ognl所要使用的valueStack包,接下来scriptlet中的两句将主页面通过request传过来的参数,直接设置到valueStack中。
于是页面中的Struts2标签就可以使用变量了:
<s:submit id="%{operation}" value="%{getText('label.pair.'+operation)}" />
甚至还可以使用功能强大的ognl表达式做字符串拼接:
<s:textarea name="ticket.comment" id="%{operation+'_comment'}">
如果遇到普通的html标签,或者只是页面显示,那么就使用el语言:
${param.operation}
呵呵。刚开始也着实被这样古怪的问题所困扰,网上寻找了半天也没有找到有效的解决方案。不过毕竟车到山前必有路,多看看文档,多探索一下框架的机理,总归能找出解决的方案的:)
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/james_wu_shanghai/archive/2009/03/29/4034739.aspx