最近在写spring boot项目,写起来感觉有点繁琐,为了简化spring boot中的Controller开发,对ModelAndView进行简单的扩展,实现net mvc中ActionResult的写法
asp.net core mvc
中控制器中提供了IActionResult接口来返回Aciton结果,可以用来返回视图view或者json,当然也可以实现接口返回自定义结果,当时写EasyCMS的时候实现过一个HtmlResult用来返回模板渲染生成的HTML内容,在asp.net core mvc
中开发非常简便,那么我们可以看下在asp.net core mvc
中的写法
//返回视图
[HttpGet]
public IActionResult Index(){
return View();
}
//返回json
[HttpGet]
public IActionResult GetJson(){
return Json();
}
//返回字符串
[HttpGet]
public IActionResult GetJson(){
return Content();
}
再来看下在spring boot中原始的写法是啥样子的
//返回index页面
@GetMapping("/index")
public String index() {
return "home/index";
}
//或者
@GetMapping("/tesView")
public ModelAndView tesView(){
return new ModelAndView("/home/testView");
}
//返回json
@GetMapping("/getJson")
@ResponseBody
public Hashtable<String,Object> getJson(){
Hashtable<String,Object> data=new Hashtable<>();
data.put("status",true);
data.put("message","message from json");
return map;
}
可以看到spring boot默认的写法并不是很简化,比如使用String返回视图view的时候必须指定视图路径,返回json必须添加@ResponseBody注解,
而使用ModelAndView 当视图路径和路由一致时是可以简化不写视图路径的 ,所以我们可以对ModelAndView来进一步扩展来简化控制器的开发,统一返回view或者json
1,首先定义一个ActionResult
public class ActionResult extends ModelAndView {
public ActionResult()
{
super();
}
public ActionResult(View view)
{
super(view);
}
}
2, 在BaseController中来封装 ActionResult ,来提供统一的返回结果
package com.easycms.framework.web;
import cn.hutool.core.util.StrUtil;
import com.easycms.constant.JacksonConstants;
import com.easycms.framework.domain.DataTableDto;
import com.easycms.framework.domain.ResultAdaptDto;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.Hashtable;
public class BaseController {
/**
* 返回页面
*/
//public String view(String url){
// return url;
//}
/**
* 页面跳转
*/
public String redirect(String url)
{
return StrUtil.format("redirect:{}", url);
}
/**
*
* @author yushuo
* @description //返回视图view
* @date 14:15 2021/2/4
* @param
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult view() {
return view(null);
}
/**
*
* @author yushuo
* @description //返回视图view
* @date 14:15 2021/2/4
* @param [viewpath]
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult view(String viewPath) {
return view(viewPath,null);
}
/**
*
* @author yushuo
* @description //返回视图view
* @date 14:15 2021/2/4
* @param [model]
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult view(Object model) {
return view(null, model);
}
/**
*
* @author yushuo
* @description //返回视图view
* @date 14:15 2021/2/4
* @param [viewpath, model]
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult view(String viewpath, Object model) {
ActionResult r = new ActionResult();
r.setViewName(viewpath);
r.addObject("model", model);
return r;
}
/**
*
* @author yushuo
* @description //返回json
* @date 14:15 2021/2/4
* @param [Hashtable<String,Object> data]
* @return org.springframework.web.servlet.ModelAndView
**/
protected ActionResult json(Hashtable<String,Object> data) {
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
modelAndView.addObject("message", null);
modelAndView.addObject("code",0);
modelAndView.addObject("status",true);
modelAndView.addObject("data", data);
return modelAndView;
}
/**
*
* @author yushuo
* @description //返回json
* @date 14:15 2021/2/4
* @param [ResultAdaptDto data]
* @return org.springframework.web.servlet.ModelAndView
**/
protected ActionResult json(ResultAdaptDto data) {
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
// modelAndView.addObject(data);
modelAndView.addObject("message", null);
modelAndView.addObject("code",0);
modelAndView.addObject("status",true);
modelAndView.addObject("data", data.getData());
return modelAndView;
}
/**
*
* @author yushuo
* @description //返回json
* @date 14:15 2021/2/4
* @param [DataTableDto data]
* @return org.springframework.web.servlet.ModelAndView
**/
protected ActionResult json(DataTableDto data) {
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
modelAndView.addObject(data);
return modelAndView;
}
/**
*
* @author yushuo
* @description //请求失败
* @date 14:20 2021/2/4
* @param [message]
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult error(String message){
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
modelAndView.addObject("message", message);
modelAndView.addObject("code",0);
modelAndView.addObject("status",false);
return modelAndView;
}
/**
*
* @author yushuo
* @description //请求失败
* @date 14:20 2021/2/4
* @param
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult error(){
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
modelAndView.addObject("message", "请求失败");
modelAndView.addObject("code",0);
modelAndView.addObject("status",false);
return modelAndView;
}
/**
*
* @author yushuo
* @description //请求失败
* @date 14:20 2021/2/4
* @param [message]
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult ok(String message){
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
modelAndView.addObject("message", message);
modelAndView.addObject("code",0);
modelAndView.addObject("status",true);
return modelAndView;
}
/**
*
* @author yushuo
* @description //请求成功
* @date 14:20 2021/2/4
* @param
* @return com.easycms.framework.web.ActionResult
**/
protected ActionResult ok(){
ActionResult modelAndView = new ActionResult(JacksonConstants.mappingJackson2JsonView);
modelAndView.addObject("message", "操作成功");
modelAndView.addObject("code",0);
modelAndView.addObject("status",true);
return modelAndView;
}
}
3,BaseController中用到的JacksonConstants
package com.easycms.constant;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
/**
* @author yushuo
* @className
* @descripton TODO
* @date 2021/2/5 13:47
**/
public class JacksonConstants {
/**
* @author yushuo
* @description //jackson ObjectMapper
* @date 13:52 2021/2/5
* @param
* @return
**/
public static ObjectMapper objectMapper;
/**
* @author yushuo
* @description //jackson MappingJackson2HttpMessageConverter
* @date 13:52 2021/2/5
* @param
* @return
**/
public static MappingJackson2HttpMessageConverter jackson2HttpMessageConverter;
/**
* @author yushuo
* @description //jackson MappingJackson2JsonView
* @date 13:52 2021/2/5
* @param
* @return
**/
public static MappingJackson2JsonView mappingJackson2JsonView;
static {
objectMapper=objectMapper();
jackson2HttpMessageConverter=jackson2HttpMessageConverter();
mappingJackson2JsonView=mappingJackson2JsonView();
}
/**
*
* @author yushuo
* @description //jackson配置jackson2HttpMessageConverter
* @date 13:49 2021/2/5
* @param []
* @return org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
**/
private static MappingJackson2HttpMessageConverter jackson2HttpMessageConverter(){
return new MappingJackson2HttpMessageConverter(objectMapper());
}
/**
*
* @author yushuo
* @description //jackson配置 objectMapper
* @date 13:51 2021/2/5
* @param []
* @return com.fasterxml.jackson.databind.ObjectMapper
**/
private static ObjectMapper objectMapper(){
final Jackson2ObjectMapperBuilder builder=new Jackson2ObjectMapperBuilder();
final ObjectMapper objectMapper=builder.build();
SimpleModule simpleModule=new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE,ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER,true);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return objectMapper;
}
/**
*
* @author yushuo
* @description //jackson配置
* @date 13:49 2021/2/5
* @param []
* @return org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
**/
private static MappingJackson2JsonView mappingJackson2JsonView(){
return new MappingJackson2JsonView(objectMapper());
}
}
4,实际使用
@GetMapping("/login")
public ActionResult login(){
return view("/home/login");
}
//或者
@GetMapping("/login")
public ActionResult login(){
return view();
}
//或者
@GetMapping("/login")
public ActionResult login(){
ModelMap model=new ModelMap();
model.put("author","yushuo");
return view(model);
}
返回json
@GetMapping("/getJson")
public ActionResult getJson(String id){
Hashtable<String,Object> data=new Hashtable<>();
data.put("id",id);
return json(result);
}
这样是不是就比原始的控制器开发简化多了呢
可以使用统一ActionResult来返回视图view或者json,整体代码风格看起来也更统一
原文:https://www.cnblogs.com/yushuo/p/14381302.html
作者: EasyCms-