赞
踩
- <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
- @RequestMapping("param")
- public class ParamController {
- //后端直接接收
- // /param/data?name=root&age=18
- // 形参列表,填写对应名称的参数即可! 请求参数名 = 形参参数名即可!
- // 1. 名称相同 2.可以不传递 不报错
- @RequestMapping("data")
- @ResponseBody
- public String data(String name,int age){
- System.out.println("接收到:name = " + name + ", age = " + age);
- return "成功给前端返回:name = " + name + ", age = " + age;
- }
- }
- @Configuration
- @ComponentScan("com.example")
- public class MvcConfig {
- //@Bean方式配置handlerMapper和handlerAdapter
- @Bean
- public RequestMappingHandlerMapping handlerMapping(){
- return new RequestMappingHandlerMapping();
- }
- @Bean
- public RequestMappingHandlerAdapter handlerAdapter(){
- return new RequestMappingHandlerAdapter();
- }
- }
- /**
- * 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[]{ "/"};
- }
- }
运行测试
@ResponseBody注解
用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,而不是由视图解析器来解析并渲染生成响应体(viewResolver没用)。
- @Controller
- public class HelloController {
- @RequestMapping("springmvc/hello") //对外访问的地址 到handlerMapping注册的注解
- @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
- public String hello(){
- System.out.println("HelloController.hello");
- //返回给前端
- return "hello springmvc!!";
- }
- }
- @Controller
- public class HelloController {
- @RequestMapping("springmvc/*")
- @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
- public String handleAllBooks() {
- // 匹配所有以 /books/ 开头的路径
- System.out.println("匹配到一层springmvc/*");
- return "一层springmvc/*";
- }
-
- @RequestMapping("springmvc/**")
- @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
- public String handleBookDetails() {
- // 匹配所有以 /books/ 开头的路径及其子路径
- System.out.println("匹配到多层springmvc/**");
- return "多层springmvc/**";
- }
- }
运行访问:
- ###
- GET http://localhost:8080/springmvc/aaa
- ###
- GET http://localhost:8080/springmvc/aaa/bb
-
- //输出:
- springmvc/*
- springmvc/**
- @Controller
- @RequestMapping("springmvc")
- public class HelloController {
- @RequestMapping("hello")//底层是字符串拼接,但mvc会自动加“/”号
- @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
- public String hello() {
- System.out.println("hello mvc");
- return "hello mvc";
- }
- }
运行访问:
- ###
- GET http://localhost:8080/springmvc/aaa/bb
-
- //输出:
- hello mvc
默认情况下:@RequestMapping("/logout") 任何请求方式都可以访问!
@RequestMapping(value="/login",method=RequestMethod.GET)
等于->
@GetMapping(value="/login")
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
可以特定指定,但违背请求方式,会出现405异常!!!:
- @Controller
- public class UserController {
- /**
- * method = RequestMethod.POST 可以指定单个或者多个请求方式!
- * 注意:违背请求方式会出现405异常!
- */
- @RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)
- @ResponseBody
- public String login(){
- System.out.println("UserController.login");
- return "login success!!";
- }
- // @PostMapping(value = {"/user/login"})
- // @ResponseBody
- // public String login1(){
- // System.out.println("UserController.login");
- // return "login success!!";
- // }
-
- @RequestMapping(value = {"/user/register"},method = {RequestMethod.POST, RequestMethod.GET})
- @ResponseBody
- public String register(){
- System.out.println("UserController.register");
- return "register success!!";
- }
-
- }
- @Controller
- @RequestMapping("param")
- public class ParamController {
- //后端直接接收
- // /param/data?name=root&age=18
- // 形参列表,填写对应名称的参数即可! 请求参数名 = 形参参数名即可!
- // 1. 名称相同 2.可以不传递 不报错
- @RequestMapping("data")
- @ResponseBody
- public String data(String name,int age){
- System.out.println("name = " + name + ", age = " + age);
- return "成功给后台返回:name = " + name + ", age = " + age;
- }
-
- //注解指定
- //指定任意的请求参数名 要求必须传递 要求不必须传递 给与一个默认值
-
- // /param/data1?account=root&page=1
- // account必须传递 page可以不必须传递,如果不传递默认值就是1
-
- /**
- * @RequestParam -> 形参列表 指定请求参数名 或者是否必须传递 或者 非必须传递设置默认值
- * 用法: @RequestParam(value="指定请求参数名,如果形参名和请求参数名一致,可以省略!",
- * required = false 前端是否必须传递此参数,默认是必须 , 不传400异常!,
- * defaultValue = "1" 当非必须传递 false ,可以设置默认值)
- */
-
- @GetMapping("data1")
- @ResponseBody
- public String data1(@RequestParam(value = "account") String username,
- @RequestParam(required = false,defaultValue = "1") int page){
-
- System.out.println("username = " + username + ", page = " + page);
- return "username = " + username + ", page = " + page;
- }
-
- //特殊值
- // 一名多值 key=1&key=2 直接使用集合接值即可
-
- //param/data2?hbs=吃&hbs=玩&hbs=学习
- //不加注解@RequestParam 将 hbs对应的一个字符串直接赋值给集合! 类型异常!
- //加了注解,经理就会将集合 add加入对应的字符串
- @GetMapping("data2")
- @ResponseBody
- public String data2(@RequestParam List<String> hbs){
- System.out.println("hbs = " + hbs);
- return "ok";
- }
-
- //使用实体对象接值 用户注册(用户的信息) -》 对应的实体类 -》 插入到数据库 表
- //param/data3?name=二狗子&age=18 准备一个对应属性和get|set方法的实体类即可! -> 形参列表声明对象参数即可!
- @RequestMapping("data3")
- @ResponseBody
- public String data3(User user){
- System.out.println("user = " + user);
- return user.toString();
- }
- }
测试data3:
动态路径设计: /user/{动态部分}/{动态部分}
- @Controller
- @RequestMapping("path")
- @ResponseBody
- public class PathController {
- // path/账号/密码
-
- //动态路径设计 {key} = * {key} 在形参列表获取传入的参数
- //接受路径参数 String account,String password -> 接受param格式参数
- // 必须使用 @PathVariable
- @RequestMapping("{account}/{password}")
- public String login(@PathVariable(value = "account") String username, @PathVariable String password){
- System.out.println("username = " + username + ", password = " + password);
- return "username = " + username + ", password = " + password;
- }
- }
运行测试:
前端传递 JSON 数据时,Spring MVC 框架可以使用 @RequestBody 注解来将 JSON 数据转换为 Java 对象。@RequestBody 注解表示当前方法参数的值应该从请求体中获取,并且需要指定 value 属性来指示请求体应该映射到哪个参数上
- public class Person {
- private String name;
- private int age;
- private String gender;
- // getter 和 setter 略
- }
- @RequestMapping(value = "json")
- @Controller
- @ResponseBody
- public class JsonController {
- @PostMapping("data")
- public String data(@RequestBody Person person) {
- System.out.println("person = " + person);
- return person.toString();
- }
- }
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.15.0</version>
- </dependency>
- /*TODO: 导入handlerMapping和handlerAdapter的三种方式
- 1.自动导入handlerMapping和handlerAdapter [推荐]
- 2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载
- 3.使用@Bean方式配置handlerMapper和handlerAdapter
- */
- @EnableWebMvc//handlerAdapter配置了json转化器
- @Configuration
- @ComponentScan("com.example")
- public class MvcConfig {
- //@Bean
- //public RequestMappingHandlerMapping handlerMapping(){
- // return new RequestMappingHandlerMapping();
- //}
- //@Bean
- //public RequestMappingHandlerAdapter handlerAdapter(){
- // return new RequestMappingHandlerAdapter();
- //}
- }
或者前端使用Axios:
- axios.post('/json/datas', {
- name: "Lucy",
- age: 18,
- gender: "man"
- })
"cookieName"
,值为 "root"
的Cookie,并通过 response.addCookie(cookie)
将其添加到响应中,成功后返回“ok”。@CookieValue
注解来接收名为 "cookieName"
的Cookie的值。- @Controller
- @RequestMapping("cookie")
- @ResponseBody
- public class CookieController {
- @GetMapping("save")
- public String save(HttpServletResponse response){
- Cookie cookie = new Cookie("cookieName","这是一个cookieName");
- response.addCookie(cookie);
- return "ok";
- }
-
- @RequestMapping("data")
- public String data(@CookieValue(value = "cookieName") String value){
- System.out.println("value = " + value);
- return value;
- }
- }
- @Controller
- @RequestMapping("header")
- @ResponseBody
- public class HeaderController {
- @GetMapping("data")
- public String data(@RequestHeader("Host") String host){
- System.out.println("host = " + host);
- return "host = " + host;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。