简介
- 为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据.
具体
- ActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了 Action 执行所需要的所有对象, 包括 parameters, request, session, application 等.
- 获取 HttpSession 对应的 Map 对象:
- public Map getSession()
- 获取 ServletContext 对应的 Map 对象:
- public Map getApplication()
- 获取请求参数对应的 Map 对象:
- public Map getParameters()
- 获取 HttpServletRequest 对应的 Map 对象:
- public Object get(Object key): ActionContext 类中没有提供类似 getRequest() 这样的方法来获取 HttpServletRequest 对应的 Map 对象. 要得到 HttpServletRequest 对应的 Map 对象, 可以通过为 get() 方法传递 “request” 参数实现
测试代码
TestActionContext.java
package top.itcourse.action.context;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
/**
* Action类
* @author mac
*/
/*
* 通过 ActionContext 访问 Web 资源
* 1.ServletContext的属性设置:
* 1.1.获取ActionContext对象:ActionContext.getContext()
* 1.2.获取ServletContext对象的Attribute的Map:调用ActionContext对象的getApplication方法
* 1.3.通过Map设置属性:put(key,value)
* 1.4.通过Map获取相应的属性:get(key)
*
* 2.Session类似。
*
* 3.request:
* 3.1.获取的时候是调用ActionContext对象的get("request")方法,并强转成Map
* 3.2.其它类似
*
* 4.请求参数
* 4.1.其它类似
* 4.2.调用ActionContext对象的getParameters方法
* 4.3.通过get方法获取参数数组(返回的是数组)
* 4.4.不能写入请求参数
*
* 说明:
* 都没有直接得到相关的对象,都是通过封装后的方法,去操作的部分方法(属性等)
*/
public class TestActionContext {
public TestActionContext() {
}
/*
* public class ActionContext extends Object implements Serializable:
* ActionContext是执行的Action的上下文。每个上下文基本上是一个对象的容器,一个操作需要执行,如会话,参数,区域设置等。
* ActionContext是线程本地的,这意味着存储在ActionContext中的值在每个线程中是唯一的。
* 这样做的好处是,您不需要担心用户特定的操作上下文,您只需获取它:
* ActionContext context = ActionContext.getContext();
* 最后,由于线程本地使用,您不需要担心使您的操作线程安全。
*/
// action方法:ok
public String save() {
/*
* public static ActionContext getContext():
* 返回特定于当前线程的ActionContext。
* 返回:
* 当前线程的ActionContext永远不为null。
*/
// 0.获取ActionContext对象
ActionContext actionContext = ActionContext.getContext();
/*
* public Map < String,Object > getApplication():
* 在servlet环境或通用应用程序级别Map中返回ServletContext的Map。
* 返回:
* 一个ServletContext或通用应用程序级的Map
* 源码:
* public Map<String, Object> getSession() {
* return (Map<String, Object>)get(SESSION);
* }
*/
// 1.获取application的Map,并向其中添加、获取属性
Map<String, Object> applicationMap = actionContext.getApplication();
// 获取内容,在jsp中通过application对象设置的
if (applicationMap.get("keyJSP") != null) {
System.out.println("application: " + applicationMap.get("keyJSP")); //get方法,获取属性值
}
//ServletContext中的get、set属性的方法,可以直接通过Map的get、put方法使用(没有办法)
applicationMap.put("keyAction", "Action类中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA).format(new Date())); // 在index页面去获取出来
// 2.获取session的Map,并向其中添加、获取属性
Map<String, Object> sessionMap = actionContext.getSession();
if (applicationMap.get("keyJSP") != null) {
System.out.println("session:" + sessionMap.get("keyJSP")); //get方法,获取属性值
}
sessionMap.put("keyAction", "Action类中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA).format(new Date())); // 在index页面去获取出来
// 3.获取request的Map,并向其中添加、获取属性(注意,request这里要强制转换)
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("keyAction", "Action类中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA).format(new Date())); // 在index页面去获取出来
// 4.获取请求参数对应的Map,并获取指定的参数值
Map<String, Object> parametersMap = actionContext.getParameters();
/*
* public HttpParameters getParameters()
* 在servlet环境中返回HttpServletRequest参数的映射,否则返回一般的Map参数。
* 返回:
* 在Servlet环境中使用HttpServletRequest参数或多部分映射的映射,或者其他参数的通用Map。
*/
// 这里get返回的都是一个String类型的数组
System.out.println("name: " + ((String[])parametersMap.get("name"))[1]); //只能读,不能写,但是写入不报错
return "ok";
}
}
index.jsp
<%@page import="java.util.Locale"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>2017</title>
<!-- 导入jQuery文件 -->
<script src="js/jquery-1.10.1.js" type="text/javascript" charset="utf-8"></script>
<!-- script书写位置 -->
<script type="text/javascript">
</script>
</head>
<body>
<a href="access.action?name=Mushroom&name=test">测试一下</a>
<br /><br />
<!-- application -->
<c:if test="${applicationScope.keyAction != null }">
<c:out value="application: "></c:out>
</c:if>
<!-- 如果value不是null,那么就显示value的值,否则就显示标签体的内容(这里就是空) -->
<!-- 结果:value (在Action类中通过application的Map设置的) -->
<c:out value="${applicationScope.keyAction }"></c:out>
<!-- 这里设置,在Action类中获取 -->
<%
if( application.getAttribute("keyJSP") == null ) {
application.setAttribute("keyJSP", "jsp中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日",Locale.CHINA).format(new Date()));
}
%>
<br /><br /><br />
<!-- session -->
<c:if test="${sessionScope.keyAction != null }">
<c:out value="session: "></c:out>
</c:if>
<c:out value="${sessionScope.keyAction }"></c:out>
<!-- 这里设置,在Action类中获取 -->
<%
if( session.getAttribute("keyJSP") == null ) {
session.setAttribute("keyJSP", "jsp中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日",Locale.CHINA).format(new Date()));
}
%>
<br /><br /><br />
<!-- request -->
<c:if test="${requestScope.keyAction != null }">
<c:out value="request: "></c:out>
</c:if>
<c:out value="${requestScope.keyAction }"></c:out>
<!-- 这里设置,在Action类中获取 -->
<%
if( request.getAttribute("keyJSP") == null ) {
request.setAttribute("keyJSP", "jsp中设置的我:" + new SimpleDateFormat("yyyy年MM月dd日",Locale.CHINA).format(new Date()));
}
%>
</body>
</html>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 这是struts.xml文件的模板 -->
<package name="default" extends="struts-default">
<action name="access" class="top.itcourse.action.context.TestActionContext" method="save">
<result name="ok">index.jsp</result>
</action>
</package>
</struts>
效果
其它
关注下方公众号,回复:Servlet API解耦的访问方式web资源.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top