action 和 Action类
2.Action类 : 能够处理struts2请求的类
>必须有一个不带参的构造器
>至少有一个供struts在执行这个action时调用的方法
>同一个action类可以包含多个action方法
>struts2会为每一个HTTP请求创建一个新的action实例,即Action不是单例的,是线程安全的
在action中访问web资源
1.什么是web资源?
2.为什么访问web资源
3.如何访问
1. 和Servlet API 解耦的方式
>实现XxxAware接口
>使用ActionContext
--public Map getSession();
--public Map getApplication();
--public Map getParameters()
--public Object get(Objectkey):ActionContext类中没有提供类似getRequest()这样的方法来获取HttpServletRequest对应的Map对象。
public class TestActionContextAction {
public String execute(){
//0.获取ActionContext对象
//ActionContext是Action的上下文对象,可以从中获取到前Action需要的一切信息
ActionContext actionContext = ActionContext.getContext();
//1.获取application对应的Map,并向其中添加一个属性
//通过调用ActionContext对象的getApplication()方法来获取application对象
//设置属性
Map<String,Object> applicationMap = actionContext.getApplication();
applicationMap.put("applicationKey", "applicationValue");
//获取属性
Object date = applicationMap.get("date");
System.out.println("application:date:"+date);
//2.session
Map<String,Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
Object date2 = sessionMap.get("date");
System.out.println("session:date:"+date2);
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()方法,传入字符串来获取
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("parameters:"+parameters.get("name"));
//把值打印出来
System.out.println(((String[])parameters.get("name"))[0]);
return "success";
}
}
注意:session对应的Map实际上是SessionMap类型的,强转后调用其invalidate()方法,可以使其session失效>实现XxxAware接口
public class TestAwareAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware{
private Map<String , Object> application1;
@Override
public void setApplication(Map<String, Object> application) {
// TODO 自动生成的方法存根
this.application1 = application;
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO 自动生成的方法存根
}
@Override
public void setRequest(Map<String, Object> arg0) {
// TODO 自动生成的方法存根
}
@Override
public void setParameters(Map<String, String[]> arg0) {
// TODO 自动生成的方法存根
}
public String execute(){
//1.向application中加入一个属性:applicationKey2 - applicationValue2
application1.put("applicationKey2", "applicationValue2");
//2.从application中读取一个属性date,并打印。
System.out.println("applicationValue2:"+application1.get("applicationKey2"));
return "success";
}
}
好处:使用ActionContext每个方法需要获取多次getApplication,使用aware只用注入一次就可以了。选用建议:若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或parameters,则建议使用aware接口方式
2.和Servlet API 耦合的方式
>使用ServletActionContext
--ServletActionContext.getRequest();
2.直接获取HttpSession对象
--ServletActionContext.getRequest().getSession();
3.直接获取ServletContext对象
--ServletActionContext.getServletContext();
public String execute(){
HttpServletRequest request = ServletActionContext.getRequest();
// HttpSession session = request.getSession();
HttpSession session = ServletActionContext.getRequest().getSession();
ServletContext servletContext = ServletActionContext.getServletContext();
System.out.println("execute....");
return "success";
}
}
>实现ServletXxxAware接口
ServletRequestAware:注入HttpServletRequest对象
ServletContextAware :注入ServletContext对象
ServletResponseAware:注入HttpServletResponse对象(不常用)
public class TestServletAwareAction implements ServletRequestAware,ServletContextAware{
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO 自动生成的方法存根
System.out.println(request);
}
private ServletContext context;
@Override
public void setServletContext(ServletContext context) {
// TODO 自动生成的方法存根
System.out.println(context);
this.context = context;
}
public String execute(){
System.out.println("ServletContext: "+context);
return "success";
}
}
给出余下完整代码
<?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.wul.struts2_4.action.TestActionContextAction">
<result>/test-actionContext.jsp</result>
</action>
<action name="TestAware"
class="com.wul.struts2_4.action.TestAwareAction">
<result>/test-aware.jsp</result>
</action>
<action name="TestServletActionContext"
class="com.wul.struts2_4.action.TestServletActionContextAction">
<result>/success.jsp</result>
</action>
<action name="TestServletAware"
class="com.wul.struts2_4.action.TestServletAwareAction">
<result>/success.jsp</result>
</action>
</package>
</struts>
<%@ 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=wul">Test ActionContext</a>
<br><br>
<a href="TestAware.action?name=wul">Test Aware</a>
<br><br>
<a href="TestServletActionContext">TestServletActionContext</a>
<br><br>
<a href="TestServletAware">TestServletAware</a>
<%
if(application.getAttribute("date")==null)
application.setAttribute("date",new Date());
if(session.getAttribute("date")==null)
session.setAttribute("date","123");
%>
</body>
</html>
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 Pages</h4>
application : ${applicationScope.applicationKey }
session : ${sessionScope.sessionKey }
request : ${requestScope.requestKey }
</body>
</html>
<%@ 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 Pages</h4>
application : ${applicationScope.applicationKey }
session : ${sessionScope.sessionKey }
request : ${requestScope.requestKey }
</body>
</html>
test-aware.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 aware Pages</h4>
application : ${applicationScope.applicationKey2 }
</body>
</html>