与获取 session 的方法相类似,ActionContext 对象同样为获取 Map 类型的 application 提供了单独的方法。
语法:
ActionContext 类的 getApplication() 方法返回的是 Map 对象,这个 Map 对象的范围将作用于 ServletContext 范围之中。
本示例应用 getApplication() 方法获取 Map 类型的 application,关键代码如下:
//Map类型的application
private Map<String,Object>application; //获取Map类型的application
application = context.getApplication();
创建 Web 项目,通过 ActionContext 对象获取 Map 类型的 request、session、application 分别为这 3 个对象设置一个 info 属性并赋值,然后在 JSP 页面中验证 info 属性的作用域。
在 web.xml 文件中注册 Struts2 提供的过滤器,类名为 org.apache.struts2.dispatcher.ng.filter.StrutsPrepare AndExecuteFilter,关键代码如下:
<!--Struts2过滤器-->
<filter>
<!--过滤器名称-->
<filter-name>struts2</filter-name>
<!--过滤器类-->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilt
er</filter-class>
</filter>
<!--Struts2过滤器映射-->
<filter-mapping>
<!--过滤器名称-->
<filter-name>struts2</filter-name>
<!--过滤器映射-->
<url-pattern>/*</url-pattern>
</filter-mapping>
创建名为 TestAction 的类,此类继承于 ActionSupport 类,是一个 Action 对象。在这个类中分别创建 Map 类型的 request、session、application 并在 execute() 方法中对其进行操作,关键代码如下:
package com.lyq.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/**
*@author zs
*Map类型的request、session、application
*/
public class TestAction extends ActionSupport{
private static final long serialVersionUID = 1L; //Map类型的request
private Map<String,Object>request; //Map类型的session
private Map<String,Object>session; //Map类型的application
private Map<String,Object>application; //构造方法
@SuppressWarnings("unchecked")
public TestAction(){ //获取ActionContext对象
ActionContext context = ActionContext.getContext(); //获取Map类型的request
request = (Map<String,Object>)context.get("request"); //获取Map类型的session
session = context.getSession(); //获取Map类型的application
application = context.getApplication();
}/**
*请求处理方法
*@return String
*/
public String execute()throws Exception{ //字符串信息
String info = "城东书院"; //向request添加信息
request.put("info",info); //向session添加信息
session.put("info",info); //向application添加信息
application.put("info",info); //成功返回
return SUCCESS;
}
}
在 TestAction 类中创建了 Map 类型的 request、session、application 的属性,并在 TestAction 类的构造方法中对其进行实例化,在 TestAction 类的构造方法中,首先通过 ActionContext 自身实例化一个 ActionContext 实例,然后通过这个实例对象创建获取 Map 类型的 request 对象、session 对象、application 对象。
技巧:本示例在定义 Map 类型的 request 属性时使用了泛型,由于 ActionContext.getContext() 的返回值并不与示例中定义的相一致,所以,开发工具会在"(Map<String,Object>)context.get("request")"代码处提示警告信息。由于这些警告并不是错误,此时,可以通过 "@SuppressWarnings("unchecked")" 代码忽略这些警告。
在请求处理 execute() 方法中,本示例定义了一个字符串对象 info,然后将这个对象存储到 Map 类型的 request 属性、session 属性、application 属性中,其赋值方式通过 Map 对象的 key 与 value 进行赋值,在赋值后返回 SUCCESS。
在 Web 项目的源码文件夹(MyEclipse 中默认为 src 目录)中创建名为 struts.xml 的配置文件,在此配置文件中配置 TestAction,关键代码如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode"value="true"/>
<!--声明包-->
<package name="myPackage"extends="struts-default">
<!--定义action-->
<action name="testAction"class="com.lyq.action.TestAction">
<!--处理成功的映射页面-->
<result>success.jsp</result>
</action>
</package>
</struts>
配置文件 struts.xml 的配置非常简单,将 TestAction 的 URL 映射为 "testAction",其处理成功的返回结果将映射到 success.jsp 页面。创建 TestAction 处理成功的返回页面 success.jsp,在此页面中分别从 JSP 内置对象 request、session、application 中获取 info 属性的值,并将这些值输出到 JSP 页面中,关键代码如下:
<body>
request范围内的info值:
<font color="red"><%=request.getAttribute("info"));%></font>
<br>
session范围内的info值:
<font color="red"><%=session.getAttribute("info"));%></font>
<br>
application范围内的info值:
<font color="red"><%=application.getAttribute("info"));%></font>
<br>
</body>
说明:可以使用 getAttribute() 方法从 JSP 内置对象 request、session、application 中获取信息。
创建程序的首页 index.jsp,在此页面中编写一个超级链接,将这个超级链接指向 testAction,关键代码如下:
<body>
<a href="testAction.action">Map类型的request、session、application</a>
<br>
</body>
运行示例后,进入程序首页index.jsp。
单击页面中的“Map 类型的 request、session、application”超级链接后,请求交给 TestAction 进行处理,在处理后返回 success.jsp 页面,运行效果如下:
虽然 TestAction 的处理成功,结果返回 success.jsp 页面,但由于 Struts2 默认返回结果的类型是请求转发,而不是重定向,所以,浏览器地址栏中依然为 "testAction.action",而不是 "success.jsp"。
我们知道 request 的作用范围在两个页面之中,当再次打开其他页面后,request 的生命周期结束。此时,将浏览器地址栏中的 "testAction.action" 更改为 "success.jsp" 单击“转到”按钮后,由于浏览器已经打开了第三个页面,所以,request 的生命周期结束,可以看到 request 对象中的 info 属性值为 "null",如下所示。
session 的生命周期位于整个 session 之中,只有在 session 超时或浏览器关闭时,session 的生命周期才会结束,此时,重新打开一个浏览器,并在浏览器地址栏中输入 success.jsp 页面的访问地址,验证 session 生命周期,如下所示: session 的生命周期结束,session 范围内的 info 值为 "null"。
虽然 request 与 session 中的值都变成了 "null",但 application 中的值依然存在,原因是由于 application 的生命周期作用于服务器应用之中,只有 Web 服务在重启或关闭的情况下它的生命周期才会结束。
从上面这个示例可以看出,Struts2 中所使用 Map 类型的 request 对象、session 对象与 application 对象能够与 Servlet API 进行交互,而且经过 Struts2 的内部处理,它的 Servlet API 中的 HttpServletRequest、HttpSession 与 ServletContext 是同步的。
技巧:在应用 Struts2 的项目开发之中,尽量使用 Struts2 中提供的 Map 类型的 request 对象、session 对象与 application 对象,原因是它与 Servlet API 是一种松耦合的状态,可以独立于 Web 容器运行,方便测试程序。