效果图(数据随便写的):
百度不靠谱。直接看官网:https://struts.apache.org/plugins/json/#setup-action
官网上展示了可以用这个插件返回的各种各样的样式的json数组以及相应的配置方式,以及适配的版本信息。
大概看一下,等他介绍结束之后,有一个例子。
代码如下:
import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.Action;
public class JSONExample {
private String field1 = "str";
private int[] ints = {10, 20};
private Map map = new HashMap();
private String customName = "custom";
//'transient' fields are not serialized
private transient String field2;
//fields without getter method are not serialized
private String field3;
public String execute() {
map.put("John", "Galt");
return Action.SUCCESS;
}
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public int[] getInts() {
return ints;
}
public void setInts(int[] ints) {
this.ints = ints;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
@JSON(name="newName")
public String getCustomName() {
return this.customName;
}
}
对比一下返回JSP页面与返回json数组不同的配置:
首先看一下返回JSP页面的struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="Login" class="com.study.action.LoginAction">
<result name="success">/WEB-INF/jsp/success.jsp</result>
<result name="error">/WEB-INF/jsp/error.jsp</result>
<result name="login">/index.jsp</result>
</package>
</struts>
再看一下返回json数组的struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />
<package name="default" extends="json-default">
<action name="Login" class="com.study.action.LoginAction">
<result name="success" type="json"/>
<result name="error" type="json"/>
</action>
</package>
</struts>
主要不同从package标签开始,返回json数组需要设置extends=“json-default”,result标签的type设置为type=“json”。
然后官网给的例子的返回的json数组为:
{
"field1" : "str",
"ints": [10, 20],
"map": {
"John":"Galt"
},
"newName": "custom"
}
其实一开始我不知道他为什么会这么返回,因为在代码:
public String execute() {
map.put("John", "Galt");
return Action.SUCCESS;
}
中其实不能一眼看出返回的都是什么。但是通过返回结果我推测可能在本页面中是不是定义的数据都会被自动扫描到然后包在json数组中。我又新定义了一个数组,直接运行,没有用,不显示,然后写了它对应的set与get方法,这下就显示在返回的json数组中了。
所以应该就是通过set和get方法获取的值。
根据我的需求。我需要返回一个状态码,返回一个对象,所以保留一个String类型的数据和一个用来存放User的HashMap,并且要调用Service层实现对数据库的操作。
修改后LoginAction.Java代码如下:
import com.opensymphony.xwork2.ActionSupport;
import com.study.entity.User;
import com.study.service.UserService;
import org.apache.struts2.ServletActionContext;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import java.util.HashMap;
@Controller
@Component("login")//action根据具体情况修改
@Scope("prototype")
public class LoginAction extends ActionSupport{
@Resource
private UserService userService;
public void setUserService(UserService userService)
{
this.userService = userService;
}
private String resultCode = "resultCode";
HashMap<String,User> result = new HashMap<String, User>();
private User user;
public String execute() {
try {
HttpServletRequest request = ServletActionContext.getRequest();
String username = (request.getParameter("username")).toString();
int phone = Integer.parseInt((request.getParameter("phone")));
String password = (request.getParameter("password")).toString();
user = new User();
user.setPhone(phone);
user.setPassword(password);
user.setUsername(username);
userService.insert(user);
result.put("data",user);
resultCode = "success";
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
resultCode = "error";
return ERROR;
}
}
public String getResultCode() {
return resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
public HashMap<String, User> getResult() {
return result;
}
public void setResult(HashMap<String, User> result) {
this.result = result;
}
}
运行后测试:
成功,出现异常时,比如说主键重复(还没细分错误码)返回: