文章目录
一、handler方法分析
理解handler方法的作用和组成:
- 一个controller的方法是控制层的一个处理器,我们称为handler
- handler需要使用
@RequestMapping
/@GetMapping
等,声明路径,在HandlerMapping
中注册,供DS查找! - handler作用总结 :
- 1.接收请求参数(param,json,pathVariable,共享域等)
- 2.调用业务逻辑
- 3.响应前端数据(页面,json,转发和重定向等)
- handler如何处理 :
- 1.接收参数: handler(形参列表: 主要的作用就是用来接收参数)
- 2.调用业务: { 方法体 可以向后调用业务方法 service.xx() }
- 3.响应数据: return 返回结果,可以快速响应前端数据
@RequestMapping
public Object handler(简化请求参数接收){
调用业务方法
返回的结果 (页面跳转,返回数据(json))
return 简化响应前端数据;
}
总结:
-
请求数据接收,通过handler的形参列表
-
前端数据响应,通过handler的return关键字快速处理!
-
springmvc简化了参数接收和响应!
二、页面跳转控制
2.1 快速返回模板视图
JSP(JavaServer Pages)是一种动态网页开发技术,可以在 HTML 文件中嵌入 Java 代码。
JSP 首次运行时会被转换为 Servlet,然后编译为字节码,从而可以启用 Just-in-Time(JIT)编译器,实现更高效的运行。
- jsp依赖
<!-- jsp需要依赖! jstl-->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
- jsp页面创建
建议位置:/WEB-INF/下,避免外部直接访问!
位置:/WEB-INF/views/home.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
request.setAttribute("data","hello jsp!")
vue {{key}}
--%>
<h1>
${data}
</h1>
</body>
</html>
- 配置jsp视图解析器
@EnableWebMvc // HandlerAdapter配置JSON转换器
@Configuration
@ComponentScan("com.wake.jsp")
public class MvcConfig implements WebMvcConfigurer {
//配置jsp对应的视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//快速配置jsp模板语言对应的
// '/WEB-INF/views/'这个会与controller层 类的 return 地址进行拼接 注意 ‘/’ 下划线有没有加
registry.jsp("/WEB-INF/views/",".jsp");
}
}
- handler返回视图
@Controller
@RequestMapping("jsp")
public class JspController {
// 直接返回给浏览器 不加注解@ResponseBody 不找视图 不走视图解析器
@GetMapping("index")
public String show(HttpServletRequest request){
request.setAttribute("data","Hello JSP ! long time no see !");
System.out.println("index JSP");
// 返回的是jsp文件名地址(jsp文件名 会跟字符串拼接 -> 查找前端页面(MvcConfig)
return "home";
}
}
2.2 转发和重定向
-
原生开发 路径细节
- 转发是项目下的资源跳转,路径-项目下的地址: /jsp/index 可以忽略ApplicationContext
- 重定向 可以是项目下的资源 也可以是项目外的地址 重定向属于二次请求 路径 - 项目下的地址: 全地址 /springmvc/jsp/index 不忽略ApplicationContext
-
使用springmvc路径语法
forward
: 路径 |redirect
路径 转发和重定向 资源地址都不需要写 项目的根路径。- 都 忽略ApplicationContext 。直接
/jsp/index
- 转发和重定向地址都一样。
/springmvc/jsp/index
-> 加了就重复了 变成/springmvc/springmvc/jsp/index
这是错的
注意:
/
下划线 加没加的问题
@Controller
@RequestMapping("jsp")
public class JspController {
// 直接返回给浏览器 不加注解@ResponseBody
// 该方法地址:/jsp/index
@GetMapping("index")
public String show(HttpServletRequest request){
request.setAttribute("data","Hello JSP ! long time no see !");
System.out.println("index JSP");
// 返回的是jsp文件名地址(jsp文件名 会跟字符串拼接 -> 查找前端页面(MvcConfig)
return "home";
}
/**
* 转发:只能是项目下的资源
* 1. 不能添加@ResponseBody注解
* 2. 方法返回值是字符串
* 3. 返回的字符串前面 forward:/转发地址
* @return 转发到其他handler方法
*/
@GetMapping("forward")
public String forward(){
System.out.println("JspController.forward! 转发!");
return "forward:/jsp/index";
}
/**
* 重定向 : redirect:/重定向地址
* @return
*/
@GetMapping("redirect")
public String redirect(){
System.out.println("JspController.forward! 重定向!");
return "redirect:/jsp/index";
}
/**
* 重定向到项目外地址
* @return 重定向到show方法的地址
*/
@GetMapping("redirect/csdn")
public String redirect2(){
System.out.println("重定向!优快云!");
return "redirect:https://blog.youkuaiyun.com/GavinGroves";
}
}
三、返回JSON数据(重点)
3.1 前置准备
json依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
MVC配置类中添加json数据转化器
@EnableWebMvc
3.2 @ResponseBody
- 对象 -》 json -> {}
- 集合 -》 json -> []
@ResponseBody 返回JSON的注解,可以添加到类和方法上
@Controller
@RequestMapping("json")
@ResponseBody
public class JsonController {
@RequestMapping("user")
public User userShow() {
User user = new User();
user.setName("道格");
user.setAge(26);
// user -> handlerAdapter -> json -> @ResponseBody -> json直接返回【前后端分离模式】
return user;
}
@RequestMapping("userList")
public List<User> userListShow() {
User user = new User();
user.setName("道格");
user.setAge(26);
User user1 = new User();
user1.setName("维克");
user1.setAge(25);
List<User> userList = new ArrayList<>();
userList.add(user);
userList.add(user1);
return userList;
}
}
@ResponseBody 数据直接放入响应体返回,也不会走视图解析器。
快速查找视图、转发和重定向都不生效。
3.3 @RestController
@RestController == @Controller + @ResponseBody
四、返回静态资源处理
4.1 静态资源概念
资源本身已经是可以直接拿到浏览器上使用的程度了,不需要在服务器端做任何运算、处理。
典型的静态资源包括:
- 纯HTML文件
- 图片
- CSS文件
- JavaScript文件
- ……
4.2 静态资源访问和问题解决
MvcConfig 配置类 开启静态资源查找
/**
* 开启静态资源查找
* @param configurer
* dispatcherServlet -> handlerMapper 找有没有对应的handler -> 如果没有 就找有没有静态资源
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
存放静态资源:
确保编译:
结果:直接访问静态资源 -》 显示图片
原理:
底层是通过转发:
找不到对应的handler方法 就会转发 查找当前项目下的真实资源
总结
混合开发 与 前后端分离
@ResponseBody 介绍
- 在方法上使用
@ResponseBody
注解,用于将方法返回的对象序列化为 JSON 或 XML 格式的数据,并发送给客户端。- 在前后端分离的项目中使用!
@ResponseBody
注解可以用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,
而不是由视图解析器来解析并渲染生成响应体(viewResolver没用)。