action接收請求參數 在web開發中,去接收請求參數來獲得表單信息非常的常見,自己也總結整理了有關Struts2通過action接收請求參數的幾種方法。 Struts2 提供三種數據封裝的方式: (1) Action 本身作為model對象,通過成員setter封裝 (2) 創建獨立model對 ...
action接收請求參數
在web開發中,去接收請求參數來獲得表單信息非常的常見,自己也總結整理了有關Struts2通過action接收請求參數的幾種方法。
Struts2 提供三種數據封裝的方式:
(1) Action 本身作為model對象,通過成員setter封裝
(2) 創建獨立model對象,頁面通過ognl表達式封裝
(3) 使用ModelDriven介面,對請求數據進行封裝(推薦)
下麵我們來講解第一種:
(1) Action類本身作為model對象通過成員的setter方法封裝(屬性驅動)
setXxx()的xxx必須與請求的參數名一樣。就是指和form表單中的name對應的屬性要一致
action類的代碼:
import java.util.Arrays; import com.ssh.struts2.model.User; import com.opensymphony.xwork2.ActionSupport; /* * 通過這種方法最簡單,但也有缺點如果要把數據封裝到model對象中然後傳遞給業務層和數據層 * 還需要單獨定義model對象進行傳遞數據 */ public class RegisterAction1 extends ActionSupport { private String username; private String [] hobby; @Override public String execute() throws Exception { //獲取表單的數據 System.out.println("用戶名是:"+username); System.out.println("興趣愛好是:"+Arrays.toString(hobby)); return null; } //這裡必須提供set方法,get方法可有可無 public void setUsername(String username) { this.username = username; } public void setHobby(String[] hobby) { this.hobby = hobby; } } /*當你在界面中用戶名輸入:zhangsan,興趣愛好選擇:體育和讀書那麼運行結果如下: * 用戶名是:zhangsan * 興趣愛好是:[sport, read] */
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" extends="struts-default"> <action name="register1" class="com.ssh.struts2.action.RegisterAction1"> </action> </package> </struts>
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> </head> <body> <h4>註冊表單1 </h4> <form action="${pageContext.request.contextPath }/register1.action" method="post"> 用戶名:<input type="text" name="username"><br/> 愛好:<input type="checkbox" name="hobby" value="sport">體育 <input type="checkbox" name="hobby" value="music">音樂 <input type="checkbox" name="hobby" value="read">讀書 <br/> <input type="submit" value="註冊"> </form> </body> </html>
網頁:
(2) 創建獨立model對象,頁面通過ognl表達式封裝
該方法首先要創建一個專門的領域對象進行封裝
User領域對象
import java.util.Arrays; public class User { private String username; private String [] hobby; //為這兩個常量提供set和get方法和toString方法
Action類
import com.ssh.struts2.model.User; import com.opensymphony.xwork2.ActionSupport; public class RegisterAction2 extends ActionSupport{ //直接定義model對象 private User user; @Override public String execute() throws Exception { System.out.println("user:"+user); return NONE; } /* * 必須提供get方法 * 封裝第一個參數 創建一個新的User對象 然後把username屬性封裝到這個創建的user對象中 User user =new User();user.setUserName(""); * 封裝第二個參數 已經存在user對象 User user =getUser(); user.setPassword("); */ public User getUser() { return user; } public void setUser(User user) { this.user = user; } } /* * 如果jsp界面輸入:用戶名:aa 興趣愛好:體育讀書 * 後臺輸出:user:User [username=aa, hobby=[sport, music]] */
register.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <html> 3 <head> 4 </head> 5 <body> 6 <!-- 用ognl表達式要註意的一點就是,標簽的屬性name在取名字的時候是:領域對象.屬性 7 user.username這裡user是具體的對象,username是領域對象的屬性--> 8 <h4>註冊表單1 </h4> 9 <form action="${pageContext.request.contextPath }/register2.action" method="post"> 10 用戶名:<input type="text" name="user.username"><br/> 11 愛好:<input type="checkbox" name="user.hobby" value="sport">體育 12 <input type="checkbox" name="user.hobby" value="music">音樂 13 <input type="checkbox" name="user.hobby" value="read">讀書 <br/> 14 <input type="submit" value="註冊"> 15 </form> 16 </body> 17 </html>
說明:struts2首先通過反射技術調用User的預設構造器創建User對象,然後通過反射技術調用User中與請求參數同名的屬性的setter方法來獲取請求參數值。在這裡需要註意的一點是:User對象一定要有預設的構造器。
採用複合類型接收請求參數的好處,可以減少action中的setter和getter方法,同時可以把相應的屬性組合成一個類,這樣使代碼更好清晰,代碼有更好的結構。
(3)使用ModelDriven介面,對請求數據進行封裝
第三種方法比較方便,和方法(1)不同在於它也要先創建一個領域對象類進行對象的封裝。其它和方法(1)一樣
Action類
import com.ssh.struts2.model.User; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //實現ModelDriven<User>介面 public class RegisterAction3 extends ActionSupport implements ModelDriven<User> { /** * 方式三 使用模型驅動 */ //這裡需要註意,方法2中的user對象不需要自己創建,而這裡必須手動初始化 private User user =new User(); public User getModel() { return user; } @Override public String execute() throws Exception { System.out.println("user:"+user); return NONE; } } /* * 如果jsp界面輸入:用戶名:aa 興趣愛好:體育讀書 * 後臺輸出:user:User [username=aa, hobby=[sport, music]] */
最後我們來思考兩個問題,也是常見的筆面試題:
問題一:Action封裝數據會不會有線程問題?
問題二:在使用第一種方式進行封裝的時候數據封裝到Action 屬性中不能把Action傳遞給業務層數據如何傳遞?
謝謝大家瀏覽,歡迎大家指點!