`
wangming2012
  • 浏览: 141070 次
  • 性别: Icon_minigender_1
  • 来自: 枣阳
社区版块
存档分类
最新评论

Struts2 中的数据传输

阅读更多

1.     如何将参数从界面传递到Action

你可以把Struts2中的Action看做是Struts1Action+ActionForm,即只需在Action中定义相关的属性(要有getters/setters方法),然后界面传参的名称跟这些属性保持一致即可。普通的数据类型,将可自动转换。(空字符串转换为int类型时将报错)

 

2.     如何将数据从Action传输到JSP

可通过多种方式传输

通过Action的属性传输

直接给action的属性赋值,在转向之后的JSP中,直接用标签<s:property value=OGNL表达式/>取出即可。

比如:

publicclass UserAction {

    private String username;

    private Integer age;

    privatebooleanvalid;

   

    //查看用户的详细信息

    public String detail(){

      

       username = "张三";

       age = 18;

       valid = true;

      

       return"detail";

    }

 

detail.jsp中,引入struts2taglib,用这些taglib来呈现数据:

 

<%@ 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;

 

publicclass Utils {

    publicstatic String toUpperCase(String str){

       return str.toUpperCase();

    }

   

    public String toLowerCase(String str){

       return str.toLowerCase();

    }

}

 

 

Action类的定义如下:

publicclass UserAction {

    private String username;

    //查看用户的详细信息

    public String detail(){

       ……………………

       return"detail";

    }

   

    //这个方法可以在JSP中用OGNL表达式直接调用!

    public Utils getUtils(){

       returnnew 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;

 

publicclass User {

    private String username;

    public String getUsername() {

       returnusername;

    }

    publicvoid setUsername(String username) {

       this.username = username;

    }

   

}

 

 

publicclass 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属性!

分享到:
评论
1 楼 sinotao1 2013-04-20  
写得非常好。

相关推荐

    使用Struts2的JSON插件来实现JSON数据传递

    在Web应用中,JSON常用于前后端的数据传输,因为它可以被JavaScript直接解析,从而简化了客户端的数据处理。 Struts2 JSON插件的安装与配置是使用其功能的第一步。首先,你需要将struts2-json-plugin相关的JAR文件...

    struts2 Https 配置

    在Struts2中配置HTTPS主要涉及以下几个步骤: 1. **配置服务器**:首先,你需要在服务器端(如Tomcat、Jetty等)启用HTTPS。这通常涉及到修改服务器的配置文件(如Tomcat的`server.xml`),添加一个监听443端口的...

    struts2 json传输对象文档+jar包

    标题提到的"struts2 json传输对象文档"是指Struts2支持JSON格式的数据传输,使得Action类可以直接返回JSON对象,以便在客户端进行处理。这种功能极大地提高了Web应用的响应速度和用户体验,因为可以避免不必要的页面...

    jQuery+json异步实现JSP和struts2之间的数据传递

    在Web开发中,数据传输是核心任务之一,尤其是在前后端分离越来越明显的今天。"jQuery+json异步实现JSP和struts2之间的数据传递"是一个典型的应用场景,它结合了前端JavaScript库jQuery与后端MVC框架Struts2,通过...

    使用struts2 和ajax进行传递json数据

    综上所述,Struts2和Ajax的结合使用,能够实现高效的前后端数据交互,通过JSON数据格式,使数据传输更加便捷和高效。在实际项目中,开发者应熟练掌握这两种技术的结合,以提高Web应用的用户体验。

    Android开发HTTP传输数据到Struts2生成Json数据案例

    在Struts2中,我们可以创建一个Action类来接收和处理HTTP请求。为了接收JSON数据,需要在Action类的方法上使用`@Action("your-action")`注解,并设置接受的参数类型为`Map, Object&gt;`或自定义的Java对象,Struts2会...

    struts2与json整合

    在Struts2中,Action类中的方法负责处理来自客户端的请求。为了返回JSON数据,可以定义一个如下的Action方法: ```java public String getXxx() { return "aaa"; } ``` 当客户端调用此方法时,Struts2会自动将...

    Struts2+Json+Android简单实现

    在Struts2中,我们可以配置Action类返回JSON类型的结果,这样当客户端(如Android应用)发起请求时,服务器会返回JSON格式的数据。这些数据可以包含对象、数组、字符串、数字等多种类型,非常适合移动设备上的数据...

    struts2简单实例

    - Action类:在Struts2中,Action类是业务逻辑的载体,它处理用户请求并返回结果。在这个实例中,可能会有一个名为`StudentInfoAction`的类,包含查询学生信息的方法,如`queryStudents()`。 - 属性和getter/...

    struts2实现文件下载功能

    这告诉Struts2框架需要以流的形式传输数据。在Struts2的配置文件(struts.xml)中添加相应的配置。 3. **设置Content-Type和Content-Disposition**: - 在Action类中,使用`ValueStack`或`ActionContext`来设置...

    struts2 使用action属性接收中文参数(post提交)

    charset=UTF-8" language="java" %&gt;`指令应设置正确的字符集,以确保从页面到服务器的数据传输是正确的。 5. **Struts2拦截器(Interceptor)**: - 自定义拦截器可以在请求到达Action之前进行字符编码的处理,...

    struts2中文乱码解决Demo

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展、模块化且易于管理的企业...通过这个DEMO,开发者可以更好地理解和解决Struts2中的中文乱码问题,从而确保应用能够正确处理中文字符,提供良好的用户体验。

    struts2-docs

    3. **配置文件**:在Struts2中,struts.xml是主要的配置文件,用于定义Action类、结果类型、拦截器等。 4. **拦截器(Interceptor)**:拦截器是Struts2的一大特色,它们按照预定义的顺序在Action调用前后执行,...

    Struts2与JSON

    而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得客户端和服务器之间的数据传输变得更加简单。将Struts2与JSON整合,可以实现高效、动态的Web交互。 首先,我们要理解Struts2整合JSON的...

    struts2-json-plugin源码

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端之间的数据传输。在Struts2中,通过整合JSON插件,可以方便地将Action的返回结果转换为JSON格式,供前端JavaScript处理。 `struts2-...

    struts2资源包

    在Struts2中,如果你需要让用户上传文件,这个库就必不可少,它提供了处理文件上传请求、解析文件内容和存储到服务器的工具。 3. **commons-io-1.3.2.jar**:Apache Commons IO是Java I/O操作的实用工具库。在处理...

    struts2中文教程

    在Web服务或Ajax交互中,JSON作为数据传输的媒介,能够提升数据交换的效率。 Struts2的JSON插件允许我们将Action的返回值直接转换为JSON格式,无需额外的序列化工作。通过配置,我们可以指定哪些Action响应JSON请求...

    Struts2演示源码

    首先,关于`Action result`,它是Struts2中的一个关键概念,用于控制请求后的视图呈现。四种转发类型通常包括:`dispatcher`(默认),将请求分派到指定的JSP或Servlet;`redirect`,执行HTTP重定向,避免回发问题;...

Global site tag (gtag.js) - Google Analytics