Struts2标签与Jsp的嵌入Java代码之间的变量相互引用

  新年的第一天,对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和getter
public 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对象可以通过访问这个对象的属性来导出。

posted @ 2016-01-05 01:09  麦香小瑜儿  阅读(4328)  评论(0编辑  收藏  举报