基于 SpringMVC 对入参和出参 理解

时间:2022-10-29 21:10:28

个人理解,应该对出参和入参进行统一管理. 除非是一些复制业务类型,那就一定建好实体业务类,如果是一般业务逻辑处理,实体类,尽量少建,加快开发速度。虽然mybatis有代码生成器,但是在实际开发过程,业务更改比较频发,建好的表也经常因业务增加一些字段,导致每加一次,就要去改实体类.很影响开发速度.

一.前端

    1.封装统一的ajax请求。

        请求格式:

以作为param作为唯一key,以json处理成字符串,作为value,并把value进行编码encode.

{
  param:encodeURIComponent(stringify(JSON对象))  
}

     2.封装统一返回结果

         返回格式:

三个状态值,code,data,msg

{
  code:000,        //code,返回代码,以数字为标准,比如000代表成功,001代表参数为空,002代表调用业务失败
  data:{age:11},   //返回的数据,以json对象为主
  msg:"请求成功!"  //返回服务器消息
}

    3.对象URL进行统一管理,每个界面都有URL统一对象.

var URLObj={
  save:"/xin/save",
  delete:"/xin/delete",
  get:"/xin/get",
  other:"/xin/other"
}


二、后端:

        1.前端封装好的,后端获取参数,只要统一获取param参数,并转化JSONObject .

            Controller层:负责对param转换成JSON进行参数检查,检查成功,转换HashMap,作为入参给Service服务调用。

            Service层:入参,统一是HashMap,进行业务逻辑处理,处理完,调用DAO

            DAO层:  入参,统一是HashMap,返回对象,统一是HashMap(除了一些复杂业务)

            好处:如果变更需求,数据库多加一个字段,并且需要返回,后端只需直接改sql语句,因为没有建立实体,不用去改变 就实体类。可以。前端也只要多加一行代码,取参数。

        在实际开发中,表结构会因业务经常变更,而增加字段,一增加字段,后端只需要改sql,更多关注业务。 如果前端多加两个字段返回,后台也只要改sql,并多一层逻辑判断。这是不建立实体类好处,如果是复杂业务,则建议DAO处理返回对应到实体类中去。

       

三、直接贴出代码,供大家参考

前端处理,(未进行调试,有错误,请自行改动)

 
/**  * =====================对ajax进行封装===========================  */ /**  * 访问路径统一到一个对象中  * @type {{save: string, get: string, delete: string}}  */ var ywURL={
    save:"/xin/save",
    get:"/xin/get",
    delete:"/xin/delete"
}

/**  * 统一获取url  * @param key  * @returns {string}  */ function getUrl(key){
    var context="${req.getContext.path}}" //上下文
    var t="?t="+new Date().getTime(); //随机函数,当然也可以在预设ajax中设定,ajaxSetup.beforeSend进行处理
    var dourl=ywURL[key]; //请求url
    if(dourl){
        return context+dourl+t
    }else{
        console.log("获取业务请求地址失败"+key);
        return "";
    }
}

/**  * 封装统一ajax请求,  * 关键:对入参进行封装,对出参进行统一处理。  * 请求结果只有两种,要么是成功,要么是失败,根据业务自己定义好  */ function callUrl(url,param,callSuccsee) {
    //在请求前,可以加一下处理,比如请求发送前,界面展示load的标志
    $.ajax({
        data: {
            param: encodeURIComponent(JSON.stringify(param))
        },
        dataType: "json",
        success: function (r) {
            var rcode = r.code;
            var rdata = r.data;
            var rmsg = r.msg;
            if (rcode == "000") {
                callSuccsee(rdata);
            } else {
                alert(rmsg);
            }
        },
        error: function (er) {
            //请求失败处理
        }
    })
}





/**  * ===============下面是调用例子=======================  */  //请求参数
var save_param={
    name:"小明",
    age:"12"
}
//回调函数
var save_Suceess=function (data) {
    var tall=data.tall;
    alert(tall);
}
//请求地址
var save_url=getUrl("save");
callUrl(saveurl,param,callSuccess)

后端处理:

WebUtil封装统一获取参数方法:

 
package Utils;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yifengxin.entity.ResultVO;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;

public class WebUtil {
    /**  * 从web请求中获取参数,并解析成JSONObject,用阿里fastJSON  * @param request  * @return  */  public static JSONObject getParam(HttpServletRequest request){
        JSONObject json=new JSONObject();
        String param=request.getParameter("param");
        if(!StringUtils.isEmpty(param)) {
            json= JSON.parseObject(param);
        }
        return json;
    }

    /**  * 调用成功,返回该对象  * @param data  * @return  */  public static HashMap getSuccess(Object data) {
        HashMap map=new HashMap();
        map.put("code","000");
        map.put("data",data);
        map.put("msg","");
        return map;
    }

    /**  * 出现错误时,返回该对象  * @param msg  * @return  */  public static HashMap getError(String msg) {
        HashMap map=new HashMap();
        map.put("code","999");
        map.put("data","");
        map.put("msg",msg);
        return map;
    }
}

Controller层处理:先对入参进行判断校验,再进行业务逻辑处理

 
package com.yifengxin.controller;

import Utils.WebUtil;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yifengxin.serivce.WebService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;

//使用springboot框架
@RestController
@RequestMapping("/xin")
public class WebContoller {

    @Autowired
    private WebService webService;

    @RequestMapping("/get")
    public HashMap hello(HttpServletRequest request){
        //入参校验处理,这里可以构造AOP方法,进行拦截处理,对参数进行判断处理。
        JSONObject pJSON= WebUtil.getParam(request);
        String name=pJSON.getString("name");
        if(StringUtils.isEmpty(name)){
            return WebUtil.getError("名字参数不能为空!");
        }
        if(StringUtils.isEmpty(pJSON.getString("age"))){
            return WebUtil.getError("年龄参数不能为空!");
        }

        //调用业务服务处理
        HashMap paramMap=JSON.toJavaObject(pJSON,HashMap.class);
        request.getSession().setAttribute("name",name);
        return webService.getPerson(paramMap);
    }
}



Service层:处理业务逻辑

package com.yifengxin.serivce;

import Utils.WebUtil;
import com.alibaba.fastjson.JSONObject;
import com.yifengxin.dao.WebMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;

@Service
public class WebService {

    @Autowired
    private WebMapper webMapper;
    /**  * 数据库查询: 确定这人是否存在  * @param map  * @return  */  public HashMap getPerson(HashMap map){
        int num=webMapper.Count(map);
        if(num>0){
            JSONObject o=new JSONObject();
            int age= (int) map.get("age");
            o.put("num",num);
            o.put("age",ageAdd(age));//年龄加1
            return WebUtil.getSuccess(o);
        }else{
            return WebUtil.getError("这个人不存在");
        }
    }

    /**  * 业务处理:年龄加1  * @param age  * @return  */  private int ageAdd(int age){
        return  age+1;
    }


}

DAO层:调用数据层,或者处理xml,二进制,文本读写 等数据格式类

package com.yifengxin.dao;
import java.util.HashMap;
public interface WebMapper {
    /**  * 判断这个人是否存在  * @param paramMap  * @return  */  public int Count(HashMap paramMap);

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yifengxin.dao.XinMapper" >

   <!-- 判断这个人是否存在-->
    <select id="selectCount" resultType="int" parameterType="java.util.HashMap" >
        select count(1) from person p where p.name=#{name} and p.age = #{age}
    </select>

</mapper>