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. iOS中 iOS10 权限崩溃问题 韩俊强的CSDN博客

    iOS10 权限崩溃问题 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 今天 手机升级了 iOS10 Beta,然后用正在开发的项目 装了个ipa包,发现点击有 ...

  2. Java四大名著下载大全(中文+英文)

    转自:http://www.blogjava.net/kuuyee/archive/2013/06/03/400084.html 抽时间整理了一下Java四大名著,分享出来方便大家学习! Note 郑 ...

  3. python的operator.itemgetter('click')用于定义获取'click'项的函数

    python的排序参见文章http://blog.csdn.net/longshenlmj/article/details/12747195 这里介绍 import operator模块 operat ...

  4. Dynamics CRM2013 sub grid中数据翻页问题

    CRM2013中一个很低级很令人无语的BUG,见下图subgrid中的明细条目超过当前页设置的条目后会有翻页,在底下有个paging bar会显示条数.页数.当前所处页数 但sp1版本的CRM打上ur ...

  5. 纯HTML5APP与原生APP的差距在哪?

    笔者写过一些纯H5的APP,虽然开发起来的确很快很舒服,但和原生比起来纯H5APP还是有很多问题,主要聚集在以下几个方面: 1.动画 动画有很多种,比如侧边栏菜单的滑入滑出.元素的响应动画.页面切换之 ...

  6. Androd选取相册照片和拍照处理-android学习之旅(62)

    实现如下图所示效果 核心代码 -构建打开相册和拍照的Intent 拍照 File outputImage = new File(Environment.getExternalStorageDirect ...

  7. 1013. Battle Over Cities (25)

    题目如下: It is vitally important to have all the cities connected by highways in a war. If a city is oc ...

  8. 69个Spring面试题

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...

  9. linux(centos)下mysql忘记root密码

    1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的  状态下,其他的用户也可以任意地登录和修 ...

  10. Spring AOP (一)

    一.AOP 是什么? AOP 是Aspect Oriented Programaing 的简称,意思是面向切面编程,AOP的应用场合是受限的,一般只适合于那些具有横切逻辑的应用场合:如性能检测.访问控 ...