文章目录
- 一、handler方法分析
- 二、页面跳转控制
- 2.1 快速返回模板视图
- 2.2 转发和重定向
- 三、返回JSON数据(重点)
- 3.1 前置准备
- 3.2 @ResponseBody
- 3.3 @RestController
- 四、返回静态资源处理
- 4.1 静态资源概念
- 4.2 静态资源访问和问题解决
- 总结
- 混合开发 与 前后端分离
- @ResponseBody 介绍
- 手动编译项目
一、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对应的视图解析器@Overridepublic 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("重定向!CSDN!");return "redirect:https://blog.csdn.net/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 -> 如果没有 就找有没有静态资源*/@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}
存放静态资源:
确保编译:
结果:直接访问静态资源 -》 显示图片
原理:
底层是通过转发:
找不到对应的handler方法 就会转发 查找当前项目下的真实资源
总结
混合开发 与 前后端分离
@ResponseBody 介绍
- 在方法上使用
@ResponseBody
注解,用于将方法返回的对象序列化为 JSON 或 XML 格式的数据,并发送给客户端。- 在前后端分离的项目中使用!
@ResponseBody
注解可以用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,
而不是由视图解析器来解析并渲染生成响应体(viewResolver没用)。