好久没使用服务端的开发了,正好最近工作中遇到了类似的问题,所以重新捡起来看看:
首先我们需要配置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;
}
}