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 데이터 형식인 것을 설정하기 위해서, 패키지를 json-default에서 계승해야 합니다.값을 json 형식으로 되돌려주기 위해서, 우리의result type은 json이어야 합니다. (만약 json 문자열 형식의 인자를 받아들이기 위해서 )
우리의 액션 구현은 다음과 같습니다.
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;
	}
}

이 때 우리는 실제적으로 테스트를 진행할 수 있지만, 되돌아오는 결과는 액션의 모든 속성을 출력하는 것이다. (실제로는 모든 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>

루트 이름의 반환값 파라미터를 추가했습니다. 이 때 우리는 데이터맵이라는 속성의 여러 가지 값을 얻을 수 있습니다. 일반적인 상황에서 반환값이 필요할 때 이런 방식을 사용합니다.
원래는 여기에서 json은 기본적으로 말을 끝냈지만, 우리는 또 다른 문제를 발견했다. Date 형식의 데이터가 되돌아오는 것은'date'이다.'3912-02-12T00:00:00'이라는 문자열인데 중간에'T'문자가 있다. 그러면 우리는 어떻게 없애야 합니까?정상적인 상황에서 만약 한 유형의 출력 내용이 우리가 원하는 것과 일치하지 않는다면, Struts2에서는 Converter를 사용하여 우리가 필요로 하는 형식으로 변환해야 하지만, 우리는 현재 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;
	}
}

좋은 웹페이지 즐겨찾기