您的位置:首页 > 编程语言 > Java开发

Struts2--Action详述

2016-05-17 20:35 417 查看

action 和 Action类

1.action :代表一个struts2的请求

2.Action类 : 能够处理struts2请求的类

>属性的名字必须遵守与javabean属性名相同的命名规则,属性的类型可以是任意类型。从字符串到非字符串(基本数据类型)之间的数据转换可以自动发生

>必须有一个不带参的构造器

>至少有一个供struts在执行这个action时调用的方法

>同一个action类可以包含多个action方法

>struts2会为每一个HTTP请求创建一个新的action实例,即Action不是单例的,是线程安全的

在action中访问web资源

1.什么是web资源?

HttpServletRequest , HttpSession , ServletContext 等原生的Servlet API。

2.为什么访问web资源

B/S的应用的Controller 中必然需要访问WEB资源:向域对象中读取属性,读写Cookie,获取realPath.......。

3.如何访问

1. 和Servlet API 解耦的方式

只能访问有限的Servlet API对象,且只能访问其有限的方法(读取请求参数,读取域对象属性,使session失效.....)

>使用ActionContext

>实现XxxAware接口

>使用ActionContext
为了避免与Servlet API 耦合在一起,方便Action做单元测试,Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,
构造了3个Map对象来替代这3个对象,在Action中可以直接使用HttpServletRequest,HttpSession,ServletContext对应的Map对象来保存和读取数据。
(原Servlet API中HttpServletRequest,HttpSession和ServletContext的核心方法即是使用了一个Map,在这Action直接使用该Map)

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(Objectkey):ActionContext类中没有提供类似getRequest()这样的方法来获取HttpServletRequest对应的Map对象。
要得到HttpServletRequest对应的Map对象,可以通过为get()方法传递“request”参数实现。

TestActionContextAction.java

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接口

TestAwareAction.java

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 耦合的方式

可以访问更多Servlet API对象,且可以调用其原生的方法。直接访问Servlet API 将使Action与Servlet环境耦合在一起,
测试时需要有Servlet容器,不便于对Action的单元测试

>使用ServletActionContext

>实现ServletXxxAware接口

>使用ServletActionContext
ServletActionContext:可以从中获取到当前Action,对象需要的一切Servlet API相关的对象。

1.直接获取HttpServletRequest对象;

--ServletActionContext.getRequest();

2.直接获取HttpSession对象

--ServletActionContext.getRequest().getSession();

3.直接获取ServletContext对象

--ServletActionContext.getServletContext();

TestServletActionContextAction.java

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接口
通过实现ServletXxxAware 接口的方式可以由struts2注入需要的Servlet相关的对象

ServletRequestAware:注入HttpServletRequest对象

ServletContextAware :注入ServletContext对象

ServletResponseAware:注入HttpServletResponse对象(不常用)

TestServletAwareAction.java

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";
}

}


给出余下完整代码



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.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>

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=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>


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 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息