作者:YOYO看天下光_915 | 来源:互联网 | 2023-06-02 00:51
最近用Struts2框架开发一个项目。为保证页面代码美观,想把那些高度模式化的代码归并到同一个jsp中,然后利用标签初始化调用。不过遇到一个问题。就是当利用Struts2的<s
最近用Struts2框架开发一个项目。为保证页面代码美观,想把那些高度模式化的代码归并到同一个jsp中,然后利用标签初始化调用。
不过遇到一个问题。就是当利用Struts2的 标签在主页面引用子页面时,通过标签传入的值在子页面中无法获取:
主页面:
pair_ticket.jsp是被引用的页面。但是如果在pair_ticket.jsp中利用
或是
或是
都无法获得从主页面中传过来的值。
看了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标签就可以使用变量了:
甚至还可以使用功能强大的ognl表达式做字符串拼接:
如果遇到普通的html标签,或者只是页面显示,那么就使用el语言:
${param.operation}
呵呵。刚开始也着实被这样古怪的问题所困扰,网上寻找了半天也没有找到有效的解决方案。不过毕竟车到山前必有路,多看看文档,多探索一下框架的机理,总归能找出解决的方案的:)