老是被前端與后台之間的傳值給弄糊塗了,特此寫一篇blog進行總結。
一. 前端向后台傳值
(1)屬性驅動
屬性驅動是指在Action類里,包含表單里對應的字段(字段名稱一樣),同時設置對應的getter和setter。
表單代碼:html
1: <form action="login" method="post">
2: <label>username:</label>
3: <input type="text" name="username">
4: <label>password:</label>
5: <input type="text" name="username">
6: </form>
對應的Action:LoginAction
java代碼:
1: public LoginAction extends ActionSupport{
2: private String username; //對應表單中input屬性name=username
3: private String password; //對應表單中input屬性name=password
4:
5: /*-- getter and setter --*/
6: public void setUsername(String username){
7: this.username = username;
8: }
9: public String getUsername(){
10: return this.username;
11: }
12: public void setPassword(String password){
13: this.password = password;
14: }
15: public String getPassword(){
16: return this.password;
17: }
18: public String execute(){
19: return SUCCESS;
20: }
21: }
在struts.xml中配置Action
1: <action name="login" class="com.bigdata.action.LoginAction">
2: <result name="success">success.jsp</result>
3: </action>
在success.jsp頁面中使用{username}來訪問username屬性。
屬性驅動適合於表單域傳值較少的情況,如果表單域過多的話,Java代碼將會充斥着大量的getter和setter代碼。
(2)對象驅動
對象驅動是指在Action里包含一個對象,而這個對象的屬性與表單域一一對應。
對應的Action:LoginAction
1: public LoginAction extends ActionSupport{
2: private User user;
3:
4: /*-- getter and setter --*/
5: public void setUser(User user){
6: this.user = user;
7: }
8: public User getUser(){
9: return this.user;
10: }
11: public String execute(){
12: return SUCCESS;
13: }
14: }
對應的user類:
1: public Class User{
2: private String username;
3: private String password;
4:
5: public String getPassword() {
6: return password;
7: }
8: public void setPassword(String password) {
9: this.password = password;
10: }
11:
12: public String getUsername(){
13: return username;
14: }
15: public void setUsername(String username){
16: this.username = username;
17: }
18: }
前台html頁面代碼
1: <form action="login" method="post">
2: <label>username:</label>
3: <input type="text" name="user.username">
4: <label>password:</label>
5: <input type="text" name="user.password">
6: </form>
表單域的name由對象名和屬性名組成,中間用.連接,Action對象被創建后,通過setter進行賦值。Action result頁面則通過${user.username}來訪問。
二. 后台向前端傳值
(1)使用Struts2的標簽
對應Action:
1: public Class CollectAction extends ActionSupport{
2: private String [] arryStr;
3: //遍歷list
4: private List<User> list;
5: private Map<String,String> map;
6: private Map<Integer,User> userMap;
7: private Map<String,List<User>> userListMap;
8:
9: public void setArryStr(String[] arryStr){
10: this.arryStr = arryStr;
11: }
12: public String[] getArryStr(){
13: return arryStr;
14: }
15:
16: //省略其他的getter與setter
17: public String execute(){
18:
19: arryStr[] = new String[]{"wbl","sdfsdf","gfg"};
20:
21: list.add(new User("wbl","123"));
22: list.add(new User("avd","ggg"));
23: list.add(new User("eee","iii"));
24:
25: map.put("key1","value1");
26: map.put("key2","value2");
27: map.put("key3","value3");
28:
29: userMap.put(1,new User("wbl","123"));
30: userMap.put(2,new User("avd","ggg"));
31:
32: userListMap.put("user",list);
33: }
34: }
Action對應的JSP頁面:
1: <div id="arryStr">
2: <!-- iterator遍歷String 字符數組 -->
3: <s:iterator value="arryStr" id="arryValue">
4: <span><s:property value="arryValue" /></span>
5: </s:iterator>
6: </div>
7:
8: <div id="list">
9: <!-- iterator遍歷List集合 -->
10: <table>
11: <s:iterator value="list" id="user">
12: <tr>
13: <td><s:property value="username" /></td>
14: <td><s:property value="password" /></td>
15: </tr>
16: </s:iterator>
17: </table>
18: </div>
19:
20: <div id="map">
21: <!-- iterator遍歷Map中的String字符串 -->
22: <s:iterator value="map" id="column">
23: <tr>
24: <td>Key:<s:property value="key" /></td>
25: <td>Value:<s:property value="value" /></td>
26: </tr>
27: </s:iterator>
28: </div>
29:
30: <div id="userMap">
31: <!-- iterator遍歷Map中的User 對象(Object) -->
32: <s:iterator value="userMap" id="column">
33: <tr>
34: <td><s:property value="value.username"/></td>
35: <td><s:property value="value.password"/></td>
36: </tr>
37: </s:iterator>
38: </div>
39:
40: <div id="userlistMap">
41: <!-- iterator遍歷Map中的List集合 -->
42: <s:iterator value="userListMap" id="column">
43: <s:set var="total" name="total" value="#column.value.size"/>
44: <s:iterator value="#column.value" id="col" status="st">
45: <tr>
46: <td><s:property value="username"/></td>
47: <td><s:property value="password"/></td>
48: </tr>
49: </s:iterator>
50: </s:iterator>
51: </div>
(2)AJAX
ajax方式可以實現異步更新數據,這里我采用json格式傳輸數據。
首先,建立一個action:
1: public class ajaxAction extends ActionSupport{
2: private JSONObject dataObj; //向前台傳遞的JSON數據
3:
4: public JSONObject getDataObj() {
5: return dataObj;
6: }
7:
8: public void setDataObj(JSONObject dataObj) {
9: this.dataObj = dataObj;
10: }
11:
12: public String execute(){
13: dataObj = new JSONObject();
14: dataObj.put("key","value");
15: dataObj.put("result","SUCCESS");
16: return SUCCESS;
17: }
18: }
struts.xml中action的配置
1: <action name="ajax" class="com.bigdata.action.ajaxAction">
2: <result type="json">
3: <param name="root">dataObj</param>
4: <param name="callbackParameter">jsoncallback</param>
5: </result>
6: </action>
如果為某個action指定了一個類型為json的Result,則該Result無須映射到任何視圖資源,因為json插件會負責將Action里的狀態信息序列化成JSON格式的字符串,並將該字符串返回給客戶端瀏覽器。
json類型的Result允許指定的參數
root:設置該參數將不再把整個Action對象序列化成JSON字符串,而只是將該參數所指定的Action的屬性序列化成JSON字符串返給客戶端,本例中將會把dataObj進行序列化。
callbackParameter: 配置該參數之后,才能進行JSON的跨域傳輸。
前端利用jQuery完成AJAX交互
1: <div id="ajaxTest">
2: <input type="button" value="test" id="show">
3: </div>
4: </body>
5: <script type="text/javascript" src="js/jquery.js"></script>1:
2: <script>
3: $(function(){4: $("show").click(function(){5: $.getJSON(
6: /*訪問Action的URL地址*/7: "http://localhost:8080/bigData/ajax?jsoncallback=?",8: /*得到服務器響應之后的操作*/9: function(respose){10: if(respose.result == "SUCCESS")11: $("#ajaxTest").append("<span>SUCCESS</span>");12: })
13: })
14: })
</script>
6: </html>
function中的參數response對應Action中的dataObj,此時就可以獲得由后端傳入的值。