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来呈现数据,该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 中的数据传输的几种方式的更多相关文章
- Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)
1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...
- Struts2中Action配置的三种方式
<!-- 方案一:一个action对应一个方法; --> <action name="add" class="com.gxxy.struts.kp03_ ...
- Struts中的数据处理的三种方式
Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...
- 【深入Struts2】获取ServletAPI的三种方式
一:获取servletAPI的三种方法 在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest.HttpSession和ServletContext.Strut ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- Shell脚本中执行mysql的几种方式(转)
Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...
随机推荐
- Python爬虫! 单爬,批量爬,这都不是事!
昨天做了一个煎蛋网妹子图的爬虫,个人感觉效果不错.但是每次都得重复的敲辣么多的代码(相比于Java或者其他语言的爬虫实现,Python的代码量可谓是相当的少了),就封装了一下!可以实现对批量网址以及单 ...
- Android 5.x 权限问题解决方法
android 5.x开始,引入了非常严格的selinux权限管理机制,我们经常会遇到因为selinux权限问题造成的各种avc denied困扰. 本文结合具体案例,讲解如何根据log来快速解决9 ...
- 安卓仿QQ红包领取详情界面动画
为了能清楚的看到这个效果,本人不惜几次花费重金给众群叼发放红包,来查看红包领取详情界面的动画效果,QQ效果如图: 图中我们可以看到,动画处的头像和文字是一起的,即同时并且是整体,注意,是整体进行缩放的 ...
- UNIX网络编程——套接字选项(setsockopt)
setsockopt的一些用法: close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockop ...
- Chapter 3 Protecting the Data(1):理解权限
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39548665,专题目录:http://blog.csdn.net/dba_huangzj ...
- 学习pthreads,使用条件变量进行多线程之间的同步
条件变量提供另一种多线程同步的方法.互斥量通过控制对共享数据的访问来同步任务.条件变量可以根据数据的值来同步任务.条件变量是当一个事件发生时发送信号的信号量.一旦事件发生,可能会有多个线程在等待信号, ...
- Android Studio 从安装到配置使用
Android Studio是谷歌为android量身定制的IDE,在2013年谷歌大会上提出之后一直持续更新,现在已经是功能十分强劲的android开发工具,作为一个android开发者,还是早点转 ...
- AngularJS中的依赖注入
依赖注入 | Dependency Injection 原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所 ...
- (五)超级猜图Demo引出的细节
第一部分: 1.按钮的细节,设置背景和前景图片后,要使得背景显示出来,可以设置内边距,影响内部内容. 显示 图片+文字,用button更简单. 问题是,如果不想按钮被点击,在属性面板取消勾选User ...
- Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术 ...