java消息响应机制_Spring Web MVC 响应消息机制

1.1 响应内容

9cfc841ca23cbf3336cf587aa386759a.png

1.2 跳转页面

1.2.1 返回字符串

☞ 添加视图解析器(spring-mvc.xml)

☞ 请求方法

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description 控制器

*/ @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/get") public String get() { return "success"; } }

78a68921e7c0ee4a211a2f719c828d23.png

☞ 说明

视图解析器会自动给我们请求方法中返回的字符串加上前缀和后缀组成完整的转发地址,直接返回资源名称 success 的等同于返回 forward:/WEB-INF/views/success.jsp 即请求转发,如果想要重定向需要返回 redirect:/index.jsp,加了前缀之后不会经过视图解析器。注意,外部是无法直接访问 WEB-INF 下的页面,只有通过服务器转发才可以,所以重定向不要指到 WEB-INF 下。

3c4b73cc3b23d092ca734eb75b7061ed.png

另外,如果转发的页面是 HTML,并且 DispatcherServlet 拦截配置为 / ,为了实现 REST 风格,拦截了所有的请求,*.js、*.html 等静态文件的访问也就被拦截了,需要放行静态资源。

1.2.2 返回 ModelAndView

☞ 概述

使用 ModelAndView 类用来存储处理完后的结果数据,以及显示该数据的视图。顾名思义 ModelAndView 中的 Model 代表模型,View 代表视图。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的 model 中,把要返回的视图信息存储在 view 中,然后将 ModelAndView 返回。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最终把数据显示在指定的页面上。

☞ 请求方法

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description 控制器

*/ @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/get") public ModelAndView get() { // 也可以在方法形参上直接声明 ModelAndView, 无需自己创建 ModelAndView modelAndView = new ModelAndView(); // 设置数据 modelAndView.addObject("name", "张三"); // 设置视图名称 modelAndView.setViewName("success"); return modelAndView; } }

☞ JSP

success ${name}

cce1c6ae77c59dde6668377dcd54b27b.png

1.2.3 返回为空

当请求方法返回为空时,MVC 会自动将请求资源路径 demo/success 拼接上前缀和后缀做为请求转发的地址。

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description 返回 void

*/ @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/success") public void get() { System.out.println("我来了"); } }

d865b792e024f49bf0e5e41cebc6c098.png

1.3 响应数据

1.3.1 直接返回字符串

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description 返回 String

*/ @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/get") @ResponseBody public String get() { return "Hello"; } }

c584c7d35b9504ce1ecce11b52dd5675.png

1.3.2 返回 JSON 字符串

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description 返回 JSON

*/ @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/get") @ResponseBody public String get() { Map map = new HashMap<>(); map.put("name", "jack"); map.put("age", "20"); String json = JSONObject.toJSONString(map); return json; } }

e144497a42c91ee8d67a3634e212ec9a.png

1.3.2 返回对象

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description 返回对象

*/ @Controller @RequestMapping("/demo") public class DemoController { @GetMapping("/get") @ResponseBody public Student get() { Student student = new Student(); student.setName("Tom"); student.setAge(23); return student; } }

1161edc75533e57ca91d387dcd63f22c.png

这里直接报错了,这个错误的原因是 Spring Web MVC 会帮我们将对象转为 JSON 然后返回,而 Spring Web MVC 底层默认使用的 jackjson,我们并没有引入 jackjson 所以就报错了,引入之后就 OK 了。

com.fasterxml.jackson.corejackson-databind2.9.5com.fasterxml.jackson.corejackson-annotations2.9.5

75d4e0a65b98304422abedfbda696d9d.png

1.3.3 @RestController

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/8/27

* @description @RestController 注解

*/ @RestController // @RestController 这个注解其实就是 @ResponseBody 和 @Controller 注解的组合 @RequestMapping("/demo") public class DemoController { @GetMapping("/get") public String get() { return "10086"; } }

1.3.4 返回中文乱码

在 Spring Web MVC 中 StringHttpMessageConverter 这个转换器,父类AbstractHttpMessageConverter 的 supportedMediaTypes 属性默认是 iso-8895-1 导致中文乱码。有两种解决方案,第一个是在配置文件中指定转换器使用的字符集,第二个是在 @RequestMapping 中指定 produces 属性。

@ResponseBody @GetMapping(value = "/get", produces = "application/json;charset=utf-8") public String get() {}

本文地址:https://blog.csdn.net/Demo_Null/article/details/108252617

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值