在Action操作中,關(guān)鍵就是Action中的exectue方法,但是此方法并沒有request、session、application等對象作為參數(shù),自然就不能利用這些對象來操作。
通常可以使用四種方式來獲取這些對象:
方式一、與Servlet解耦合的非IOC方式
獲取的scope對象與容器無關(guān),通過ActionContext獲取。
package test002;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
/**
* Created by yangcs on 2017/1/19.
* 通過與servlet解耦和的非IOC方式來獲取scope對象
*/
public class ScopeAction extends ActionSupport{
private String name;
private String req;
private String sess;
public String getReq() {
return req;
}
public void setReq(String req) {
this.req = req;
}
public String getSess() {
return sess;
}
public void setSess(String sess) {
this.sess = sess;
}
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
private String app;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
ActionContext context; //這個是解耦和的關(guān)鍵
Map request;
Map session;
Map application;
@Override
public String execute(){
context = ActionContext.getContext();
request = (Map) context.get("request");
session =context.getSession();
application = context.getApplication();
request.put("req",req);
session.put("sess",sess);
application.put("app",app);
return SUCCESS;
}
}
分析:通過ActionContext的getContext靜態(tài)方法得到ActionContext對象,然后ActionContext
對象調(diào)用get方法來獲取一個存儲在request范圍中的對象。我們使用el或通過request.getAttribute
這樣的方式均可以獲取對象值,這說明了這些Map request對象實際是存儲在request范圍內(nèi)的對象。
方式二、與Servlet解耦合的IOC方式
package test002;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import java.util.Map;
/**
* Created by yangcs on 2017/1/19.
* 與servlet解耦和的IOC方式(依賴于struts框架來實現(xiàn)對象的實例化,依賴注入、控制反轉(zhuǎn))獲取scope對象
*/
public class ScopeAction02 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map request;
private Map session;
private Map application;
@Override
public void setApplication(Map<String, Object> map) {
application = map;
}
@Override
public void setRequest(Map<String, Object> map) {
request = map;
}
@Override
public void setSession(Map<String, Object> map) {
session = map;
}
private String req;
private String sess;
private String app;
public String getReq() {
return req;
}
public void setReq(String req) {
this.req = req;
}
public String getSess() {
return sess;
}
public void setSess(String sess) {
this.sess = sess;
}
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
@Override
public String execute(){
request.put("req",req);
session.put("sess",sess);
application.put("app",app);
System.out.println("reqMap為:"+request);
return "success";
}
}
說明:此方法其實和方式一很相似,只是在方式一中我們需要手動的為Map request賦值,
但是在方式二中它是通過實現(xiàn)接口,在重寫接口中的方法中完成對Map requset的賦值,所以稱之IOC方式。
強調(diào):方式二是開發(fā)中主要用的方式,應(yīng)重點掌握
方式三、與Servlet耦合的非IOC方式
package test002;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* Created by yangcs on 2017/1/19.
* 與servlet相耦合的非IOC方式獲取scope對象
* 這種方式獲取的為純粹的Scope對象,它與容器相關(guān),這些Scope對象操作性更強
*/
public class ScopeAction03 extends ActionSupport{
private String req;
private String sess;
private String app;
public String getReq() {
return req;
}
public void setReq(String req) {
this.req = req;
}
public String getSess() {
return sess;
}
public void setSess(String sess) {
this.sess = sess;
}
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
HttpServletRequest request;
HttpSession session;
ServletContext application;
@Override
public String execute(){
request = ServletActionContext.getRequest(); //這里,就是耦合了servlet了
session = request.getSession();
application = ServletActionContext.getServletContext();
request.setAttribute("req",req);
session.setAttribute("sess",sess);
application.setAttribute("app",app);
return SUCCESS;
}
}
此方法獲取的純粹的Scope對象,它與容器相關(guān),這些Scope對象可操作性更強。
方式四、與Servlet耦合的IOC方式
package test002;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* Created by yangcs on 2017/1/19.
* 與servlet耦合的情況下使用IOC獲取scope對象
*/
public class ScopeAction04 extends ActionSupport implements ServletRequestAware,ServletContextAware{
HttpServletRequest request;
HttpSession session;
ServletContext application;
@Override
public void setServletRequest(HttpServletRequest httpServletRequest) {
request = httpServletRequest;
}
@Override
public void setServletContext(ServletContext servletContext) {
application = servletContext;
}
private String req;
private String sess;
private String app;
public String getReq() {
return req;
}
public void setReq(String req) {
this.req = req;
}
public String getSess() {
return sess;
}
public void setSess(String sess) {
this.sess = sess;
}
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
@Override
public String execute(){
request.setAttribute("req",req);
session = request.getSession();
session.setAttribute("sess",sess);
application.setAttribute("app",app);
return SUCCESS;
}
}
附:用于測試的訪問頁面及結(jié)果展示頁面:
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="test002" namespace="/" extends="struts-default">
<action name="Action003" class="test002.ScopeAction">
<result name="success">/JSP/scope01.jsp</result>
</action>
<action name="Action004" class="test002.ScopeAction02">
<result name="success">/JSP/scope01.jsp</result>
</action>
<action name="Action005" class="test002.ScopeAction03">
<result name="success">/JSP/scope01.jsp</result>
</action>
<action name="Action006" class="test002.ScopeAction04">
<result name="success">/JSP/scope01.jsp</result>
</action>
</package>
</struts>
輸入?yún)?shù)頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>scope</title>
</head>
<body>
本頁面展示在action中獲取scope對象<br><br>
<form method="get" action="Action003.action">
這個表單是使用與servlet解耦和的非IOC方式來獲取scope對象<br>
request:<input type="text" name="req"/><br>
session:<input type="text" name="sess"/><br>
appliaction:<input type="text" name="app"/><br>
<input type="submit"/>
</form>
<form method="get" action="Action004.action">
這個表單是使用與servlet解耦和的IOC方式來獲取scope對象(主要使用)<br>
request:<input type="text" name="req"/><br>
session:<input type="text" name="sess"/><br>
appliaction:<input type="text" name="app"/><br>
<input type="submit"/>
</form>
<form method="get" action="Action005.action">
這個表單是使用與servlet耦和的非IOC方式來獲取scope對象<br>
request:<input type="text" name="req"/><br>
session:<input type="text" name="sess"/><br>
appliaction:<input type="text" name="app"/><br>
<input type="submit"/>
</form>
<form method="get" action="Action006.action">
這個表單是使用與servlet耦和的IOC方式來獲取scope對象<br>
request:<input type="text" name="req"/><br>
session:<input type="text" name="sess"/><br>
appliaction:<input type="text" name="app"/><br>
<input type="submit"/>
</form>
</body>
</html>
獲取參數(shù)展示頁面:
<%--
Created by IntelliJ IDEA.
User: yangcs
Date: 2017/1/19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>scope01</title>
</head>
<body>
request:${requestScope.req}<br>
session:${sessionScope.sess}<br>
application:${applicationScope.app}<br>
</body>
</html>