(八)Struts2中的參數封裝
阿新 • • 發佈:2018-08-09
靜態 用戶名 關系 第一步 流程 什麽是 例如 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中的參數封裝