Struts2 中的数据传输的几种方式
原文地址:http://blog.csdn.net/li_tengfei/article/details/6098126
?
1.???? 如何將參數從界面傳遞到Action?
你可以把Struts2中的Action看做是Struts1的Action+ActionForm,即只需在Action中定義相關的屬性(要有getters/setters方法),然后界面傳參的名稱跟這些屬性保持一致即可。普通的數據類型,將可自動轉換。(空字符串轉換為int類型時將報錯)
?
2.???? 如何將數據從Action傳輸到JSP?
可通過多種方式傳輸
通過Action的屬性傳輸
直接給action的屬性賦值,在轉向之后的JSP中,直接用標簽<s:property value=”OGNL表達式”/>取出即可。
比如:
| public class UserAction { ??? private String username; ??? private Integer age; ??? private boolean valid; ??? ??? //查看用戶的詳細信息 ??? public String detail(){ ?????? ?????? username = "張三"; ?????? age = 18; ?????? valid = true; ?????? ?????? return "detail"; ??? } ? |
?
在detail.jsp中,引入struts2的taglib,用這些taglib來呈現數據,該action在棧頂,:
?
| <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ? <body> username:<s:property value="username"/> <br/> valid:<s:property value="valid"/> <br/> age:<s:property value="age"/> <br/> ? ? </body> </html> ? |
?
?
通過ActionContext傳輸
可通過ActionContext.getContext().put()方法來傳值
?
在Action的方法中:
| ??? public String detail(){ ?????? ?????? ActionContext.getContext().put("name", "王五"); ?????? ?????? username = "張三"; ?????? ?????? ActionContext.getContext().put("username", "李四"); ?????? ?????? ?????? return "detail"; ??? } |
?
在JSP中:
| ? <body> ??? ??? <!-- 從ActionContext中取name的值 --> ??? name: <s:property value="#name"/> <br/> ??? ??? <!-- 先看Action中有沒有name屬性,如果沒有,則到ActionContext中找name的值 --> ??? name: <s:property value="name"/> <br/> ??? ??? <!-- 從ActionContext中取username的值 --> ??? username : <s:property value="#username"/> <br/> ??? ??? <!-- 從Action對象中取username屬性 --> ??? username : <s:property value="username"/> <br/> ??? ? </body> |
?
?
通過request/session等傳輸
?
可通過ServletActionContext.getRequest()/getSession()等方法來獲得request/session對象,然后調用其中的setAttribute()方法來傳值。
?
演示各種數據的傳輸、展現技巧!
?
在Action中通過request/session來傳值:
| ??? public String detail(){ ?????? ?????? //通過request ?????? ServletActionContext.getRequest().setAttribute("sex", "男"); ?????? ?????? //通過session ?????? ServletActionContext.getRequest().getSession().setAttribute("address", "北京"); ?????? ?????? //通過session ?????? ActionContext.getContext().getSession().put("postcode", "1234567"); ?????? ?????? return "detail"; ??? } |
?
?
?
在JSP中取值:
?
| ? <body> ??? ??? <!-- 從request中取sex值 --> ??? request.sex = <s:property value="#request.sex"/> <br/> ??? request.sex = <s:property value="#request['sex']"/> <br/> ??? ??? <!-- 從session中取值 --> ??? session.address = <s:property value="#session.address"/> <br/> ??? session.postcode = <s:property value="#session.postcode"/> <br/> ??? ??? <!-- 依次搜索page/request/session/application scope取值 --> ??? attr.postcode=<s:property value="#attr.postcode"/> <br/> ? </body> |
?
傳遞復雜對象及集合對象
?
如果在Action中傳遞一個復雜的對象到JSP,在JSP中,通過OGNL表達式,可以用句點“.”來訪問對象中的屬性。
如果傳遞一個集合對象到JSP,在JSP中可以通過<s:iterator>標簽來訪問集合中的數據。
?
Action中的代碼:
| ?????? //傳遞復雜對象 ?????? User u = new User(); ?????? u.setUsername("admin"); ?????? Group g = new Group(); ?????? g.setName("管理員組"); ?????? u.setGroup(g); ?????? ActionContext.getContext().put("user", u); ?????? ?????? //列表數據 ?????? List list = new ArrayList(); ?????? for(int i=0; i<10; i++){ ?????????? User user = new User(); ?????????? user.setUsername("User"+i); ?????????? user.setAge(10+i); ?????????? list.add(user); ?????? } ?????? ActionContext.getContext().put("users", list); |
?
JSP中的代碼:
| ??? <!-- 通過句點訪問對象的屬性值 --> ??? user.username=<s:property value="#user.username"/> <br/> ??? user.group.name=<s:property value="#user.group.name"/> <br/> ??? ??? users: <br/> ??? <s:iterator value="#users"> ?????? <!-- 這個訪問的是當前循環的user對象中的username屬性 --> ?????? username:<s:property value="username"/>,<s:property value="age"/> <br/> ??? </s:iterator> ??? ??? <!-- 這個訪問的是Action對象中的username屬性 --> ??? username:<s:property value="username"/> <br/> |
?
利用OGNL表達式訪問靜態方法、普通的實例方法及Action對象中的方法
?
假設有一個工具類,如下所示:
| package cn.com.leadfar.utils; ? public class Utils { ??? public static String toUpperCase(String str){ ?????? return str.toUpperCase(); ??? } ??? ??? public String toLowerCase(String str){ ?????? return str.toLowerCase(); ??? } } ? |
?
Action類的定義如下:
| public class UserAction { ??? private String username; ??? //查看用戶的詳細信息 ??? public String detail(){ ?????? …………………… ?????? return "detail"; ??? } ??? ??? //這個方法可以在JSP中用OGNL表達式直接調用! ??? public Utils getUtils(){ ?????? return new Utils(); ??? } |
?
?
則在JSP中可以直接通過OGNL表達式來訪問這些方法:
| <!-- 調用靜態方法 --> <s:property value="@cn.com.leadfar.utils.Utils@toUpperCase(username)"/> ? <!-- 利用OGNL表達式創建Utils對象,并調用它的實例方法 --> <s:property value="new cn.com.leadfar.utils.Utils().toLowerCase(username)"/> ? <!-- 調用Action對象的getUtils().toLowerCase()方法 --> <s:property value="utils.toLowerCase(username)"/> |
?
【注意,在最新的struts2版本中,要想在JSP中通過OGNL表達式訪問靜態方法,則必須配置如下constant:
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
】
?
?
如何在iterator循環體內訪問外部的同名屬性?
?
請看下述代碼:
| package cn.com.leadfar.struts2.actions; ? public class User { ??? private String username; ??? public String getUsername() { ?????? return username; ??? } ??? public void setUsername(String username) { ?????? this.username = username; ??? } ??? } ? ? |
| public class UserAction { ??? private String username; ? ??? //查看用戶的詳細信息 ??? public String detail(){ ?????? ?????? username = "張三"; ?????? ?????? ?????? //列表數據 ?????? List list = new ArrayList(); ?????? for(int i=0; i<10; i++){ ?????????? User user = new User(); ?????????? user.setUsername("User"+i); ?????????? list.add(user); ?????? } ?????? ActionContext.getContext().put("users", list); ?????? ?????? return "detail"; ??? } |
?
在JSP中通過<s:iterator>訪問列表數據:
| ??? <s:iterator value="#users"> ?????? <!-- 這個訪問的是當前循環的user對象中的username屬性 --> <s:property value="username"/> ?????? <s:property value="#root[1].username"/> <br/> ??? </s:iterator> |
?
上面這個例子中,<s:property value=”username”>訪問的是當前循環中的user對象的username屬性,而<s:property value=”#root[1].username”/>訪問的是UserAction對象中的username屬性!
總結
以上是生活随笔為你收集整理的Struts2 中的数据传输的几种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: exchange 2010 中OAB 排
- 下一篇: 年季报