SSM(struts+spring+mybatis)实现返回JSON数组的接口

本文介绍了如何在SSM(Struts2、Spring、Mybatis)框架中配置并使用JSON插件,通过实例展示了返回JSON数组的配置差异。重点在于`package`标签的`extends="json-default"`和`result`标签的`type="json"`设置。通过添加set和get方法,可以将对象自动封装进JSON响应。文中还展示了调整后的LoginAction.java代码,实现了返回状态码和User对象的HashMap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图(数据随便写的):
在这里插入图片描述
百度不靠谱。直接看官网: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;
    }
}

运行后测试:
在这里插入图片描述
成功,出现异常时,比如说主键重复(还没细分错误码)返回:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值