- Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 Map 对象:
步骤
- 实现接口:XxxAware(ApplicationAware,SessionAware,RequestAware,ParameterAware)
- 实现接口中的方法,这个方法将传进来相应的web资源属性对象(会被自动调用,依赖注入)
- 添加属性成员,接收传进来的web资源属性对象
- 使用属性成员
解耦方式访问web资源两种方法的选择
1.ActionContext:每次都需要获取(跨方法时)
2.XxxAware: 一次获取,多次使用(跨方法使用时,选用这个更好)
测试代码
TestAware.java
package top.itcourse.aware;
import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
/*
* 解耦方式访问web资源之Aware:
* 1. 实现接口:XxxAware(ApplicationAware,SessionAware,RequestAware,ParameterAware)
* 2.实现接口中的方法,这个方法将传进来相应的web资源属性对象(会被自动调用,依赖注入)
* 3.添加属性成员,接收传进来的web资源属性对象
* 4.使用属性成员
*/
/*
* 解耦方式访问web资源两种方法的选择:
* 1.ActionContext:每次都需要获取(跨方法时)
* 2.XxxAware: 一次获取,多次使用(跨方法使用时,选用这个更好)
*/
//1. 实现接口:XxxAware
public class TestAware implements ApplicationAware,SessionAware,RequestAware,ParameterAware{
// 3.添加属性成员,接收传进来的web资源属性对象
private Map<String, Object> applicationMap;
private SessionMap<String, Object> sessionMap;
// action方法,这个方法名(execute)是action节点的默认method值
public String execute() {
System.out.println("进入……");
// 4.使用属性成员
//①. 向application对象加入、读取一个属性
// 存入
applicationMap.put("keyAware", "application属性-Aware");
// 读取
if( applicationMap.get("keyJSP") != null ) {
System.out.println("application-keyJSP:" + applicationMap.get("keyJSP"));
}
//② 其它类似
//③ SessionMap的invalidate方法,使session失效
sessionMap.invalidate();
System.out.println("session失效了");
// 这个返回值(success)是result节点的默认name接受值
return "success";
}
// 2.实现接口中的方法,这个方法将传进来相应的web资源属性对象
// application
@Override
public void setApplication(Map<String, Object> application) {
this.applicationMap = application;
}
// parameters
@Override
public void setParameters(Map<String, String[]> parameters) {
// TODO Auto-generated method stub
}
// request
@Override
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
}
@Override
public void setSession(Map<String, Object> sessionMap) {
// 要强转一下,变成SessionMap
this.sessionMap = (SessionMap<String, Object>) sessionMap;
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">点击一下</a>
<br />
<!-- 读取application的属性(在Action中通过Aware方式设置的) -->
<c:if test="${applicationScope.keyAware != null }">
application-keyAware:
</c:if>
<c:out value="${applicationScope.keyAware }"></c:out>
<!-- 设置application的属性 -->
<c:if test="${applicationScope.keyJSP == null }">
<!-- value:属性值;var:属性名;scope:域范围 -->
<c:set value="application属性-JSP" var="keyJSP" scope="application"></c:set>
</c:if>
<br /><br />
<!-- 测试session失效的invalidate方法 -->
<%
/* 每次打印的对象的地址不同,就证明session失效了(session本会维持一次浏览器的开启到关闭不变) */
System.out.println(session);
%>
</body>
</html>
结果
其它
关注下方公众号,回复:解耦的访问方式web资源之Aware.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top