Struts2 ActionContext.getApplication()方法:获取Map类型的application对象

与获取 session 的方法相类似,ActionContext 对象同样为获取 Map 类型的 application 提供了单独的方法。

语法:

public Map getApplication()

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 = "C语言中文网";  //向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 页面,运行效果如下:

request范围内的info值:C语言中文网
session范围内的info值:C语言中文网
application范围内的info值:C语言中文网

虽然 TestAction 的处理成功,结果返回 success.jsp 页面,但由于 Struts2 默认返回结果的类型是请求转发,而不是重定向,所以,浏览器地址栏中依然为 "testAction.action",而不是  "success.jsp"。

我们知道 request 的作用范围在两个页面之中,当再次打开其他页面后,request 的生命周期结束。此时,将浏览器地址栏中的 "testAction.action" 更改为 "success.jsp" 单击“转到”按钮后,由于浏览器已经打开了第三个页面,所以,request 的生命周期结束,可以看到 request 对象中的 info 属性值为 "null",如下所示。

request范围内的info值:null
session范围内的info值:C语言中文网
application范围内的info值:C语言中文网

session 的生命周期位于整个 session 之中,只有在 session 超时或浏览器关闭时,session 的生命周期才会结束,此时,重新打开一个浏览器,并在浏览器地址栏中输入 success.jsp 页面的访问地址,验证 session 生命周期,如下所示: session 的生命周期结束,session 范围内的 info 值为 "null"。

request范围内的info值:null
session范围内的info值:null
application范围内的info值:C语言中文网

虽然 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 容器运行,方便测试程序。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/22863.html

(0)
上一篇 2021年7月20日 10:55
下一篇 2021年7月20日 10:55

相关推荐

发表回复

登录后才能评论