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 中的数据传输的几种方式的更多相关文章

  1. Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)

    1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...

  2. Struts2中Action配置的三种方式

    <!-- 方案一:一个action对应一个方法; --> <action name="add" class="com.gxxy.struts.kp03_ ...

  3. Struts中的数据处理的三种方式

    Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...

  4. 【深入Struts2】获取ServletAPI的三种方式

    一:获取servletAPI的三种方法 在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest.HttpSession和ServletContext.Strut ...

  5. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  6. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  7. Shell脚本中执行mysql的几种方式(转)

    Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...

  8. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  9. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...

随机推荐

  1. (一〇九)UIButton的使用技巧 -imageView、titleLabel、圆角等

    UIButton是一个常用控件,使用方法十分基本,但是有很多技巧常常不被注意,本文主要介绍UIButton的一些较高级技巧,用于实现图片和标签显示的美观性等. 开发时常常碰到按钮的下侧或者右侧有标题的 ...

  2. SpringMVC源码分析--容器初始化(三)HttpServletBean

    在上一篇博客springMVC源码分析--容器初始化(二)DispatcherServlet中,我们队SpringMVC整体生命周期有一个简单的说明,并没有进行详细的源码分析,接下来我们会根据博客中提 ...

  3. React Native项目组织结构介绍

    代码组织: 目录结构: . ├── components //组成应用的各个组件 │   ├── Routers.android.js //每个组件若实现不一样,分为android的实现和ios的实现 ...

  4. React Native入门教程 1 -- 开发环境搭建

    有人问我为啥很久不更新博客..我只能说在学校宿舍真的没有学习的环境..基本上在宿舍里面很颓废..不过要毕业找工作了,我要渐渐把这个心态调整过来,就从react-native第一篇博客开始.话说RN也出 ...

  5. Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT

    本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保 ...

  6. Accounting Flexfield Setup and Usage (Doc ID 124333.1)

    APPLIES TO:Oracle General Ledger - Version 11.5.10.2 to 12.1.3 [Release 11.5.10 to 12.1] Information ...

  7. Cocos2D:塔防游戏制作之旅(七)

    用这3个变量,你可以创建多种不同类型的炮塔,它们可以有着不同的攻击属性,比如长距离重型攻击力,但是慢速攻击的炮塔,或者是渴望快速攻击但是攻击范围近的炮塔. 最后,代码包括了一个draw方法,它在炮塔周 ...

  8. Unable to handle 'index' format version '2', please update rosdistro的解决办法

    之前安装的ROS是Fuerte版本的,好久没有更新,不知不觉又出来了好几个新的版本,今天删除了Fuerte,计划安装Hydro版本的尝尝新,按照官网的安装流程,很快就可以把新版本安装上去了,但是在&q ...

  9. [Python]网络爬虫(三):异常的处理和HTTP状态码的分类

    先来说一说HTTP的异常处理问题. 当urlopen不能够处理一个response时,产生urlError. 不过通常的Python APIs异常如ValueError,TypeError等也会同时产 ...

  10. 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计

    .主要是为了总结一下 对这些概念有个直观的认识; . 作者 : 万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/198 ...