当前位置: 首页 > 工具软件 > json-struts > 使用案例 >

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

党浩阔
2023-12-01

一、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

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<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"/>

            <!-- Sample JSON validation stack -->
            <interceptor-stack name="jsonValidationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel</param>
                </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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

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

            <!-- 如果List集合转换成json数组,如果是Object对象转换成json对象-->
            <result name="findJctUnit" type="json">
                <!-- \[\d+\]\ 表示多个集合数组 -->
                <param name="includeProperties">\[\d+\]\.ddlCode,\[\d+\]\.ddlName</param>
            </result>

            <result name="checkUser" type="json">
                <!-- root表示,root指定message就表示查找栈顶中是否有message属性,如果有直接通过message的get方法,获取值放置到栈顶 -->
                <param name="root">message</param>-->
                <param name="includeProperties">message</param> 
            </result>       

        </action>
    </package>
</struts>

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

  • excludeProperties

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

  • includeProperties

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

  • excludeNullProperties

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

  • root

      代表从哪里开始序列化 。
例:<param name="root">person</param>person对应的可以是一个属性,也可以是一个对象,也可以是一个集合
  当在这里定义后,只会将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">age</param>                  
            </result>  
        </action>  

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<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属性,名称则没有变。

 类似资料: