springboot中扩展ModelAndView实现net mvc的ActionResult效果
最近在写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,整体代码风格看起来也更统一
springboot中扩展ModelAndView实现net mvc的ActionResult效果的更多相关文章
- springboot中model,modelandview,modelmap的区别与联系
springboot 中Model,ModelAndView,ModelMap的区别与联系 Model是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类 public c ...
- spring扩展点之四:Spring Aware容器感知技术,BeanNameAware和BeanFactoryAware接口,springboot中的EnvironmentAware
aware:英 [əˈweə(r)] 美 [əˈwer] adj.意识到的;知道的;觉察到的 XXXAware在spring里表示对XXX感知,实现XXXAware接口,并通过实现对应的set-XXX ...
- springboot学习笔记:5.spring mvc(含FreeMarker+layui整合)
Spring Web MVC框架(通常简称为"Spring MVC")是一个富"模型,视图,控制器"的web框架. Spring MVC允许你创建特定的@Con ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- SpringBoot微服务架构下的MVC模型总结
SpringBoot微服务架构下的MVC模型产生的原因: 微服务概念改变着软件开发领域,传统的开源框架结构开发,由于其繁琐的配置流程 , 复杂的设置行为,为项目的开发增加了繁重的工作量,微服务致力于解 ...
- SpringBoot中对SpringMVC的自动配置
https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features-developin ...
- SpringBoot:扩展SpringMVC、定制首页、国际化
目录 扩展使用SpringMVC 如何扩展SpringMVC 为何这么做会生效(原理) 全面接管SpringMVC 首页实现 页面国际化 SpringBoot扩展使用SpringMVC.使用模板引擎定 ...
- Springboot启动扩展点超详细总结,再也不怕面试官问了
1.背景 Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片.Springboot更是封装了Spring,遵循约定大于配置,加上自动装配 ...
- 教你在你的应用程序中扩展使用dynamic类型
教你在你的应用程序中扩展使用dynamic类型 相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展 ...
随机推荐
- 简单做了一个代办事项列表系统 ,增删改查。 前台页面用 jquery 后台用nodejs ,数据库用的是mongdoDB 。
引入npm 第三方mongoose包连接mongoDb本地数据库todolist const mongoose = require('mongoose'); mongoose.connect('mon ...
- (解决)easypoi图片导出只占用一个单元格
@ 目录 前提 依赖环境 问题原因 解决方案 重写jar中的方法 原理 前提 本解决方案来源于网络,因解决自己需求,因此自行记录起来,如有侵权请联系我. 依赖环境 easypoi--依赖版本3.1.0 ...
- Go中由WaitGroup引发对内存对齐思考
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 WaitGroup使用大家都会,但是其中是怎么实现的我们 ...
- 【System】I/O密集型和CPU密集型工作负载之间有什么区别
CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...
- JD6621快速充电协议芯片,带有PPS 控制器的USB-PD3.0
描述 JD6621是高度集成的USB供电(PD)控制器,支持USB PD 3.0 ,该USB PD 3.0 具有针对USBType-C下游接口(源)设计的可编程电源(PPS)规范.它监视CC引脚以检测 ...
- 1.5V转3V电源芯片,1.5V转3V稳压芯片
1.5V干电池的供电电压一般是0.9V-1.6V左右,因为供电电压不稳,所以需要1.5V转3V的稳压电源芯片,当0.9V-1.6V输入电压时,输出电压能稳定3V输出,给模块供电,MCU供电,LED灯供 ...
- 日常分享:关于时间复杂度和空间复杂度的一些优化心得分享(C#)
前言 今天分享一下日常工作中遇到的性能问题和解决方案,比较零碎,后续会持续更新(运行环境为.net core 3.1) 本次分享的案例都是由实际生产而来,经过简化后作为举例 Part 1(作为简单数据 ...
- CSS实现迷你键盘
最近做了一个迷你键盘的dome,这里分享给大家 dome下载地址(点击下载) 代码如下: <!DOCTYPE html> <html lang="en" > ...
- python工业互联网应用实战3—Django Admin列表
Django Admin笔者使用下来可以说是Django框架的开发利器,业务model构建完成后,我们就能快速的构建一个增删查改的后台管理框架.对于大量的企业管理业务开发来说,可以快速的构建一个可发布 ...
- Turbo Boyer-Moore algorithm
MySQL :: MySQL 8.0 Reference Manual :: 8.3.9 Comparison of B-Tree and Hash Indexes https://dev.mysql ...