Spring Web MVC 响应消息
1.1 响应内容
1.2 跳转页面
1.2.1 返回字符串
☞ 添加视图解析器(spring-mvc.xml)
<!-- 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
☞ 请求方法
/**
* 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";
}
}
☞ 说明
视图解析器会自动给我们请求方法中返回的字符串加上前缀和后缀组成完整的转发地址,直接返回资源名称 success
的等同于返回 forward:/WEB-INF/views/success.jsp
即请求转发,如果想要重定向需要返回 redirect:/index.jsp
,加了前缀之后不会经过视图解析器。注意,外部是无法直接访问 WEB-INF
下的页面,只有通过服务器转发才可以,所以重定向不要指到 WEB-INF
下。
另外,如果转发的页面是 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
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<html>
<head>
<title>success</title>
</head>
<body>
${name}
</body>
</html>
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("我来了");
}
}
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";
}
}
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<String, String> map = new HashMap<>();
map.put("name", "jack");
map.put("age", "20");
String json = JSONObject.toJSONString(map);
return json;
}
}
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;
}
}
这里直接报错了,这个错误的原因是 Spring Web MVC 会帮我们将对象转为 JSON 然后返回,而 Spring Web MVC 底层默认使用的 jackjson,我们并没有引入 jackjson 所以就报错了,引入之后就 OK 了。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
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 属性。
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=utf-8"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@ResponseBody
@GetMapping(value = "/get", produces = "application/json;charset=utf-8")
public String get() {}
- 通过nginx GeoIP模块 限制某些国家地区访问网站
- CDN加速下通过nginx获取网站访客真实ip
- linux centos7服务器使用密钥登录ssh同时禁止root密码登录
- linux nginx服务器安装verynginx防止CC攻击
- linux nginx安装HttpGuard防止CC攻击
- wordpress您的主机禁用了mail()函数 SMTP邮件通知解决方法
- 我的编程之路:知识管理与知识体系
- UTF-8 为什么会比 UTF-16 浪费?
- 码农也要学算法
- 19 个常用的 JavaScript 简写方法
- 从零开始写 PHP 扩展
- Linux 基础:文件查找 find
- 区块链入门教程
- AI 玩微信小游戏跳一跳的正确姿势,Auto-Jump 算法详解
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释