十、Struts2返回json数据

首先先确保你的项目已经有导入这个jar包struts2-json-plugin-2.3.24.jar,该jar包可以在struts-2.3.24-all下的lib包中获取

源码分析

引入该jar包后,打开其jar包源码的struts-plugin.xml文件
在这里插入图片描述
其源码如下:

<?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>

通过查看该文件可知,struts2-json-plugin-2.3.24.jar的配置文件定义了一个json-default的包,同时是继承了struts-default的默认包,然后json-default包内声明了json的结果类型,这个类型就是我们接下来需要用到的结果类型。

查看json结果类型对应的处理类是org.apache.struts2.json.JSONResult,那它是怎么接收我们要输出的json数据的呢?
查看其源码:
在这里插入图片描述
在这里插入图片描述
发现,其内部定义了一个root的字符串,并且提供了get/set方法
在这里插入图片描述
回到第一张图的writeToResponse方法查看
在这里插入图片描述
这里是生成json字符串的源码
在这里插入图片描述
接着通过writeToResponse写到HttpServletResponse中
在这里插入图片描述
由此可见root属性非常关键,是需要我们对其进行赋值的。至于如何赋值操作,这个就通过result标签的param属性来赋值了,通过param属性就可以获取到Action中的getXxx方法,而我们只需要提供getXxx方法即可,通常我们会通过Map对象来封装数据,然后将map通过getXxx方法暴露给struts.xml,也就是给result标签的param属性赋值。

ok,分析完源码,下面直接代码演示

创建javabean

package blog.csdn.net.mchenys.domain;

import java.util.List;

public class User {
	private String username;
	private int age;
	private List<String> hobby;

	public String getUsername() {
		return username;
	}

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

	public int getAge() {
		return age;
	}

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

	public List<String> getHobby() {
		return hobby;
	}

	public void setHobby(List<String> hobby) {
		this.hobby = hobby;
	}

}


创建Action

package blog.csdn.net.mchenys.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

import blog.csdn.net.mchenys.domain.User;

public class TestAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	// 定义用于封装json数据的容器,该容器将会被Struts2序列化为JSON字符串的对象
	private Map<String, Object> dataMap = new HashMap<String, Object>();

	// Struts2序列化指定属性时,必须提供getter方法,将属性暴露出去
	public Map<String, Object> getDataMap() {
		return dataMap;
	}

	public String demo1() {
		List<User> uList = new ArrayList<>();
		dataMap.put("data", uList);
		dataMap.put("status", 0);
		dataMap.put("msg", "请求成功");
		for (int i = 0; i < 5; i++) {
			
			User u = new User();
			u.setUsername("胜哥" + i + "号");
			u.setAge(20 + i);
			
			List<String> hobbyList = new ArrayList<>();
			hobbyList.add("吃");
			hobbyList.add("睡");
			hobbyList.add("玩");
			u.setHobby(hobbyList);
			
			uList.add(u);
		}
		return SUCCESS;
	}

}

配置Struts2配置文件

<?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>
	
	<!-- 包名随意,只要能和其他包区分开来就可以了 
		extends:必须继承json-default,才能使用json结果类型
		namespace:随意,但是设置了的话,请求路径必须要对应上
	 -->
	<package name="test" extends="json-default" namespace="/user">
		<!-- action请求名用通配符*号表示可以匹配任意字符路径,配合namespace那就是/user/*
			method:响应方法采用{1}读取name中匹配的字符,1表示第一个*代表的路径名
		  -->
		<action name="*" class="blog.csdn.net.mchenys.action.TestAction" method="{1}">
			<!-- 返回结果类型是 json-->
			<result type="json">
				<!-- 给root属性赋值,赋值的数据为action中定义的map -->
				<param name="root">dataMap</param>
				<!-- 是否去掉返回值为NULL的properties -->
				<param name="excludeNullProperties">true</param>
			</result>
		</action>
	</package>
</struts>


测试

请求该action的demo1方法的完整路径是http://localhost:8080/shopping/user/demo1,如下所示:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值