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 ...
随机推荐
- 分布式数据库HBase表设计
比较常用的数据库是关系型数据库,但很多场景下nosql数据库会更加擅长,从sql到nosql实施的第一步就是设计表结构,这是两种不同的思维方式,这里说下HBase表设计. 需求:需要一张stock表用 ...
- Mybatis源码之Statement处理器RoutingStatementHandler(三)
RoutingStatementHandler类似路由器,在其构造函数中会根据Mapper文件中设置的StatementType来选择使用SimpleStatementHandler.Prepared ...
- Java数组的应用:案例:杨辉三角,三维数组,字符串数组
//import java.util.Arrays; //包含Arrays //import java.util.Random; public class HelloWorld { public st ...
- 推荐一个计算机视觉图书:python计算机视觉编程
编辑部的主页:好像没啥用 http://shop.oreilly.com/product/0636920022923.do 每章的代码,github上面的:中文版 https://github.com ...
- Android Studio查看应用数字签名-android学习之旅(76)
Android Studio和Eclispe还是有比较大的区别,在这地方,eclipse可以直接在设置里面,而AS就需要通过Terminal来查看 步骤 1.首先定位到.android 一般都是在C盘 ...
- 一键安装LAMP
一键安装LAMP LAMP是Linux,Apache,MySQL和PHP合起来的简称,用于开发网站.对于初学者而言,没有什么比一键部署一个LAMP开发环境更省心的了,到下面的网址下载BitNami: ...
- jpa一对多映射案例
订单和订单项就是一对多的关系.一个订单有多个订单项,一个订单项属于某个订单. 订单和订单项映射后的表结构如下: 订单表结构 订单项表结构 下面就以订单和订单项为例介绍多对多映射关系的实例开发 pers ...
- 开源电子商务平台:OfBiz
OFBiz是一个电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级.跨平台.跨数据库.跨应用服务器的多层.分布式电子商务类WEB应用系统的框架. ...
- LayoutInflater和inflate的用法,有图有真相
1.概述 有时候在我们的Activity中用到别的layout,并且要对其组件进行操作,比如: A.acyivity是获取网络数据的,对应布局文件为A.xml,然后需要把这个数据设置到B.xml的组件 ...
- android开发之http协议
http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...