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. How to Find the Self Service Related File Location and Versions

     How to Find the Self Service Related File Location and Versions (文档 ID 781385.1) In this Document ...

  2. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  3. Android进阶(十一)Android系统架构讲解

    如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...

  4. JAVA代理机制

    JAVA代理相关主要知识如下: (1)利用代理可以在运行时创建一个实现了一组给定接口的新类.         这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. (2)假设有一个表示接口的C ...

  5. Mybatis源码之(TypeAliasRegistry)TypeAlias别名实现机制

    在Mybatis编程中我们经常会用到将某个bean作为参数类型parameterType或者结果返回值类型ResultType,所以很多时候我们需要把完成的Bean的包名在mapper文件中写上,如下 ...

  6. python的sys模块

    Sys模块函数之多,我只能选取自己认为比较实用的一些函数列在此处.借马云找员工的说法,"找最合适的而不是最天才的",这句话,我个人觉得在很多方面都能适应,学习也不在话下.Sys模块 ...

  7. (NO.00002)iOS游戏精灵战争雏形(十二)

    首先要声明的是,前几篇实现的shoot方法不是一定会命中目标,这取决于目标运行的速度,子弹的速度,子弹发射的时机以及弹道路径中是否有障碍物等等. 这也是符合实际情况的.如果你的要求是一旦发出子弹必定击 ...

  8. 高通msm8994启动流程简介

    处理器信息 8994包含如下子系统: 子系统 处理器 含义 APSS 4*Cortex-A53 应用子系统 APSS 4*Cortex-A57 应用子系统 LPASS QDSP6 v5.5A(Hexa ...

  9. C++闭包: Lambda Functions in C++11

    表达式无疑是C++11最激动人心的特性之一!它会使你编写的代码变得更优雅.更快速! 它实现了C++11对于支持闭包的支持.首先我们先看一下什么叫做闭包 维基百科上,对于闭包的解释是: In progr ...

  10. 《java入门第一季》StringBuffer类小案例

    /* * 把数组拼接成一个字符串 */ public class StringBufferTest2 { public static void main(String[] args) { // 定义一 ...