1.快速体验使用MVC响应数据
-
在Maven项目中新建模块并转换成Web项目
-
导入依赖
<properties> <spring.version>6.0.6</spring.version> <servlet.api>9.1.0</servlet.api> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- springioc相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- web相关依赖 --> <!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 --> <!-- 在 Spring Web MVC 6 中,Servlet API 迁移到了 Jakarta EE API, 因此在配置 DispatcherServlet 时需要使用Jakarta EE 提供的相应类库和命名空间。 --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-web-api</artifactId> <version>${servlet.api}</version> <scope>provided</scope> </dependency> <!-- springwebmvc相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
-
创建Controller类
@Controller public class HelloController { @RequestMapping("springmvc/hello") //对外访问的地址 到handlerMapping注册的注解 @ResponseBody //直接返回字符串给前端,不要找视图解析器!!! public String hello(){ System.out.println("HelloController.hello"); //返回给前端 return "hello springmvc!!"; } }
-
Spring MVC核心组件配置类
@Configuration @ComponentScan("com.example") public class MvcConfig { //@Bean方式配置handlerMapper和handlerAdapter @Bean public RequestMappingHandlerMapping handlerMapping(){ return new RequestMappingHandlerMapping(); } @Bean public RequestMappingHandlerAdapter handlerAdapter(){ return new RequestMappingHandlerAdapter(); } }
-
SpringMVC环境搭建
/** * description: 可以被web项目加载,会初始化ioc容器,会设置dispatcherServlet的地址 * @author UserName */ public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer { // service mapper层的ioc容器的配置 @Override protected Class<?>[] getRootConfigClasses() { return new Class[0]; } // 设置我们项目对应的配置 springmvc controller @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{MvcConfig.class}; } // 配置springmvc内部自带servlet 的访问地址 ! @Override protected String[] getServletMappings() { return new String[]{ "/"}; } }
-
运行测试
2.返回JSON数据
2.1 导入jackson依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
2.2 MvcConfig添加json数据转化器@EnableWebMvc注解
2.3 使用@RestController注解
2.4 返回User对象和对象集合
@Data
public class User {
private String name;
private int age;
}
@RequestMapping("json")
//@Controller
//@ResponseBody //返回json的注解。添加到类和方法上!
@RestController // @Controller + @ResponseBody
public class JsonController {
/**
* TODO: @ResponseBody 数据直接放入响应体返回! 也不会在走视图解析器
* 快速查找视图, 转发和重定向都不生效了!
*/
@GetMapping("data")
public User data(){
// 对象 -》json -> {}
// 集合 -》json -> []
User user = new User();
user.setName("two dogs!");
user.setAge(3);
return user; // user-> handlerAdapter -> json -》 @ResponseBody -> json直接返回 【前后端分离模式】
}
@GetMapping("data2")
public List<User> data1(){
User user = new User();
user.setName("two dogs!");
user.setAge(3);
List<User> users = new ArrayList<>();
users.add(user);
return users;
}
}
测试
3.页快速返回模板视图
1.导入依赖
<!-- jsp需要依赖! jstl-->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
2.web//WEB-INF/views目录下创建jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- request.setAttribute("data","hello jsp!!");
vue {{key}}
-->
<span style="color: red; ">${data}</span>
</body>
</html>
3.配置jsp视图解析器
@Configuration
@ComponentScan("com.example")
@EnableWebMvc //json数据处理,必须使用此注解,因为他会加入json处理器
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//registry可以快速添加前后缀
registry.jsp("/WEB-INF/views/",".jsp");
}
}
4.handler返回视图
package com.example.jsp;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author ChenXing
* 2024/4/6 13:52
* describe:
*/
@Controller
@RequestMapping(value = "/jsp")
public class JspController {
/**
* TODO:快速查找试图
* 1. 方法的返回值是字符串类型
* 2. 不能添加@ResponseBody
* 3. 返回值 对应中间的视图名称即可 /springmvc/jsp/index
*/
@GetMapping("index")
public String index(HttpServletRequest request){
request.setAttribute("data","hello jsp!!!");
System.out.println("JspController.index");
return "index";
}
}
测试:
4.转发和重定向
在 Spring MVC 中,可以使用 redirect 或者 forward 关键字来实现重定向和转发。
@Controller
@RequestMapping(value = "/jsp")
public class JspController {
/**
* 转发:只能是项目下的资源
* 1.方法的返回值写成字符串
* 2.不能添加responseBody注解
* 3.返回的字符串前 forward: /转发地址
*/
@GetMapping(value = "forward")
public String forward(){
System.out.println("JspController.forward");
return "forward:/jsp/index";
}
/*
重定向:
1.方法返回值写成字符串类型
2.不能添加responseBody注解
3.返回字符串前面 redirect: /重定向的地址
*/
/** 路径细节:【不使用springmvc request response】
* 转发是项目下的资源跳转。路径: 项目下的地址 /jsp/index 忽略 applicationContext
* 重定向项目下的资源可以是项目外的地址 重定向属于二次请求 路径: 项目下的地址 全地址 /springmvc/jsp/index 不忽略 applicationContext
* 使用springmvc路径语法:
* "forward: 路径 | redirect: 路径 " 重定向,资源的地址也不需要写项目的根路径! /jsp/index
* 转发和重定向的地址都一样了! /springmvc/jsp/index - > /springmvc/springmvc/jsp/index
*/
@GetMapping("redirect")
public String redirect(){
System.out.println("JspController.redirect");
return "redirect:/jsp/index";
}
@GetMapping("redirect/baidu")
public String redirectBaidu(){
System.out.println("JspController.redirectBaidu");
return "redirect:http://www.baidu.com";
}
}
测试:
redirect直接转到了index.jsp
5.返回静态资源
资源本身已经是可以直接拿到浏览器上使用的程度了,**不需要在服务器端做任何运算、处理**。典型的静态资源包括:
纯HTML文件、图片、CSS文件、JavaScript文件......
1. 在MvcConfig配置类中开启静态资源查找
@Configuration
@ComponentScan("com.example")
@EnableWebMvc //json数据处理,必须使用此注解,因为他会加入json处理器
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//registry可以快速添加前后缀
registry.jsp("/WEB-INF/views/",".jsp");
}
//开启静态资源查找
// dispatcherServlet -> handlerMapping找有没有对应的handler -》【 没有 -》 找有没有静态资源 】
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
2.前端直接访问静态资源: