新年的第一天,对programer来说,和往常相比并没有太大不同,代码照样敲。做了一天键盘侠,不见得有什么出彩的成就(其实一直以来似乎都是这样/(ㄒoㄒ)/~~),倒是被曾经绊住的问题再次绊住然后纠结地解决了,顺便复习了一下。问题就是在Struts2标签和Jsp的Java代码直接实现了变量相互引用。
情景1:有一个在valuestack里面有一个变量,而我们目标除了获得这个值之外,还可能会更改它的值,这个操作可能是通过webservice,service、dao等进行,而这些操作都要进行Java编码实现,这里为了简单起见,只是在Java代码里面或者这个变量,并且更改它的值。借用<s:set />标签以及Jsp的内置对象PageContext,具体如下:
首先定义Action
public class MyAction extends ActionSupport implements ServletRequestAware, ServletResponseAware { HttpServletRequest httpServletRequest; HttpServletResponse httpServletResponse;
//定义在valueStack的变量 String valueInValueStack; //省略setter和getterpublic String execute() throws Exception { try {
valueInValueStack = "default value in valueStack"; System.out.println("valueInValueStack = "+valueInValueStack); //输出:valueInValueStack = default value in valueStack return SUCCESS; } catch (Exception e) { e.printStackTrace(System.out); return ERROR; } } }
在struts.xml里面配置该action
<package name="test" extends="struts-default" namespace="/"> //定义struts2的action MyAction <action name="myAction" class="com.test.MyAction" method="execute"> <result name="success">/jsp/result.jsp</result> </action> </package>
定义MyAction的execute返回的页面result.js<%@ page contentType="text/html;charset=UTF-8" language="java" %<%@ taglib prefix="s" uri="/struts-tags" %<html>
<head> <title></title> </head> <body> <p> 原本处于valuestack里面的值:<s:property value="valueInValueStack"/>
//使用<s:set/>来定义一个名称为newVariable的变量,并且它的值取自于valueStack <s:set var="newVariable" scope="page" value="valueInValueStack"/> </p> <%
//在Jsp的内置对象pageContext取出该变量
String s = (String)pageContext.getAttribute("newVariable"); out.println("内嵌Java代码的值:"+s); s = "this is the newVariable, whose value is changed from valueStack"; //操作完成后,再次把该变量放置在pageContext里面,名称保持不变。如果想在request或者session范围获取到该变量,就要放置到对应的范围内
pageContext.setAttribute("newVariable", s); %> <p>
//通过ognl的attr来获取放置在pageContext的变量 更改后的值:<s:property value="%{#attr.newVariable}"/> </p> </body> </html>
真实的result如下:
在这过程中,起中转作用的是pageContext,pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。