原文地:https://blog.csdn.net/qq_36901488/article/details/82313090
新建动态web项目:
在src
中新建包名为:com.atguigu.struts2.action
:
在里面新建一个类:
package com.atguigu.struts2.action;
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";
}
}
WebContent
中新建一个index.jsp
页面:
<%@page import="java.util.Date"%>
<%@ 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>
<a href="TestActionContext.action?name=atguigu">Test ActionContext</a>
<%
if(application.getAttribute("date") == null)
application.setAttribute("date", new Date());
request.setAttribute("req", "reqvalue");
%>
</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>
<package name="default" namespace="/" extends="struts-default">
<action name="TestActionContext"
class="com.atguigu.struts2.action.TestActionContextAction">
<result name="success">/test-actionContext.jsp</result>
</action>
</struts>
WebContent
中新建一个 test-actionContext.jsp
页面:
<%@ 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>
<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>
ction
VS Action
类
- action: 代表一个 Struts2 的请求.
- Action 类: 能够处理 Struts2 请求的类.
- 属性的名字必须遵守与
JavaBeans
属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生 - 必须有一个不带参的构造器: 通过反射创建实例
- 至少有一个供
struts
在执行这个action
时调用的方法 - 同一个
Action
类可以包含多个action
方法. Struts2
会为每一个HTTP
请求创建一个新的Action
实例, 即Action
不是单例的, 是线程安全的.
- 属性的名字必须遵守与
在 Action
中访问 WEB
资源:
- 什么是
WEB
资源 ?HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。
- 为什么访问
WEB
资源?B\S
的应用的Controller
中必然需要访问WEB
资源: 向域对象中读写属性, 读写Cookie
, 获取realPath
….
- 如何访问 ?
- 和
Servlet API
解耦的方式: 只能访问有限的Servlet API
对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使session
失效…).- 使用
ActionContext
- 实现
XxxAware
接口 - 选用的建议: 若一个
Action
类中有多个action
方法, 且多个方法都需要使用域对象的Map
或parameters
, 则建议使用Aware
接口的方式 session
对应的Map
实际上是SessionMap
类型的! 强转后若调用其invalidate()
方法, 可以使其session
失效!
- 使用
- 和
Servlet API
耦合的方式: 可以访问更多的Servlet API
对象, 且可以调用其原生的方法.- 使用
ServletActionContext
- 实现
ServletXxxAware
接口
- 使用
- 和