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

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

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

    The NoteBook of EricKong

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

    1.Struts2的屬性驅動.

    Struts2的屬性驅動指的是在action中JSP頁面的每一個form中的name都對應在action中有一個屬性與之對應。看下面代碼片段:

     


    <form action="register.do" name="RegisterForm" method="post">

                Username:<input type="text" name="uname"><br>
                Password:<input type="password" name="upass"><br>
                Confirm: <input type="password" name="rpass"><br>
                <input type="submit" value="Submit">

    </form>

     


    這是一個最基本的用戶注冊的表單,它有三個數據要提交: uname、upass、rpass,那么對應的Action也要有三個屬性(其實是三個屬性的setter),看register.do實際的Action定義類:

     


    package org.abu.csdn.action.user;

    import com.opensymphony.xwork2.ActionSupport;

    /**
     * Struts2屬性驅動演示用的Action
     * @author 阿布
     *
     */
    public class RegisterAction extends ActionSupport {

        private String uname;
        private String upass;
        private String rpass;

        public String getUname() {
            return uname;
        }

        public void setUname(String uname) {
            this.uname = uname;
        }

        public String getUpass() {
            return upass;
        }

        public void setUpass(String upass) {
            this.upass = upass;
        }

        public String getRpass() {
            return rpass;
        }

        public void setRpass(String rpass) {
            this.rpass = rpass;
        }
       
        @Override
        public String execute() throws Exception {       
            return ActionSupport.SUCCESS;
        }

    }

     

     

    你會看到RegisterAction中的三個屬性和RegisterForm表單中的name屬性名字一模一樣,沒錯,這就是Struts2的屬性驅動,當表單提交到RegisterAction后,Struts2將會自動將根據表單的name屬性調用Action中相應的屬性setter,去自動賦值。

     


    2.Struts2的模型驅動

    Struts2的模型驅動其實和Struts1.x中的ActionForm有點類似,在Struts1.x中每一個Action都必須有一個ActionForm與之對應,而Struts2.0中,每一個Action同樣需要提供一個POJO對象,用來封裝表單屬性,看代碼:

     


    <form action="register.do" name="RegisterForm" method="post">

                Username:<input type="text" name="uname"><br>
                Password:<input type="password" name="upass"><br>
                Confirm: <input type="password" name="rpass"><br>
                <input type="submit" value="Submit">

    </form>

     


    這段表單的代碼和上面的一模一樣,就不贅述了。接下來看POJO的代碼,其實就是普通的Java Bean:

     


    package org.abu.csdn.action.user;

    import com.opensymphony.xwork2.ActionSupport;

    /**
     * Struts2屬性驅動演示用的Java Bean
     * @author 阿布
     *
     */
    public class User {

        private String uname;
        private String upass;
        private String rpass;

        public String getUname() {
            return uname;
        }

        public void setUname(String uname) {
            this.uname = uname;
        }

        public String getUpass() {
            return upass;
        }

        public void setUpass(String upass) {
            this.upass = upass;
        }

        public String getRpass() {
            return rpass;
        }

        public void setRpass(String rpass) {
            this.rpass = rpass;
        }
      
    }

     


    對不起,也是和屬性驅動中的例子一樣,很簡單,因為演示的都是同一個例子,只是方法不同而已,但是接下來就不一樣了,看RegisterAction代碼:

     


    package org.abu.csdn.action.user;

    import org.abu.csdn.dto.User;

    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;

    /**
     * Struts2模型驅動演示用的Action
     * 
     * @author 阿布
     *
     */
    public class RegisterAction extends ActionSupport implements ModelDriven<User> {

        private User user;
       
        public User getUser() {
            return user;
        }

        public void setUser(User user) {
            this.user = user;
        }

        @Override
        public String execute() throws Exception {       
            return ActionSupport.SUCCESS;
        }

        // 模型驅動必須實現的方法,也是ModelDriven接口中唯一的方法
        public User getModel() {
           
            return user;
        }

    }

     

     

    看到沒有,和屬性驅動的Action有很大的區別,下面一一列舉:

    (1)模型驅動的Action必須實現ModelDriven接口,而且要提供相應的泛型,這里當然就是具體使用的Java Bean了。

    (2)實現ModelDriven的getModel方法,其實就是簡單的返回泛型的一個對象。

    (3)在Action提供一個泛型的私有對象,這里就是定義一個User的user對象,并提供相應的getter與setter。

    好了,上面的三件事做完之后,Action就會去自動調用User的setter將表單中的name屬性的值賦給User中的屬性。而Action的后續處理的Jsp頁面后者是Servlet就可以使用user對象了。

     

     

     

    3.到底是用屬性驅動和是模型驅動呢?

     

     

    這個問題困擾了很多Struts2的初學者,我這里提供一些建議:

    (1)請你統一整個系統中的Action使用的驅動模型,即要么都是用屬性驅動,要么都是用模型驅動。

    (2)如果你的DB中的持久層的對象與表單中的屬性都是一一對應的話,那么就使用模型驅動吧,畢竟看起來代碼要整潔得多。

    (3)如果表單的屬性不是一一對應的話,那么就應該使用屬性驅動,否則,你的系統就必須提供兩個Bean,一個對應表單提交的數據,另一個用與持久層。

     


    看上面的例子,其實密碼確認rpass是不需要放到DB中去的,而僅僅是用于校驗密碼的,不是嗎?那么如果使用模型驅動的話,就存在這個問題了,而使用屬性驅動的話又有些繁瑣,現在我們就來調整一個看我的解決方法:

     


    4.完整的例子

    (1)表單提交的JSP頁面index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://"
                + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <base href="<%=basePath%>">
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>CSDN首頁</title>
        </head>
        <body>
            <s:a href="userManager/userRegister.jsp">用戶注冊</s:a>
           
            <form action="register.do" name="SampleForm" method="post">
                Username:<input type="text" name="uname"><br>
                Password:<input type="password" name="upass"><br>
                Confirm: <input type="password" name="rpass"><br>
                <input type="submit" value="Submit">
            </form>
        </body>
    </html>

     


    (2)User的定義

     


    package org.abu.csdn.action.user;

    import com.opensymphony.xwork2.ActionSupport;

    /**
     * Struts2屬性驅動演示用的Java Bean
     * @author 阿布
     *
     */
    public class User {

        private String uname;
        private String upass; 

        public String getUname() {
            return uname;
        }

        public void setUname(String uname) {
            this.uname = uname;
        }

        public String getUpass() {
            return upass;
        }

        public void setUpass(String upass) {
            this.upass = upass;
        }  
      
    }

     


    (3)RegisterAction的定義

     


    package org.abu.csdn.action.user;

    import com.opensymphony.xwork2.ActionSupport;

    /**
     * Struts2屬性驅動演示用的Action
     * @author 阿布
     *
     */
    public class RegisterAction extends ActionSupport {

     

     

        // 用來給spring注入,及屬性拷貝


        private User user;

     

     

        private String uname;
        private String upass;
        private String rpass;

        public String getUname() {
            return uname;
        }

        public void setUname(String uname) {
            this.uname = uname;
        }

        public String getUpass() {
            return upass;
        }

        public void setUpass(String upass) {
            this.upass = upass;
        }

        public String getRpass() {
            return rpass;
        }

        public void setRpass(String rpass) {
            this.rpass = rpass;
        }
       
        @Override
        public String execute() throws Exception {

            // 調用方法將屬性copy到user中去,便于后續的service方法


            copyAttribute();

            // TODO:編寫自己的user業務代碼
            return ActionSupport.SUCCESS;
        }

     


        /**
         * 注意這是一個action全局的校驗
         */
        @Override
        public void validate() {
            // 進行密碼的校驗
            if (!(upass.trim()).equals((rpass.trim()))) {
                // 注意這里addFieldError的fieldName參數必須用引號引起來,
                // 不能這樣使用addFieldError(rpass,"XXXXXX"),而必須是addFieldError("rpass","XXXXX")
                this.addFieldError("rpass", this
                        .getText("csdn.action.user.register.validate.verify"));
            }
        }

     

     

     


        /**
         * 將表單屬性中需要持久化的屬性拷貝到user中去
         * @author 阿布
         *
        */
        private void copyAttributes () {

                user.setUname(uname);

                user.setUpass(upass);


        }


    }

     

     

     

    (4)Struts.xml配置

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
        "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
        <package name="root" extends="struts-default" namespace="/userManager">
            <action name="userRegister" class="org.abu.csdn.action.user.RegisterAction">
                <result name="success">/index.jsp</result>
                <result name="input">/userManager/userRegister.jsp</result>
            </action>               
        </package>
    </struts>

     

     

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/csuliky/archive/2009/05/30/4226917.aspx

    posted on 2010-06-17 21:05 Eric_jiang 閱讀(9209) 評論(1)  編輯  收藏 所屬分類: struts2

    Feedback

    # re: Struts2的屬性驅動與模型驅動的區別 2015-08-10 16:11 一樣
    同樣try同人女  回復  更多評論
      

    主站蜘蛛池模板: 亚洲国产AV无码一区二区三区 | 成年女人A毛片免费视频| 国产成人综合亚洲亚洲国产第一页 | 亚洲Av无码专区国产乱码DVD| 182tv免费视视频线路一二三| 亚洲人成网站18禁止| 亚洲综合AV在线在线播放| 国产精品怡红院永久免费| 99亚洲男女激情在线观看| 亚洲bt加勒比一区二区| 亚洲成年看片在线观看| 久久99青青精品免费观看| 亚洲国产综合无码一区二区二三区| 久久免费视频观看| 亚洲欧美成人综合久久久| 亚洲s色大片在线观看| 免费网站看v片在线香蕉| 久久99精品视免费看| 日本一区二区三区在线视频观看免费| 亚洲另类激情综合偷自拍 | 亚洲日韩欧洲无码av夜夜摸| 一二三四在线观看免费高清中文在线观看 | 18勿入网站免费永久| 91视频免费观看| 黄色一级毛片免费看| 亚洲制服丝袜在线播放| 亚洲日韩精品射精日| 国产精品久久久久影院免费| 91青青青国产在观免费影视| 亚洲免费黄色网址| 亚洲精品高清无码视频| 亚洲免费一级视频| 十八禁视频在线观看免费无码无遮挡骂过| 亚洲精华液一二三产区| 亚洲理论片在线观看| 国产美女精品久久久久久久免费| 亚欧在线精品免费观看一区| 精品一区二区三区免费视频| 国产大陆亚洲精品国产| 亚洲国产成人久久综合| 亚洲一区在线视频|