您的位置:首页 > 编程语言 > Java开发

Struts2 中的数据传输

2016-07-25 20:09 477 查看

1.     如何将参数从界面传递到Action?

你可以把Struts2中的Action看做是Struts1的Action+ActionForm,即只需在Action中定义相关的属性(要有getters/setters方法),然后界面传参的名称跟这些属性保持一致即可。普通的数据类型,将可自动转换。(空字符串转换为int类型时将报错)

2.     如何将数据从Action传输到JSP?

可通过多种方式传输

通过Action的属性传输

直接给action的属性赋值,在转向之后的JSP中,直接用标签<s:property value=”OGNL表达式”/>取出即可。

比如:

<span style="font-size:18px;">public class UserAction {
private String username;
private Integer age;
private boolean valid;

//查看用户的详细信息
public String detail(){

username = "张三";
age = 18;
valid = true;

return "detail";
}</span>


在detail.jsp中,引入struts2的taglib,用这些taglib来呈现数据: 

<span style="font-size:18px;"><%@ 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></span>


通过ActionContext传输 

可通过ActionContext.getContext().put()方法来传值

在Action的方法中:

<span style="font-size:18px;"> public String detail(){

ActionContext.getContext().put("name", "王五");

username = "张三";

ActionContext.getContext().put("username", "李四");

return "detail";
}</span>


在JSP中: 

<span style="font-size:18px;"><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></span>


通过request/session等传输 

可通过ServletActionContext.getRequest()/getSession()等方法来获得request/session对象,然后调用其中的setAttribute()方法来传值。

演示各种数据的传输、展现技巧!

在Action中通过request/session来传值:

<span style="font-size:18px;">public String detail(){

//通过request
ServletActionContext.getRequest().setAttribute("sex", "男");

//通过session
ServletActionContext.getRequest().getSession().setAttribute("address", "北京");

//通过session
ActionContext.getContext().getSession().put("postcode", "1234567");

return "detail";
}</span>


 在JSP中取值:

<span style="font-size:18px;"><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></span>


 传递复杂对象及集合对象

如果在Action中传递一个复杂的对象到JSP,在JSP中,通过OGNL表达式,可以用句点“.”来访问对象中的属性。

如果传递一个集合对象到JSP,在JSP中可以通过<s:iterator>标签来访问集合中的数据。

Action中的代码:

<span style="font-size:18px;"><span style="font-size:18px;">//传递复杂对象
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);</span></span>


JSP中的代码:

<span style="font-size:18px;">  <!-- 通过句点访问对象的属性值 -->
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/></span>


 利用OGNL表达式访问静态方法、普通的实例方法及Action对象中的方法
假设有一个工具类,如下所示:

<span style="font-size:18px;">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();
}
}</span>


Action类的定义如下: 

<span style="font-size:18px;">public class UserAction {
private String username;
//查看用户的详细信息
public String detail(){
……………………
return "detail";
}

//这个方法可以在JSP中用OGNL表达式直接调用!
public Utils getUtils(){
return new Utils();
}</span>


则在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属性! 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: