1. 程式人生 > >(八)Struts2中的參數封裝

(八)Struts2中的參數封裝

靜態 用戶名 關系 第一步 流程 什麽是 例如 string 幫我

一、靜態參數封裝

什麽是靜態參數?
靜態參數就是硬編碼的,不可隨意改變。

例子:

(1)我們首先創建一個Action類,裏面有兩個參數,用來封裝請求參數

        public class User extends ActionSupport {
            private String username;    //用戶名
            private int age;           //年齡

            public String getUsername() {
                return username;
            }

            public void setUsername(String username) {
                this.username = username;
            }

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }

            public String adduser(){ 
                System.out.println(username+":"+age);
                return null;
            }
        } 

(2)我們在struts.xml中配置靜態參數,我們訪問action1動作時,會輸出 張三:18

            <package name="p1" extends="struts-default">
                <action name="action1" class="com.cad.struts2.User"  method="adduser"> 
                    <!--通過註入的方式封裝靜態參數-->
                    <param name="username">張三</param>
                    <param name="age">18</param>
                </action>
            </package>  

(3)原理

 我們在struts2的運行流程中提到過,我們動作類的動作方法執行之前,會有一系列的攔截器幫我們執行一些操作。 

        在struts-default.xml中,有很多攔截器,攔截器又分為很多攔截器棧,我們默認是使用defaultStack的攔截器棧。  

        這個攔截器棧中有一個叫做staticParams的攔截器幫我們完成靜態參數的封裝,將配置的靜態方法通過action類中的set方法設置進去。

二、動態參數封裝

什麽是動態參數?

像我們用表單提交的數據,就是動態數據。數據是可變的

例子:
(1)第一步:我們先創建一個添加用戶的表單
        <form action="${pageContext.request.contextPath }/action1" method="post">
            用戶名:<input type="text" name="username"><br>
            年 齡:<input type="text" name="age"><br>
            <input type="submit" value="提交">
        </form> 
(2)第一種方式:數據參數和動作類寫在一起 要求是表單中的name必須和我們類中的set方法後面的名稱一致,例如表單中的username對應類中的setUsername,和參數並沒有太大關系,和set方法有關系。
                public class User extends ActionSupport {
                    private String username;
                    private int age;

                    public String getUsername() {
                        return username;
                    }

                    public void setUsername(String username) {
                        this.username = username;
                    }

                    public int getAge() {
                        return age;
                    }

                    public void setAge(int age) {
                        this.age = age;
                    }

                    public String adduser(){ 
                        System.out.println(username+":"+age);
                        return null;
                    }
                }  

(3)配置struts.xml文件  

        <package name="p1" extends="struts-default">

            <action name="action1" class="com.cad.struts2.User"  method="adduser">

            </action>
        </package>

這一系列操作是由攔截器棧中的名為params的攔截器幫我們完成的

上面這種方式將參數和動作類寫在一起,看起來太過混亂,我們能不能用一個JavaBean將參數給封裝起來。 答案是能。

 第二種方式,將參數數據和動作類分開寫

  (1)第一步,我們創建一個javaBean,User類,用來封裝請求參數

                public class User  implements Serializable{
                    private String username;
                    private int age;

                    public String getUsername() {
                        return username;
                    }

                    public void setUsername(String username) {
                        this.username = username;
                    }

                    public int getAge() {
                        return age;
                    }

                    public void setAge(int age) {
                        this.age = age;
                    }
                }

  (2)第二步:創建一個添加用戶的動作類,裏面有一個user對象

  

                public class AdduserAction extends ActionSupport {
                    private User user;

                    public User getUser() {
                        return user;
                    }

                    public void setUser(User user) {
                        this.user = user;
                    }
                    public String adduser(){
                        System.out.println(user.getUsername()+":"+user.getAge());
                        return null;
                    }

                } 

(3)第三步:我們得改變一些我們的jsp頁面的寫法,因為表單的name要和類中的數據相對應,但類中只有一個user ,username去找動作類中的setUsername,肯定找不到。 我們這樣寫,他就會先找類中的user對象,然後去找user對象的username和age  

  

                <body>
                    <form action="${pageContext.request.contextPath }/action1" method="post">
                        用戶名:<input type="text" name="user.username"><br>
                        年 齡:<input type="text" name="user.age"><br>
                        <input type="submit" value="提交">
                    </form>
                </body>

 原理:

這一系列操作還是攔截器params幫我們完成。我們在getUser和setUser裏打印兩句話來看看他到底是怎麽執行的
                public User getUser() {
                    System.out.println("getuser");
                    return user;
                }

                public void setUser(User user) { 
                    System.out.println("setuser");
                    this.user = user;
                } 

                輸出
                getuser   :先判斷對象是否存在
                setuser   :如果判斷不存在,調用set方法,通過反射創建一個對象,並且設置給該類   
                getuser   :然後再獲取該對象,調用該對象的get和set方法對參數賦值 

  

 

(八)Struts2中的參數封裝