WEB资源:
HttpServletRquest,HttpServletSession,Cookie等,原生Servlet API
Servlet访问WEB资源的方式
Servlet API解耦的方式(只能访问到有限的Servlet API对象和方法)
>使用ActionContext
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
public class TestActionContextAction {
public String execute(){
//0. 获取 ActionContext 对象
//ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息
ActionContext actionContext = ActionContext.getContext();
//1. 获取 application 对应的 Map, 并向其中添加一个属性
//通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象
Map<String, Object> applicationMap = actionContext.getApplication();
//设置属性
applicationMap.put("applicationKey", "applicationValue");
//获取属性
Object date = applicationMap.get("date");
System.out.println("date: " + date);
//2. session
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
System.out.println(sessionMap.getClass());
if(sessionMap instanceof SessionMap){
SessionMap sm = (SessionMap) sessionMap;
sm.invalidate();
System.out.println("session 失效了. ");
}
//3. request*
//ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map
//需要手工调用 get() 方法, 传入 request 字符串来获取.
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//4. 获取请求参数对应的 Map, 并获取指定的参数值.
//键: 请求参数的名字, 值: 请求参数的值对应的字符串数组
//注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]>
// 2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!
Map<String, Object> parameters = actionContext.getParameters();
System.out.println(((String[])parameters.get("name"))[0]);
parameters.put("age", 100);
return "success";
}
}
其中 actionContext 是也是一个Map类型,将request 、 response 放在了value中,因此可知通过键值对的方式调用request和response,如:actionContext.get("request")
前台页面通过EL表达式获取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
有四个隐含对象:applicationScope,sessionScope,requestScope,pageScope.
与application,session,request,pageContext相对应.例如applicationScope用来获取application范围的属性值
-->
<h4>Test ActionContext Page</h4>
application : ${applicationScope.applicationKey }
<br><br>
session: ${sessionScope.sessionKey }
<br><br>
request: ${requestScope.requestKey }
<br><br>
age: ${parameters.age }
</body>
</html>
>实现XxxAware接口(类似依赖注入)
1.重写setXxxx(Map Xxxx)方法
2. 设置Xxxx属性
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{
public String execute(){
//1. 向 application 中加入一个属性: applicationKey2 - applicationValue2
application.put("applicationKey2", "applicationValue2");
//2. 从 application 中读取一个属性 date, 并打印.
System.out.println(application.get("date"));
return "success";
}
public String save(){
return null;
}
private Map<String, Object> application;
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public void setParameters(Map<String, String[]> parameters) {
}
@Override
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
}
@Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
}
}
若在一个Action类中有多个action方法则建议选用实现XxxAware接口的方式
小细节:sessionse对应的Map是sessionMap类型的, sessionMap.invalidate()可以使session失效
Servlet API耦合的方式(访问更多API,调原生方法)
>使用ServletActionContext
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
public class TestServletActionContext {
/**
* 直接获取 HttpServletRequest 对象==》 常用
* ServletActionContext.getRequest()
* 直接获取 HttpSession 对象== 》常用
* ServletActionContext.getRequest().getSession()
* 直接获取 ServletContext 对象== 》较为常用
* ServletActionContext.getServletContext()
* 直接获取 HttpServletResponse 对象== 》不常用
* ServletActionContext.getResponse()
*/
ServletContext servletActionContext=ServletActionContext.getServletContext();
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=ServletActionContext.getRequest().getSession();
}
>实现ServletXxxAware接口
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.util.ServletContextAware;
public class TestServletAware implements ServletContextAware, ServletRequestAware, ServletResponseAware {
/**
* 实现三个Aware接口
* 必须要添加execute方法
*/
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
}
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
}
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
}
public String execute() {
return "success";
}
}