一.解耦方式
特點:對web資源進行了封裝,便於單元測試。
實現:ActionContext和接口方式
1.ActionContext
特點:Action執行的上下文對象。保存了執行Action所需要的所有對象
使用:1.獲取ActionContext 2.獲取application,session。request,parameter資源 3.打印顯示
1.獲取ActionContext
ActionContext.getContext()
調用自身的靜態方法得到實例
采用的是單例模式
可以再次放入新的鍵值對,put()



2.session的同application。
3.獲取request資源
得到封裝request的集合
不能訪問得到集合之前的request的屬性值
可以使用put()放入新的鍵值對

4.直接獲取傳遞的參數getParameters
object是String[]類型,為了接收同名的不同參數,使用put放入新值無效

2.接口方式
特點
實現接口方法,由Struts2自動放入web資源
不需要重復獲取
注意:該類要繼承ApplicationAware ,SessionAware, RequestAware,ParameterAware。
必須有相對應的私有map集合的屬性
實現以上四種借口的方法

訪問讀取

<%@ 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>
添加測試用的web資源
<%
application.setAttribute("app1", "測試的application");
session.setAttribute("set1", "測試的session");
request.setAttribute("req1", "測試的request");
%>
<br>
<a href="testAction?user=sb&user=tom">測試Action類訪問web資源</a>
<br><br>
<a href="testActionAware?user=sb&user=tom">以Aware方式測試Action類訪問web資源</a>
</body>
</html>
<?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> <!-- 覆蓋默認的過濾的擴展名 --> <constant name="struts.action.extension" value="do,action,,"></constant> <!-- 定義包 --> <package name="text" extends="struts-default" > <action name="testAction" class ="com.hanqi.action.TestAction" method="testWeb"> <result type="redirect" name="success">test.jsp</result> </action> <!-- 解耦的接口方式 --> <action name="testActionAware" class="com.hanqi.action.TestActionAware" method="testAware"> <result>test.jsp</result> </action> </package> </struts>
解耦方式
package com.hanqi.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class TestAction {
//解耦方式
//封裝了web資源
//使用ActionContext
public String testWeb()
{
//訪問web資源
System.out.println("經過了Action");
//單利模式
//Action實例的上下文對象
ActionContext ac = ActionContext.getContext();
//1.獲取application資源
Map<String, Object> mapApp = ac.getApplication();
System.out.println("app1="+mapApp.get("app1"));
//放入新的鍵值對
mapApp.put("app2", "新放入的application");
//2.獲取session資源
Map<String, Object> mapses = ac.getSession();
System.out.println("set1="+mapses.get("set1"));
//放入新的session
mapses.put("set2", "放入的新的session");
//清除
mapses.remove("set1");
//3.獲取request資源
Map<String, Object> mapReq = (Map<String, Object>)ac.get("request");
System.out.println("req1="+mapReq.get("req1"));//不能獲取之前的request屬性
//可以放入新的
mapReq.put("req2", "放入的新的request");
//4.直接獲取傳遞的參數
Map<String, Object> mapPer = ac.getParameters();
//參數值被封裝成String[]
String [] str = (String[])mapPer.get("user");
for(String t : str)
{
System.out.println("user="+t);
}
//放入新的參數,不能被獲取到
mapPer.put("pw",new String[]{"123456"});
return "success";
}
}
接口方式
package com.hanqi.action;
import java.util.Map;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
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 TestActionAware implements ApplicationAware ,
SessionAware, RequestAware,ParameterAware{
private Map<String, Object> mapApp;
private Map<String, Object> mapses;
private Map<String, Object> mapReq;
private Map<String, String[]> mappar;
//實現ApplicationAware接口的方法
//提供給Struts2 進行調用,放入Application的數據集合
@Override
public void setApplication(Map<String, Object> arg0) {
// 接收
mapApp =arg0;
}
public String testAware()
{
//訪問application
System.out.println("app1="+mapApp.get("app1"));
mapApp.put("app2","以Aware方式放入的application");
//訪問session
System.out.println("set1="+mapses.get("set1"));
mapses.put("set2", "以Aware方式放入的session");
//訪問request
System.out.println("req1="+mapReq.get("req1"));
mapReq.put("req2", "以Aware方式放入的request");
//訪問parameter
String [] str =mappar.get("user");
for(String t : str)
{
System.out.println("user="+t);
}
mappar.put("pw", new String[]{"1234"});
return "success";
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO 自動生成的方法存根
mapses = arg0;
}
@Override
public void setRequest(Map<String, Object> arg0) {
mapReq=arg0;
}
@Override
public void setParameters(Map<String, String[]> arg0) {
//
mappar=arg0;
}
}
<%@ 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>
顯示application的屬性
<br>
app1=${app1}
<br>
app2=${applicationScope.app2}<br><br>
顯示session的屬性<br>
set1=${set1 }
<br>
set2=${sessionScope.set2}
<br><br>
顯示request對象<br>
req1=${req1 }
<br>
req2=${req2}<br>
<br><br>
<%
out.println("set2===="+session.getAttribute("set2"));
String user = request.getParameter("user");
out.print("<br>user="+user);
String pw =request.getParameter("pw");
out.print("<br>pw="+pw);
%>
</body>
</html>



二。耦合方式
特點:
獲取原生的web資源
必須在Servlet容器的支持
1.ServletActionContext方式
特點:提供了靜態方法,獲得原生的資源
getServletContex()
得到原生的ServletContext
相當於內置對象application
getRequest()
得到原生的HttpServletRequest getSession() getParameter(參數名)
不能得到之前的request屬性值

package com.hanqi.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
public class TestServletAction {
public String testServletAction()
{
//訪問原生的web資源
//1得到Servletcontext,根據與application
ServletContext sc = ServletActionContext.getServletContext();
System.out.println("app1="+sc.getAttribute("app1"));
sc.setAttribute("app2", "原生方式放入的內容");
//2.訪問session
HttpServletRequest hsr = ServletActionContext.getRequest();
HttpSession hs = hsr.getSession();
System.out.println("set1="+hs.getAttribute("set1"));
hs.setAttribute("set2", "原生方式放入的內容session");
//3.訪問request
System.out.println("req1="+hsr.getAttribute("req1"));
hsr.setAttribute("req2", "原生方式放入的request");
//4.訪問parameter
System.out.println("user1="+hsr.getParameter("user"));
System.out.println("user2="+hsr.getParameter("user"));
return "success";
}
}
2.接口方式
特點
實現接口方法,由Struts2自動放入web資源
不需要重復獲取
API
ServletContextAware void setServletContext(ServletContext arg0)
ServletRequestAware void setServletRequest(HttpServletRequest arg0)

package com.hanqi.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
public class TestServletActionAware implements ServletRequestAware, ServletContextAware {
private ServletContext sc;
private HttpServletRequest hsr;
private HttpSession hs;
@Override
public void setServletContext(ServletContext arg0) {
sc=arg0;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO 自動生成的方法存根
hsr=arg0;
hs=arg0.getSession();//得到session
}
public String testServletAware()
{
System.out.println("app1="+sc.getAttribute("app1"));
sc.setAttribute("app2", "新的APP2");
System.out.println("set1"+hs.getAttribute("set1"));
hs.setAttribute("set2", "新的set2");
System.out.println("user="+hsr.getParameter("user"));
hsr.setAttribute("req2", "新的req2");
return "success";
}
}

