<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Struts2中Action詳解

    Posted on 2008-02-15 18:42 flustar 閱讀(5980) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Struts2

        在Struts2Action部分,也就是Controller層采用了低侵入的方式。為什么這么說(shuō)?這是因?yàn)樵?/span>Struts2action類(lèi)并不需要繼承任何的基類(lèi),或?qū)崿F(xiàn)任何的接口,更沒(méi)有與ServletAPI直接耦合。它通常更像一個(gè)普通的POJO(通常應(yīng)該包含一個(gè)無(wú)參數(shù)的execute方法),而且可以在內(nèi)容定義一系列的方法(無(wú)參方法),并可以通過(guò)配置的方式,把每一個(gè)方法都當(dāng)作一個(gè)獨(dú)立的action來(lái)使用,從而實(shí)現(xiàn)代碼復(fù)用。

    例如:

    package example;

    public class UserAction {

           private String username;

           private String password;

        public String execute() throws Exception {

                  //…………..

            return “success”;

        }

        public String getUsername() {

            return username;

        }

        public void setUsername(String username) {

            this.username = username;

        }

        public String getPassword() {

            return password;

        }

        public void setPassword(String password) {

            this.password = password;

        }

    }

    在這個(gè)Action類(lèi)里的屬性,既可以封裝參數(shù),又可以封裝處理結(jié)果。系統(tǒng)并不會(huì)嚴(yán)格區(qū)分它們。

    但是為了使用戶(hù)開(kāi)發(fā)的Action類(lèi)更規(guī)范,Struts2為我們提供了一個(gè)接口Action,該類(lèi)定義如下:

    publicinterface Action {

        publicstaticfinal String ERROR="error";

        publicstaticfinal String INPUT="input";

        publicstaticfinal String NONE="none";

        publicstaticfinal String LOGIN="login";

        publicstaticfinal String SUCCESS="success";

        public String execute()throws Exception;

    }

    但是我們寫(xiě)Action通常不會(huì)實(shí)現(xiàn)該接口,而是繼承該接口的實(shí)現(xiàn)類(lèi)ActionSupport.

    該類(lèi)代碼如下:

    public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {

         ................

        public void setActionErrors(Collection errorMessages) {

            validationAware.setActionErrors(errorMessages);

        }

        public Collection getActionErrors() {

            return validationAware.getActionErrors();

        }

        public void setActionMessages(Collection messages) {

            validationAware.setActionMessages(messages);

        }

        public Collection getActionMessages() {

            return validationAware.getActionMessages();

        }

           public Collection getErrorMessages() {

            return getActionErrors();

        }

           public Map getErrors() {

            return getFieldErrors();

        }

    //設(shè)置表單域校驗(yàn)錯(cuò)誤

        public void setFieldErrors(Map errorMap) {

            validationAware.setFieldErrors(errorMap);

        }

        public Map getFieldErrors() {

            return validationAware.getFieldErrors();

        }

        public Locale getLocale() {

            ActionContext ctx = ActionContext.getContext();

            if (ctx != null) {

                return ctx.getLocale();

            } else {

                LOG.debug("Action context not initialized");

                return null;

            }

        }

    //獲取國(guó)際化信息的方法

        public String getText(String aTextName) {

            return textProvider.getText(aTextName);

        }

        public String getText(String aTextName, String defaultValue) {

            return textProvider.getText(aTextName, defaultValue);

        }

        public String getText(String aTextName, String defaultValue, String obj) {

            return textProvider.getText(aTextName, defaultValue, obj);

        }

           .........

     //用于訪(fǎng)問(wèn)國(guó)際化資源包的方法

        public ResourceBundle getTexts() {

            return textProvider.getTexts();

        }

        public ResourceBundle getTexts(String aBundleName) {

            return textProvider.getTexts(aBundleName);

        }

    //添加action的錯(cuò)誤信息

        public void addActionError(String anErrorMessage) {

            validationAware.addActionError(anErrorMessage);

        }

    //添加action的普通信息

        public void addActionMessage(String aMessage) {

            validationAware.addActionMessage(aMessage);

        }

        public void addFieldError(String fieldName, String errorMessage) {

            validationAware.addFieldError(fieldName, errorMessage);

        }

          

        public void validate() {

        }

        public Object clone() throws CloneNotSupportedException {

            return super.clone();

        }

     ..........

    }

    前面說(shuō)到struts2并沒(méi)有直接與Servlet的API耦合,那么它是怎么訪(fǎng)問(wèn)Servlet的API的呢?

    原來(lái)struts2中提供了一個(gè)ActionContext類(lèi),該類(lèi)模擬了Servlet的API。其主要方法如下:

    1)Object get (Object key):該方法模擬了HttpServletRequest.getAttribute(String name)方法。

    2)Map getApplication()返回一個(gè)Map對(duì)象,該對(duì)象模擬了ServletContext實(shí)例.

    3)static ActionContext getContext():獲取系統(tǒng)的ActionContext實(shí)例。

    4)Map getSession():返回一個(gè)Map對(duì)象,該對(duì)象模擬了HttpSession實(shí)例.

    5)Map getParameters():獲取所有的請(qǐng)求參數(shù),模擬了HttpServletRequest.getParameterMap()

    你也許會(huì)奇怪為什么這些方法老是返回一個(gè)Map?這主要是為了便于測(cè)試。至于它是怎么把Map對(duì)象與實(shí)際的Servlet API的實(shí)例進(jìn)行轉(zhuǎn)換的,這個(gè)我們根本就不要擔(dān)心,因?yàn)閟truts2已經(jīng)內(nèi)置了一些攔截器來(lái)幫我們完成這一轉(zhuǎn)換。

    為了直接使用Servlet的API,Struts2為我們提供了以下幾個(gè)接口。

    1)ServletContextAware:實(shí)現(xiàn)該接口的Action可以直接訪(fǎng)問(wèn)ServletContext實(shí)例。

    2)ServletRequestAware:實(shí)現(xiàn)該接口的Action可以直接訪(fǎng)問(wèn)HttpServletRequest實(shí)例。

    3)ServletResponseAware:實(shí)現(xiàn)該接口的Action可以直接訪(fǎng)問(wèn)HttpServletResponse實(shí)例。

    以上主要講了action訪(fǎng)問(wèn)servlet,下面讓我們來(lái)看一下Struts2的Action是如何實(shí)現(xiàn)代碼復(fù)用的。就拿UserAction來(lái)說(shuō),我如果讓這個(gè)action既處理用戶(hù)注冊(cè)(regist)又處理登錄(longin)該如何改寫(xiě)這個(gè)action呢?改寫(xiě)后的UserAction如下:

    package example;

    public class UserAction extends ActionSupport {

           private String username;

           private String password;

        public String regist() throws Exception {

                  //…………..

            return SUCCESS;

        }

     public String login() throws Exception {

                  //…………..

            return SUCCESS;

        }

        public String getUsername() {

            return username;

        }

        public void setUsername(String username) {

            this.username = username;

        }

        public String getPassword() {

            return password;

        }

        public void setPassword(String password) {

            this.password = password;

        }

    }

    是不是這么寫(xiě)就ok了,當(dāng)然不行我們還必須在struts.xml文件中配置一下。配置方法有兩種:

    1)      使用普通的方式為Action元素指定method屬性.

    <action name=”loginAction” class=”example.UserAction” method=”login”>

           <result name=”success”>/success.jsp</result>

    </action>

    <action name=”registAction” class=”example.UserAction” method=”regist”>

           <result name=”success”>/success.jsp</result>

    </action>

    2)      采用通配符的方式為Action元素指定method屬性。

    <action name=”*Action” class=”example.UserAction” method=”{1}”>

           <result name=”success”>/success.jsp</result>

    </action>

    使用通配符的方式過(guò)于靈活,下面是一個(gè)較復(fù)雜的配置情況。

    <action name=”*_*” class=”example.{1}Action” method=”{2}”>

    ……….

     </action>

    其中占位符{1}_的前一個(gè)*匹配,{2}與后一個(gè)*匹配。

    Feedback

    # re: Struts2中Action詳解[未登錄](méi)  回復(fù)  更多評(píng)論   

    2013-03-05 04:33 by oo
    oo

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 手机在线看永久av片免费| 亚洲成AV人在线观看网址| 亚洲另类无码专区丝袜| 四虎影视永久免费观看网址| a毛片久久免费观看| 在线亚洲高清揄拍自拍一品区| 免费一级特黄特色大片在线| 无码国产精品一区二区免费16 | 最近免费中文字幕高清大全| 亚洲精品国产第一综合99久久| 亚洲精品tv久久久久久久久| 久久不见久久见中文字幕免费| selaoban在线视频免费精品| 亚洲宅男天堂a在线| 亚洲裸男gv网站| 毛片免费观看的视频在线| 最近更新免费中文字幕大全| 久久亚洲精品国产亚洲老地址| 亚洲中文字幕无码一久久区| 我要看免费的毛片| 久久久久久一品道精品免费看| 在线亚洲精品视频| 久久精品国产99国产精品亚洲| 亚洲人成网亚洲欧洲无码久久 | 亚洲第一成人影院| 美女裸身网站免费看免费网站 | 在线永久免费观看黄网站| 亚洲午夜免费视频| 亚洲视频在线免费| 色偷偷亚洲第一综合网| 亚洲一区二区免费视频| 亚洲免费在线播放| 国产综合精品久久亚洲| 国产午夜鲁丝片AV无码免费| 黄页免费的网站勿入免费直接进入| a级毛片视频免费观看| 美女视频黄a视频全免费网站一区| 国产日本亚洲一区二区三区| 国产A在亚洲线播放| 亚洲中文字幕无码日韩| 久久亚洲欧洲国产综合|