Struts2与JSON



1.   必需的库

struts2-json-plugin-2.1.8.1.jar

json-lib-2.1.jar

版本号可能会有所不同,而且这两个包也是MyEclipse在创建Struts2项目时自带并且已经包含的。

2.   setter与getter

Action类中私有成员变量的setter和getter方法在Struts2框架下会被自动转化成HttpServletRequest对象的getParameter方法和setAttribute方法,也就是说setter方法的实质就是从request中取出名字与变量名相同的数据,并将其赋值给该变量;而getter方法就是将变量名与值分别作为key和value存入request对象的attribute中。

理解了这一点,显而易见,不需要反馈到View层的Action私有变量是没有必要设置它的getter方法的。这在JSON生成之中尤为重要,因为多余的getter方法会把私有变量的值传递到JSON之中。

3.   Action类中JSON的生成机制

需要生成JSON的Action最好不要实现ModelDriven接口,其原因正如上所述,实现了ModelDriven接口的Action类必须实现getModel方法,其导致的结果就是生成的JSON数据中有一串名为“model”的数据。它可能会暴露一些并不需要客户端知道的数据,同时也会增加JSON数据的大小。

JSON数据在Action类中是根据getter方法的返回值自动装配的,也就是说完全可以不需要重写execute方法。JSON的生成机制(上述两个必需的包中提供的方法)会直接从setter方法获取到request中提供的值,并且自动装配getter方法提供的返回值。期间如果有其它的功能操作,如计算、查询数据库、重组数据等,可以写到getter方法中,也可以写到execute方法中统一执行。

这里需要注意的是execute方法的返回值字符串是无效的,可以随意设置,因为在后面的配置文件中并不会用到。

getter方法返回值的类型可以采用基本数据类型、String类、集合类(List、Map等)以及诸如Double、Integer等打包类。这些都不会影响JSON的生成,因为对于结果而言都是字符串类型的;而集合类在生成时会被自动迭代,因此生成的结果中其本身的集合类型(列表、映射表等)也不会改变。

因此在Action类可以将所有的结果数据保存到一个List或Map中在通过getter方法输出,也可以设置多个getter方法返回不同类型、不同变量的数据。这些数据在JSON中的名称与getter方法名中一致。

4.   配置文件的设定

与基本的Action相比,生成JSON的Action在配置文件struts.xml中主要有两点不同:

1.      不能与基本的Action配置在同一个package中,新的package必须扩展自(extends)json-default命名空间;

2.      result标签中可以不包含name属性(因为没用),但是必须包含type属性,且值必须为“json”,即<result type=”json” ></result>,表明这是一个JSON数据,不需要跳转页面。

5.   示例

JsonAction类:

package com;  
   
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
   
import com.opensymphony.xwork2.ActionSupport;  
   
public class JsonAction extends ActionSupport {  
   
    private static final long serialVersionUID = 4905130009784850861L;  
     
    private String username;  
    private String password;  
//  private List<String> result;  
    private Map<String, String> map;  
     
    public void setUsername(String username) {  
       this.username = username;  
    }  
    public void setPassword(String password) {  
       this.password = password;  
    }  
     
//  public List<String> getResult() {  
//     return this.result;  
//  }  
    public Map<String, String> getResult() {  
       return map;  
    }  
   
    public String execute() {  
//     result = new ArrayList<String>();  
//     result.add(username);  
//     result.add(password);  
       map = new HashMap<String, String>();  
       map.put("usr", username);  
       map.put("pwd", password);  
       map.put("logon", "true");  
        
       return SUCCESS;  
    }  
}  

struts.xml:

<?xml version="1.0"encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">  
<struts>  
    <constant name="struts.devMode" value="true"></constant>  
     
    <package name="json" extends="json-default">  
       <action name="loginJson"class="com.JsonAction">  
           <result type="json"></result>  
       </action>  
    </package>  
</struts>    

结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值