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}

 

呵呵。刚开始也着实被这样古怪的问题所困扰,网上寻找了半天也没有找到有效的解决方案。不过毕竟车到山前必有路,多看看文档,多探索一下框架的机理,总归能找出解决的方案的:)

 

你可能感兴趣的:(html,框架,struts,文档,import,include)