Struts2 中的数据传输
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来呈现数据:
|
<%@ 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 中的数据传输的更多相关文章
- Struts2 中的数据传输的几种方式
1. 如何将参数从界面传递到Action? 你可以把Struts2中的Action看做是Struts1的Action+ActionForm,即只需在Action中定义相关的属性(要有gette ...
- Struts2中的get、set方法作用:
Struts2中的get.set方法作用: 在Struts2中,客户端和服务器之间的数据传输全部要用到get.set方法:用set方法 ,可以将表单中的值存入Action类.通过Struts2.0标签 ...
- 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式
[转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...
- struts2中从后台读取数据到<s:select>
看到网上好多有struts2中从后台读取数据到<s:select>的,但都 不太详细,可能是我自己理解不了吧!所以我自己做了 一个,其中可能 有很多不好的地方,望广大网友指出 结果如图 p ...
- struts2中各个jar包作用
Struts2.3.4 所需的Jar包及介绍 Jar包的分类 jar包名称 jar包版本 jar包 文件名 jar包 的作用 jar包内包含的主要包路径及主要类 依赖的自有jar包名称 依赖的第三方j ...
- Struts2中Date日期转换的问题
今天跑程序的时候莫名其妙的出现了下面的一个异常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforC ...
- struts2中的jar包
核心包: (后面数字是版本号,不同struts2版本,数字可能不一样.) struts2-core-2.1.8.1 struts2的核心jar包,不可缺少的 xwork-core-2.1.6 xwor ...
- Struts2中的EasyUI
Struts2中的EasyUI 一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tre ...
- struts2中的jsp值传到后台action接收的三种方法
struts2中的Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: <form action="login" method="pos ...
随机推荐
- POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)
[题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...
- windows 7环境下配置oracle 11g 客户端
首先要去官网上下载oracle 11客户端,(我用的是64位系统)地址: http://www.oracle.com/technetwork/database/features/instant-cli ...
- SQL Server使用规范(转)
常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigint ...
- DataTable 分页
#region DataTable 分页 /// <summary> /// Datatable 分页 /// </summary> /// <param name=&q ...
- iBatis之type
iBatis下关于type的UML图,展示iBatis下关于类型的处理和注册等.
- python 中 struct 用法
下面就介绍这个模块中的几个方法. struct.pack():我的理解是,python利用 struct模块将字符(比如说 int,long ,unsized int 等)拆成 字节流(用十六进制表示 ...
- bzoj 2656 [Zjoi2012]数列(sequence)(高精度)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2656 [题意] 计算大数递推式 [思路] 高精度 [代码] #include<c ...
- C++ 我想这样用(一)
虽然还是菜鸟,但我是一个地地道道的c程序员,甚至一度很讨厌C++(虽然现在也是). 为了在不用C++的情况下学习和使用面向对象而长期奔走,曾经用过一年的Python,后终放弃.之后很长一段时间里摆弄O ...
- BNUOJ-29358 Come to a spring outing 搜索,DP
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29358 状态虽然很多,但是非常稀疏,dfs搜索然后剪下枝.. 或者DP,f[i][j][k ...
- 教程-DelphiXE7如何调用Java Class,JAR等文件?
源文地址:http://jingyan.baidu.com/article/e4d08ffdb61b040fd3f60d44.html 第一步,我们先在互联网上把java2pas这个工具下载下来. 下 ...