Struts2——对JSON的支持(struts2-json-plugin.jar )

一、struts2对于JSON支持

  struts2提供了一个struts2-json-plugin.jar 用于支持JSON的使用。当我们在struts2中使用JSON的时候必须导入struts2-json-plugin.jar

并且需要一下几点:

  • struts2-json-plugin.jar中struts-plugin.xml配置信息:

    需要转换json的struts.xml文件,其拦截器所在包必须继承json-default





<struts>
    <package name="json-default" extends="struts-default">

        <result-types>
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
        result-types>

        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
            <interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/>

            
            <interceptor-stack name="jsonValidationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancelparam>
                interceptor-ref>
                <interceptor-ref name="jsonValidation"/>
                <interceptor-ref name="workflow"/>
            interceptor-stack>

        interceptors>

    package>
struts>
  • 通过配置信息我们可以知道:
    1.json-default其实是继承了struts-default的
    2.定义了一个name为json的返回类型和一个name为json的拦截器
    3.我们需要将包继承json-default,相应的result返回类型定义为json


<struts>

    <package name="system" namespace="/system" extends="json-default">
        <action name="elecUserAction_*" class="elecUserAction" method="{1}">

            
            <result name="findJctUnit" type="json">
                
                <param name="includeProperties">\[\d+\]\.ddlCode,\[\d+\]\.ddlNameparam>
            result>

            <result name="checkUser" type="json">
                
                <param name="root">messageparam>-->
                <param name="includeProperties">messageparam> 
            result>       

        action>
    package>
struts>

二、关于JSON在struts.xml中的一些属性的功能

  • excludeProperties

      代表排除Action中的哪些属性,排除多个属性时,使用逗号进行分隔(即不需要序列化的属性)
例:age排除getAge()这个方法

  • includeProperties

      代表包含Action中的哪些属性,包含多个属性:使用逗号进行分隔(即需要序列化的属性)
例:address包含getAddress()这个方法 为

  • excludeNullProperties

      代表排除Action中属性值为空的字段
例:true 使用true/false 默认为false(即包含属性值为null的字段)

  • root

      代表从哪里开始序列化 。
例:personperson对应的可以是一个属性,也可以是一个对象,也可以是一个集合
  当在这里定义后,只会将person进行序列化,如果person是一个对象,则会将person对象中所有的getter方法都进行序列化

注意:如果相同属性同时定义了excludeProperties和includeProperties ,那么excludeProperties的优先级要高,因此不对该属性进行序列化

三、关于JSON在Action对象中注解的使用

对于JSON的注解的属性定义:

  • name:指定序列化的时候对应的名称
@JSON(name = "myname") 
//在客户端接收到的JSON中UserName属性对应的地方为 :{myname:"张三"} 以前的则是{username:"张三"}
public String getUsername() {
  return username;
}
  • serialize:对该方法进行序列化 true/false
@JSON(serialize=true) // 对该方法序列化,如果为false则不进行序列化
 public String getUsername() {
   return username;
 }
  • deserialize:不对该方法进行序列化 true/false
@JSON(deserialize=true) //不对该方法序列化,如果为false则进行序列化
 public String getUsername() {
    return username;
 }
  • format:设置JSON对该方法的转换方式,一般用于对时间进行转换
@JSON(format="yyyy-MM-dd")//则客户端接收的JSON中date对应的值为: {date:"2011-10-2"}
 public Date getDate() {
    return date;
 }

四、具体的实例:

  • Action:
package org.viancent.action;  

import java.util.Date;  
import org.apache.struts2.json.annotations.JSON;  
import com.opensymphony.xwork2.ActionSupport;  

public class GetJsonAction extends ActionSupport {  
   private String username;  
   private String password;  
   private int age;  
   private Date date;  

   @JSON(serialize = false)  
   public String getUsername() {  
       return username;  
   }  

   public void setUsername(String username) {  
       this.username = username;  
       }  

   @JSON(name="mypassword")  
   public String getPassword() {  
       return password;  
   }  

   public void setPassword(String password) {  
       this.password = password;  
   }  

   public int getAge() {  
       return age;  
   }  

   public void setAge(int age) {  
       this.age = age;  
   }  

   @JSON(format="yyyy-MM-dd")  
   public Date getDate() {  
       return date;  
   }  

   public void setDate(Date date) {  
       this.date = date;  
   }  

   @Override  
   public String execute() throws Exception {  
       this.setDate(new Date());  
       this.setAge(10);  
       this.setPassword("world");  
       this.setUsername("hello");  
       return SUCCESS;  
   }  
}  
  • struts.xml
<struts>  
    //这里一定要继承json-default 
    <package name="struts2"  extends="json-default">  
        <action name="getjsons" class="org.viancent.action.GetJsonAction">  
            //这里一定要定义type属性为json 
            <result name="success"  type="json">   
                //排除getAge()方法 
                <param name="excludeProperties">ageparam>                  
            result>  
        action>  

    package>  
struts>   
  • JSP:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

  
<html>  
    <head>  
        <script type="text/javascript" src="WEB-JS/jquery-1.5.1.js">script>   
        <script type="text/javascript"> //使用jquery实现异步提交  
             function getJson() {  
                 $.post("/struts2/getjsons.action",{},function(returnedData,status){  
                         if("success"==status){  
                             alert(returnedData);  
                         }  
                     }  
                 )  
             }  
         script>  
    head>  
    <body id="theBody">  
        <input type="button" value="GetJson" onclick="getJson();">  

    body>  
html>  

得到的结果为:{“date”:”2011-03-21”,”mypassword”:”world”}

使用浏览器的bug工具查看 alert(returnedData);弹出来的只是 [object,Object]
这里我们可以看见password的名称已经改为mypassword了 而设定那么的data属性,名称则没有变。

你可能感兴趣的:(Struts2)