新年的第一天,對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對象可以通過訪問這個對象的屬性來導出。