Struts2的JSON数据处理

好久没使用服务端的开发了,正好最近工作中遇到了类似的问题,所以重新捡起来看看:


首先我们需要配置struts2的支持,并配置json插件。


我们的测试页面是这个样子滴:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'input.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
	<s:form action="16-json/jsondate.action">
		<s:textfield name="username" label="username"></s:textfield>
		<s:password name="password" label="password"></s:password>
		<s:submit value="submit"></s:submit>
	</s:form>
</body>
</html>

我们的配置文件:

<?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="16-json" extends="json-default" namespace="/16-json">
		<action name="jsondate" class="com.freesoft.struts2.action.JsonDateAction">
			<result name="success" type="json">
			</result>
		</action>
	</package>
</struts>

正题:

为了配置服务端返回的类型是json数据类型,我们需要将package从json-default继承。为了返回值为json类型,我们的result的type必须是json(如果为了接受json字符串格式的参数,我们使用<interceptor-ref name="json" />)。


我们的action实现是:

package com.freesoft.struts2.action;

import java.sql.Date;
import java.util.HashMap;
import java.util.Map;

import com.freesoft.struts2.bean.JsonOutputBean;
import com.opensymphony.xwork2.ActionSupport;

public class JsonDateAction extends ActionSupport {
	private static final long serialVersionUID = 8594770813208016225L;
	
	private String username;
	private String password;
	private JsonOutputBean bean;
	private Map<String, Object> dataMap;
	
	
	public JsonDateAction() {
		super();
		dataMap = new HashMap<String, Object>();
	}

	@Override
	public String execute() throws Exception {
		dataMap.put("username", username);
		dataMap.put("password", password);		
		Date date = new Date(2012, 1, 12);
		bean = new JsonOutputBean(1, "zhangsan", date);
		dataMap.put("Bean", bean);
		
		return SUCCESS;
	}

	public String getUsername() {
		return username;
	}

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

	public String getPassword() {
		return password;
	}

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

	public JsonOutputBean getBean() {
		return bean;
	}

	public void setBean(JsonOutputBean bean) {
		this.bean = bean;
	}

	public Map<String, Object> getDataMap() {
		return dataMap;
	}

	public void setDataMap(Map<String, Object> dataMap) {
		this.dataMap = dataMap;
	}
}

这时我们实际上已经可以进行测试了,但是我们发现返回的结果是一个将action中所有属性都输出的实现(实际上是获取了所有get方法,这一点可以通过注释getBean和getName方法来验证),所以我们需要改造我们的配置文件:

<?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="16-json" extends="json-default" namespace="/16-json">
		<action name="jsondate" class="com.freesoft.struts2.action.JsonDateAction">
			<result name="success" type="json">
				<param name="root">dataMap</param>
			</result>
		</action>
	</package>
</struts>

注意我们添加了一个root名字的返回值参数,这时我们可以看到,我们拿到的是dataMap这个属性的各种值,一般情况下我们在需要返回值时都是使用这种方式。



本来到这里json已经基本上讲完了,但是我们发现另外一个问题,Date类型的数据返回的是一个"date":"3912-02-12T00:00:00"这样的字符串,中间有一个"T"字符,那么我们如何去掉呢?正常情况下如果一个类型的输出内容和我们期望的不一致,我们在Struts2中需要使用一个Converter将其转换为我们需要的格式,但我们现在是使用json插件转换成我们的输出的,所以我们要想想别的办法:我们去找找json插件有没有属性之类的可配置值。


我们可以找到一个JSON注解,具体使用方法:在你需要转换的属性(Date类型)的get方法上加上下面的代码即可。

package com.freesoft.struts2.bean;

import java.util.Date;

import org.apache.struts2.json.annotations.JSON;

public class JsonOutputBean {
	private int id;
	private String name;
	private Date date;
	public JsonOutputBean(int id, String name, Date date) {
		super();
		this.id = id;
		this.name = name;
		this.date = date;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@JSON(format="YYYY-mm-dd")
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值