Struts2中的action类
生活随笔
收集整理的這篇文章主要介紹了
Struts2中的action类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Struts2中的action類
action類在Struts2中承擔了Model(模型)的角色,主要用于處理業務邏輯并存放HTTP請求處理過程中各個變量的值。
在Struts2里面,Action充當著MVC中模型的角色,也就是Action既封裝了業務數據,又要處理業務功能。
action類
在Struts2中,作為action的Java類不需要繼承任何父類,也不需要實現任何接口。只要包含一個叫做execute()的方法,同時該execute()方法返回類型為String,那么這個Java類就可以作為Struts2應用程序中的action類而出現。這么做的原因很明顯:降低了應用程序代碼和Struts代碼之間的耦聯,讓應用代碼更加的獨立。
Action接口
Struts2提供了一個叫做Action的接口(com.opensymphony.xwork2.Action),凡是實現該接口的Java類
均可作為action類來使用。Action接口的作用有兩個:
保證Java類滿足Struts2對action類的要求 — 具有一個返回類型為String的execute()方法。
public String execute() throws Exception;
提供幾個標準的返回值以供execute()方法使用。
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
ActionSupport類
除了Action接口,Struts2還提供了一個叫做ActionSupport的類
(com.opensymphony.xwork2.ActionSupport),凡是從該類繼承的Java類均可作為action類來使用。
ActionSupport類的作用有以下幾點:
實現了Action接口,于是保證了Struts2對action類的要求。值得注意的是,ActionSupport類實現的
execute()方法所返回的值為SUCCESS,因此如果從ActionSupport類繼承的action類不覆寫execute()方法
,那么最終返回的值為SUCCESS。
public String execute() throws Exception {
? ? return SUCCESS;
}
實現了其它幾個與攔截器(interceptor)相關的接口,從而讓action類能使用這些攔截器所提供的功能
。action類通過實現相關接口來配合使用攔截器,是Struts2中的一個特點。通過對幾個常用的攔截器接
口進行實現,ActionSupport向繼承自它的action類提供了更多的支持。
提供一些工具方法以供子類使用,如:
public String input() throws Exception {
? ? return INPUT;
}
public String doDefault() throws Exception {
? ? return SUCCESS;
}
========
Action基礎
Action是什么
在Struts2中,一個Action類代表一次請求或調用,每個請求的動作都對應于一個相應的Action類,
一個Action類是一個獨立的工作單元。也就是,用戶的每次請求,都會轉到一個相應的Action類里面,由
這個Action類來進行處理,因此一個Action類代表了用戶的一次請求或調用。簡單來說,Action就是用來
處理一次用戶請求的對象。
Action能干什么
public class HelloWorldAction implements Action { ?
? ? ? ? private String account; ?
? ? ? ? private String password; ??
? ? ? ? public String execute() throws Exception { ?
? ? ? ? ? ? System.out.println("用戶輸入的參數為===" + "account=" + account + ",password=" +?
password); ?
? ? ? ? ? ? return "toWelcome"; ?
? ? ? ? } ?
? ? ? ? public String getAccount() { ?
? ? ? ? ? ? return account; ?
? ? ? ? } ?
? ? ? ? public void setAccount(String account) { ?
? ? ? ? ? ? this.account = account; ?
? ? ? ? } ?
? ? ? ? public String getPassword() { ?
? ? ? ? ? ? return password; ?
? ? ? ? } ?
? ? ? ? public void setPassword(String password) { ?
? ? ? ? ? ? this.password = password; ?
? ? ? ? } ?
? ? } ?
根據上面的Action實現,在Struts2里面,Action充當著MVC中模型的角色,也就是Action既封裝了業
務數據,又要處理業務功能。在實際的JavaEE開發中,邏輯部分會放到邏輯層去實現,這就變成Action只
是去調用邏輯層來進行業務邏輯的處理,并不是真的在Action里面去實現業務邏輯的處理。上面Action的
屬性和屬性對應的getter/setter方法,就是用來接收用戶請求的數據,并把這些數據封裝在Action中,
在后續處理中可以訪問這些數據。上面Action的實現中的execute方法的實現,你會發現execute方法里面
實現的功能,正是前面學習的MVC的控制器部分的功能。從另外一個角度說,Struts2的Action也充當著
MVC中控制器的角色。
那Struts2的Action相當于MVC中的控制器還是模型?
雖然兩種說法都過得去,但是目前大家的共識是把Struts2的Action作為MVC中的模型角色來看待。原
因是在Struts2運行的時候,是由Struts2中的前端控制器FilterDispatcher分發并調用相應的Action,此
時Action僅僅相當于一次請求的命令處理,層面比較小,再加上已經有FilterDispatcher來做控制器進行
分發調度,因此,一般不把 Struts2的Action當作MVC的控制器來看,而是當作MVC的模型來看。
Action的配置
不管Action采用何種實現方式,要正確運行,都需要在struts.xml中進行配置,這是使用Action的基
礎。
<package>的配置
Action需要在struts.xml中配置才可以使用,而且Action應該配置成為<package>元素的子元素,那
么<package>元素的功能是什么?
<package>元素可以把邏輯上相關的一組Action、Result、Intercepter等元素封裝形成一個獨立的模
塊,package可以繼承其他的package,也可以作為父包被其他的package繼承,比如配置“<package?
name="helloworld" ?extends="struts-default">”,helloworld這個包就繼承了struts-default這個包
。
? ? ? ?<package>元素有如下屬性:
name:包的名稱。必須配置
extends:要繼承的包,后面配置的是被繼承的包的名稱??蛇x
namespace:包的命名空間。可選
abstract:定義包為抽象的,也就是不能包含Action的定義??蛇x
namespace配置的是包的命名空間,同一個命名空間里面不能有同名的Action,當然不同的命名空間
里面是可以有同名的Action的。類似于Java的包的功能,namespace可以有效的防止action重名的沖突,
因為配置了namespace后,在訪問action的時候就需要添加namespace來作為action的前綴。如果不配置
namespace,表示是默認的namespace,那么訪問的時候不需要添加namespace前綴。
abstract用來定義包為抽象的,也就是不能包含Action的定義,但是抽象包可以被其他包繼承,因此
里面可以定義其他包需要的元素,比如ResultType、Interceptor等等。
<action>的配置
雖然Action在Struts2的開發中非常重要,但是其配置非常簡單,基本的規則如下:
<action>元素是<package>元素的子元素,應該配置在<package>元素里面
<action>元素通常需要配置name和class屬性,其中name是必須的
<action>元素可以包含其他的子元素:比如<param>、<result>、<interceptor-ref>、<exception-
mapping >
通常也就是配置name和class屬性,然后配置<result>子元素。
為何可以不配置<action>的class屬性?
<package>元素的extends屬性配置“struts-default”,說明了這個包繼承了一個叫“struts-?
default”的包,這是Struts2默認配置好的各個<package>元素的公用配置。打開它,可以發現這個文件
類似于我們熟悉的struts.xml。根元素也是<struts>,<struts>元素下面有一個子元素<package>,這個
<package>的name屬性的值正是“struts-default”??醋詈蟮呐渲?lt;default-class-ref?
class="com.opensymphony.xwork2.ActionSupport" />,這說明<action>元素不寫class屬性的時候,默
認配置就是使用ActionSupport類。這種做法有什么用?大多數情況下都是需要配置<action>的class屬性
的值的,因為我們需要把自己寫的,用來處理請求的Action類配置上去,而不是使用默認的配置。考慮一
種情況,在實際開發中對安全性要求較高的web項目,往往把jsp放在WEB-INF文件夾中,這樣可以防止外
界直接通過URL來訪問jsp頁面,這時的jsp就一定要是Servlet或Action的后繼頁面,才可以被訪問到。因
此,如果我們有一個jsp頁面在WEB-INF下,但在它之前不需要Action訪問邏輯層,相當于需要直接訪問這
個jsp頁面。就可以讓這個jsp作為ActionSupport的后繼頁面,使用default-class-ref,可以減少重復配
置。
========
怎么寫Action類
?1.怎么寫Action類? 2.Action的方法,怎么樣跟請求對應 3.Action中怎么獲取作用域通訊對象
? 1)public String execute(){}
? 2) public String methodName(){}
? 3) extends ActionSupport
2.Action的方法,怎么樣跟請求對應?
? ?1)什么都不指定,默認調用Action的execute
? ?2)在struts.xml action的method屬性指定
? ?3)在url中用!號指定 ? ?login!add.action ? (login為action名,add為action中的一個方法名)
? ?4)用submit標簽的method屬性指定方法名稱
? ?5)在action用,用通配符自己適配、
3.Action中怎么獲取作用域通訊對象
? ?1)IOC
? ? ? Struts2 ?(Action對象)
? ? ? HttpServletRequest (Tomcat)
步驟:實現接口SessionAware,重寫setSession()方法,在login中調用session.put("key","value");
public class LoginAction extends ActionSupport implements SessionAware,
? ? ? ? ServletRequestAware {
? ? private String userName;
? ? private String password;
? ? private String message;
? ? private Map session = null;
? ? private HttpServletRequest request = null;
?/**
? * Action中如何獲取作用域通訊對象 s1)IOC Struts2 (Action對象)
? * 步驟:實現接口SessionAware,重寫setSession()方法,在login中調用session.put("key","value");
? * HttpServletRequest (Tomcat)
? * 實現接口ServletRequestAware接口,重寫setServletRequest()方法 2)非IOC
? *?
? */
? ? public String login() {
? ? ? ? String result = "success";
? ? ? ? message = "登錄成功";
? ? ? ? System.out.println(userName + " " + password);
? ? ? ? if (userName == null || userName.equals("")) {
? ? ? ? ? ? message = "登錄失敗";
? ? ? ? } else {
? ? ? ? ? ? // 獲取session
? ? ? ? ? ? // 在session中放一個用戶登陸成功標記
? ? ? ? ? ? session.put("LOGIN_FLAG", userName);
? ? ? ? ? ? // 非IOC
? ? ? ? ? ? Map s1 = ActionContext.getContext().getSession();
? ? ? ? ? ? HttpServletRequest req = ServletActionContext.getRequest();
? ? ? ? }
? ? ? ? return result;
? ? }
// 重寫了SessionAware接口中的setSession方法
??
? ? public void setSession(Map<String, Object> arg0) {
? ? ? ? this.session = arg0;
? ? }
? ? ?struts2將session用map為了:實現容器的解耦(測試時只需要在JUnit測試,只需要在Map中看有無
值,否則需要在tomcat下測試)
? ?2)非IOC
? ? ? HttpServletRequest req = ServletActionContext.getRequest();
?
============
一個公共Action類代碼分析
其他Action類可繼承此類,可實現分頁功能包名:action
導入:
java.util.HashMap;
java.util.Map;
com.opensymphony.xwork2.ActionContext;
com.opensymphony.xwork2.ActionSupport;
訪問數據庫的服務類
類CommAction 繼承 ActionSupport
定義訪問數據服務類類型的變量
調用ActionContext.getContext().get("request")獲取Map類型對象request
調用ActionContext.getContext().getSession()獲取Map類型對象session
定義整型變量currPage,賦值為1
定義整型變量chose賦值為2 - 判斷自定義分頁的最大記錄數
定義整型變量cmaxR賦值為10 - 每頁顯示的最大記錄數
定義boolean型變量isTrue,賦值為false - 判斷操作是否成功
函數,setCoservice,設置訪問數據服務類類型的變量
currPage的get,set;
cmaxR的get,set
chose的get,set
總結
以上是生活随笔為你收集整理的Struts2中的action类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Web 三大框架开发资料
- 下一篇: Java 连接各种数据库