一、什么是web资源?
httpservletrequest,httpsession,servletcontext等原生的servletAPI
二、为什么访问web资源?
B/S应用的controller中,必然需要访问web资源,比如读取cookie
三、如何访问?
I和servlet API解耦的方式:只能访问到有限的api对象,且只能访问有限的方法
>使用actioncontext
>实现XXXAware接口
II和servlet API耦合的方式:可以访问更多的servle API形象,并可以调用原生的方法
>使用servletActionContext
>实现ServletxxxAware接口
四、与Servlet API解耦的访问方式
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据
1、使用actionContext访问web资源
ActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了 Action 执行所需要的所有对象, 包括 parameters, request, session, application 等.
Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 Map 对象:
五、与 Servlet 耦合的访问方式
直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试.
1、直接获取 HttpServletRequest 对象:
六、选用建议
选用的建议: 若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware 接口的方式
httpservletrequest,httpsession,servletcontext等原生的servletAPI
二、为什么访问web资源?
B/S应用的controller中,必然需要访问web资源,比如读取cookie
三、如何访问?
I和servlet API解耦的方式:只能访问到有限的api对象,且只能访问有限的方法
>使用actioncontext
>实现XXXAware接口
II和servlet API耦合的方式:可以访问更多的servle API形象,并可以调用原生的方法
>使用servletActionContext
>实现ServletxxxAware接口
四、与Servlet API解耦的访问方式
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据
1、使用actionContext访问web资源
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” 参数实现
Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 Map 对象:
五、与 Servlet 耦合的访问方式
直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试.
1、直接获取 HttpServletRequest 对象:
- ServletActionContext.getRequest()直接获取 HttpSession 对象
- ServletActionContext.getRequest().getSession()直接获取 ServletContext 对象
- ServletActionContext.getServletContext()
六、选用建议
选用的建议: 若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware 接口的方式
session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效
七、实例工程代码
structs.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="TestActionContext" class="com.weixuan.structs03.TestActionContext">
<result>/test-actionContext.jsp</result>
</action>
<action name="TestAware" class="com.weixuan.structs03.TestAwareAction">
<result>/test-Aware.jsp</result>
</action>
<action name="TestServletActionContextAction"
class="com.weixuan.structs03.TestServletActionContextAction">
<result>/test-Tsac.jsp</result>
</action>
<action name="TestServletAware" class="com.weixuan.structs03.TestServletAwareAction">
<result>/test-Tsac.jsp</result>
</action>
</package>
</struts>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="TestActionContext.action?name=weixuan">Test ActionContext</a>
<%
if(application.getAttribute("date")==null)
application.setAttribute("date", new Date());
%>
<br>
<br>
<a href="TestAware.action?name=weixuan2">Test Aware</a>
<br>
<br>
<a href="TestServletActionContextAction.action">TestServletActionContextAction</a>
<br>
<br>
<a href="TestServletAware.action">TestServletAware</a>
</body>
</html>
package com.weixuan.structs03;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class TestActionContext {
public String execute() {
// 首先获取actionContext对象,是action的上下文对象,可以从中获取到当前action需要的一切信息
ActionContext actionContext = ActionContext.getContext();
/**
* 1、获取application对应的map,并向其中添加一个属性 2、获取session 3、request
* 4、获取请求参数对应的map,并获取指定的参数值
*/
Map<String, Object> applictionMap = actionContext.getApplication();
// 添加属性,这个属性可以在页面上被拿到
applictionMap.put("applicaionKey", "applictionValue");
// 获取属性
Object date = applictionMap.get("date");
System.out.println("date : " + date);
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
//没有getRequest方法,只能靠get函数传入"request"获取数据
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//获取请求参数,只能读,不能写入数据,但是写入数据不报错,但不得起作用
Map<String, Object> parametersMap = actionContext.getParameters();
//actionContext.getParameters()返回值是Map<String, Object>
String[] t =(String[])parametersMap.get("name");
parametersMap.put("age", 100);
System.out.println(t[0]);
return "success";
}
}
package com.weixuan.structs03;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class TestAwareAction implements ApplicationAware, SessionAware,
RequestAware, ParameterAware {
private Map<String, Object> application;
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, String[]> paramet;
public String execute() {
// 向application中加入一个属性
application.put("applicationKey2", "applicationValue2");
// application中读取属性
System.out.println(application.get("date"));
session.put("sessionKey2", "sessionValue2");
System.out.println(session.get("sessionKey")+" "+session.get("sessionKey2"));
return "success";
}
@Override
public void setApplication(Map<String, Object> application) {
// TODO Auto-generated method stub
this.application = application;
}
@Override
public void setParameters(Map<String, String[]> paramet) {
// TODO Auto-generated method stub
this.paramet = paramet;
}
@Override
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session = session;
}
}
package com.weixuan.structs03;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
public class TestServletActionContextAction {
public String execute() {
HttpServletRequest request = ServletActionContext.getRequest();
// HttpSession session = request.getSession();
HttpSession session = ServletActionContext.getRequest().getSession();
ServletContext servletcontext = ServletActionContext
.getServletContext();
return "success";
}
}
package com.weixuan.structs03;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;
public class TestServletAwareAction implements ServletRequestAware,
ServletResponseAware, ServletContextAware {
private ServletContext context;
private HttpServletResponse response;
private HttpServletRequest request;
@Override
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
System.out.println(context);
this.context = context;
}
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println(response);
this.response = response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
System.out.println(request);
this.request = request;
}
public String execute() {
return "success";
}
}