网站重定向代码深圳seo排名
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:18
当前位置: 首页 > news >正文
网站重定向代码,深圳seo排名,网页微信版官网登录仅传输文件,图书类网站开发的背景文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步#xff1a;导入依赖第二步#xff1a;Controller 层开发第三步#xff1a;SpringMVC 配置类配置核心组件第四步#xff1a;SpringMVC 环境搭建第五步#xff1a;部… 文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步导入依赖第二步Controller 层开发第三步SpringMVC 配置类配置核心组件第四步SpringMVC 环境搭建第五步部署 Tomcat 并运行测试 SpringMVC 访问路径设置路径注解 RequestMapping方法级别类级别特定请求方式限制特定请求方式限制-注解方式 精确路径匹配模糊路径匹配 SpringMVC 接收参数param 和 json 参数比较SpringMVC 各种数据接收简单类型接值简单类型接值【形参和请求参数不一致】数组类型接收集合类型接收实体类类型接收日期参数接收路径参数接收JSON 参数接收Cookie 数据接收请求头信息接收 原生 API 参数调用共享域对象操作request 级别共享域session 级别共享域Application 级别共享地域 SpringMVC 响应数据开发模式介绍页面跳转快速返回模板视图请求转发和响应重定向 返回 JSON 数据基本使用ResponseBody 注解RestController 注解 返回静态资源 RESTFul 风格设计规范HTTP 协议请求方式要求URL 风格要求传递参数设计要求实战举例 SpringMVC 声明式全局异常处理SpringMVC 拦截器拦截器方法拦截位置拦截器使用多个拦截器情况 SpringMVC 参数校验为什么使用参数校验校验注解详解参数校验使用易混淆注解总结 SpringMVC 概念和基本使用
SpringMVC 简介 Spring Web MVC 是基于 Servlet API 构建的原始Web框架从一开始就包含在 Spring Framework中。正式名称 “Spring Web MVC” 来自其源模块的名称 spring-webmvc 但它通常被称为“Spring MVC”。 SpringMVC 核心组件和调用流程 调用 Controller 层方法 请求映射查找 通过 DispatcherServlet 把 request 对象传递给 HandlerMapping 。然后 HandlerMapping 基于这个 request 对象中的请求路径等信息。从其缓存中查找匹配的 handerController 方法 对应路径等内容。然后把匹配到的信息返回给 DispatcherServlet . 请求处理与响应 DispatcherServlet 拿到匹配的信息后。会来到 HandlerAdpter并将 request 和 response 传递过来。HandlerAdpter 借助 request 进行请求参数绑定。然后才执行 handlerController 方法。返回的数据封装到 response 中让 HandlerAdapter 处理。然后 response 返回给客户端 . 动态视图资源处理 handlerController 方法 返回的是一个字符串就到视图解析器。通过视图解析器前缀和后缀拼接访问视图 SpringMVC 基本使用 第一步导入依赖
propertiesspring.version6.0.6/spring.versionservlet.api9.1.0/servlet.apimaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding
/propertiesdependencies!– springioc相关依赖 –dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion\({spring.version}/version/dependency!-- web相关依赖 --!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 --!--在 Spring Web MVC 6 中Servlet API 迁移到了 Jakarta EE API因此在配置 DispatcherServlet 时需要使用Jakarta EE 提供的相应类库和命名空间。错误信息 “‘org.springframework.web.servlet.DispatcherServlet’is not assignable to ‘javax.servlet.Servlet,jakarta.servlet.Servlet’” 表明你使用了旧版本的Servlet API没有更新到 Jakarta EE 规范。--dependencygroupIdjakarta.platform/groupIdartifactIdjakarta.jakartaee-web-api/artifactIdversion\){servlet.api}/versionscopeprovided/scope/dependency!– springwebmvc相关依赖 –dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion\({spring.version}/version/dependency/dependencies第二步Controller 层开发 RequestMapping对外访问的地址ResponseBody告诉Spring框架被注解的方法的返回值应该直接写入HTTP响应体而不是视图名称并且不需要进行视图解析。 public class HelloController {RequestMapping(/springmvc/hello)ResponseBodypublic String hello() {System.out.println(Hello springmvc);return hello springmvc;}
}第三步SpringMVC 配置类配置核心组件 需要把 HandlerAdapter 和 HandlerMapping 放入 IOC 容器 并扫描组件。其实用EnableWebMvc 也可以自动配置。 Configuration
ComponentScan(basePackages com.mangfu.controller)
public class SpringMvcConfig {Beanpublic RequestMappingHandlerAdapter requestMappingHandlerAdapter() {return new RequestMappingHandlerAdapter();}Beanpublic RequestMappingHandlerMapping requestMappingHandlerMapping() {return new RequestMappingHandlerMapping();}
}第四步SpringMVC 环境搭建 作用可以被 web 项目加载会初始化 ioc 容器, 会设置 dispatcherServlet 的地址 public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {Overrideprotected Class?[] getRootConfigClasses() {return new Class[0];}//指定 springmvc 的配置类。会自动加载配置类Overrideprotected Class?[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置dispatcherServlet的处理路径!//一般情况下为 / 代表处理所有请求!Overrideprotected String[] getServletMappings() {return new String[]{/};}
}第五步部署 Tomcat 并运行测试 SpringMVC 访问路径设置 路径注解 RequestMapping
方法级别 直接在方法上加 RequestMapping。当多个方法处理同一个路径的不同操作时可以使用方法级别的 RequestMapping 注解进行更精细的映射。 Controller
public class UserController {//这里路径就是 /index 访问就会执行这个方法RequestMapping(/index)public String index() {return null;}
}类级别 在类上加 RequestMapping方法上还要再设置一次 RequestMapping 设置了 ReqquestMapping 的参数那就自动加上 类级别的地址当前缀如果没有参数就直接用 类地址地址 Controller
RequestMapping(/user)
public class UserController {RequestMapping //这里没有参数就直接用类级别的参数也就是 /userpublic String index() {return null;}RequestMapping(value login) //这里有参数就是自动加上类级别的地址当前缀也就是 /user/loginpublic String login() {return null;}}特定请求方式限制
注意违背请求方式会出现405异常 设HTTP 协议定义了八种请求方式在 SpringMVC 中封装到了下面这个枚举类 public enum RequestMethod {GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}Controller
public class UserController {/*** 精准设置访问地址 /user/login* method RequestMethod.POST 可以指定单个或者多个请求方式!* 注意:违背请求方式会出现405异常!*/RequestMapping(value {/user/login} , method RequestMethod.POST)ResponseBodypublic String login(){System.out.println(UserController.login);return login success!!;}
}特定请求方式限制-注解方式
注意进阶注解只能添加到handler方法上无法添加到类上 还有 RequestMapping 的 HTTP 方法特定快捷方式变体 GetMappingPostMappingPutMappingDeleteMappingPatchMapping RequestMapping(value/login,methodRequestMethod.GET)
就等于
GetMapping(value/login)精确路径匹配 SpringMVC 中 RequestMapping 的 / 可以省略 . / 就表示绝对路径 Tomcat 中表示 http://localhost:8080/设置 Tomcat 上下文路径为 / 缺省就可以直接使用 / 地址 访问对应的 Servlet RequestMapping(value /login, method RequestMethod.POST) public String login() {return null;}模糊路径匹配 在 RequestMapping 注解指定 URL 地址时通过使用通配符匹配多个类似的地址。* 表示任意单层/user/* 这种就是一层可以访问/user/a/b 这就是两层访问不了**表示任意层/user/** 比如/user/a /user/a/b 都可以 Controller
public class ProductController {/*** 路径设置为 /product/* * /* 为单层任意字符串 /product/a /product/aaa 可以访问此handler * /product/a/a 不可以* * 路径设置为 /product/** * /** 为任意层任意字符串 /product/a /product/aaa 可以访问此handler * /product/a/a 也可以访问*/RequestMapping(/product/*)ResponseBodypublic String show(){System.out.println(ProductController.show);return product show!;}
}
SpringMVC 接收参数 param 和 json 参数比较 在 HTTP 请求中我们可以选择不同的参数类型如 param 类型和 JSON 类型。下面对这两种参数类型进行区别和对比 paramkey value key valuejson{ key : value, key : value } . 参数编码 param 类型的参数会被编码为 ASCII 码。例如假设 namejohn doe则会被编码为 namejohn%20doe。而 JSON 类型的参数会被编码为 UTF-8。 .参数顺序 param 类型的参数没有顺序限制。但是JSON 类型的参数是有序的。JSON 采用键值对的形式进行传递其中键值对是有序排列的。 .数据类型 param 类型的参数仅支持字符串类型、数值类型和布尔类型等简单数据类型。而 JSON 类型的参数则支持更复杂的数据类型如数组、对象等。嵌套性 param 类型的参数不支持嵌套。但是JSON 类型的参数支持嵌套可以传递更为复杂的数据结构。 .可读性 param 类型的参数格式比 JSON 类型的参数更加简单、易读。但是JSON 格式在传递嵌套数据结构时更加清晰易懂。 . 总的来说param 类型的参数适用于单一的数据传递而 JSON 类型的参数则更适用于更复杂的数据结构传递。根据具体的业务需求需要选择合适的参数类型。在实际开发中常见的做法是在 GET 请求中采用 param 类型的参数而在 POST 请求中采用 JSON 类型的参数传递。 返回对象就是 json SpringMVC 各种数据接收
简单类型接值 客户端请求 Hander 接收参数 只要形参参数名和类型与传递的参数相同即可自动接收也可以不传递参数 Controller
RequestMapping(param)
public class ParamController {/*** 前端请求: http://localhost:8080/param/value?namexxage18** 可以利用形参列表,直接接收前端传递的param参数!* 要求: 参数名 形参名* 类型相同* 出现乱码正常json接收具体解决* return 返回前端数据*/GetMapping(value/value)ResponseBodypublic String setupForm(String name,int age){System.out.println(name name , age age);return name age;}
}简单类型接值【形参和请求参数不一致】 指定绑定的请求参数名RequestParam(value指定请求参数名) 【形参名和请求参数名一致可以省略】要求请求参数必须传递required false【前端是否必须传递此此参数,默认是必须,不传报400异常】为请求参数提供默认值 defaultValue 1【当非必须传递的时候, 可以设置默认值】) 浏览器请求 handler 接收参数
public class HelloController {//绑定请求参数为 myname 和 myage。myage 不必须传递。默认值为 0RequestMapping(value /springmvc/hello)ResponseBodypublic String hello(RequestParam(value myname) String name, RequestParam(value myage, required false, defaultValue 0) int age) {System.out.println(name: name ,age: age);return name : age;}
}数组类型接收 param 的 key 和 数组参数名一致就会接收 客户端请求 handler 接收参数
Controller
RequestMapping(user)
public class testcontroller {ResponseBodyRequestMapping//注意这里的 数组 参数名要和 param 的 key 一致public String test1(RequestParam String[] names) {System.out.println(Arrays.toString(names));return Arrays.toString(names);}
}集合类型接收 一个名字对应多个值 多选框提交的数据的时候一个key对应多个值我们可以使用集合进行接收集合用 RequestParam 声明 注意param 的 key 要和集合名字一样 客户端请求 handler 接收参数
Controller
RequestMapping(user)
public class testcontroller {ResponseBodyRequestMapping//注意这里的 List 参数名要和 param 的 key 一致public String test1(RequestParam ListString names) {System.out.println(names);return names.toString();}}实体类类型接收 要通过对象接收参数值只需创建一个实体类为每个属性配备 get 和 set 方法客户端传递的 param key 要和 实体类的属性名一致。接收参数时在形参列表中声明实体类对象即可。 . 如果是实体类对象的属性还是个对象那就用 address.provice 这样来做 param 的 key 注意点实体类必须有 get 和 set
pojo
Data
public class User {private int age;private String name;private Address address;
}Data
public class Address {private String province;private String city;}客户端 handler
Controller
RequestMapping(user)
public class testcontroller {ResponseBodyRequestMappingpublic String test1(User user) {System.out.println(user);return user.toString();}}日期参数接收 param 的 key 要和 日期类型的参数名一样。并且用 DateTimeFormat 指定格式 客户端 handler
Controller
RequestMapping(user)
public class testcontroller {ResponseBodyRequestMappingpublic String test1(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDate updateTime) {System.out.println(updateTime);return updateTime.toString();}}路径参数接收
{} 声明的路径原理就是 * 动态路径参数http://localhost:8080/path/key/root 这里的 key/root 假如是动态路径。那它可以当参数传递给 handler 接收动态路径参数必须要用 PathVariable 声明。如果 handler 形参名和路径的名字一样。那就直接 PathVariable 就行。不一样就手动指定 PathVariable 的 name 客户端 handler
Controller
//这里 key 和 password 可以传递给下面的 handler
RequestMapping(path/{key}/{password})
public class testcontroller {ResponseBodyRequestMappingpublic String //第一个参数因为形参名和路径名不一样所以要设置 name 参数test1(PathVariable(name key) String mykey, PathVariable String password) {System.out.println(mykey : password);return mykey : password;}}JSON 参数接收 前端发送 JSON 数据时Spring MVC 框架可通过 RequestBody 注解将其转为 Java 对象。此注解表示方法参数值从请求体获取Springboot 中直接添加该注解就行无需额外操作且不用指定 value 属性它会自动映射到相应的参数上。 第一步导入 jackson 依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.0/version
/dependency第二步在配置类上添加 EnableWebMvc注解 不做一二步会报 415 错误因为原生 java api 不支持 JSON这一步会自动加上 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 到 ioc 容器 并且给 RequestMappingHandlerAdapter 配置 json 转换器 EnableWebMvc //给 handlerAdapter 配置了 json 转化器
Configuration
ComponentScan(com.atguigu.json)
public class MvcConfig {}第三步给前端来的JSON存储的 POJO 类
Data
public class Person {private String name;private int age;private String gender;}第四步接收 JSON
RequestMapping(/json)
Controller
ResponseBody
public class JsonController {//data - 请求体 post {name,age,gender}//前端 传了一个 json 报 415//原因: java原生的api 只支持路径参数和 param 参数 不支持 json// json 本身就是前端的格式//解决: 1. 导入 json 处理的依赖 2.handlerAdapter 配置 json 转化器PostMapping(data)public String data(RequestBody Person person) {System.out.println(person person);return person.toString();}
}
Cookie 数据接收 可以使用 CookieValue 注解将 HTTP Cookie 的值绑定到的方法参数。 Controller
ResponseBody
RequestMapping(/test)
public class testcontroller {RequestMapping(/cooie)//形参名和 cookie key 一样就不用给 CookieValue 指定 namepublic String addPerson(CookieValue String cookieName){System.out.println(value cookieName);return cookieName;}//创建 CookieGetMapping(save)public String save(HttpServletResponse response) {Cookie cookie new Cookie(cookieName, root);response.addCookie(cookie);return ok;}}
请求头信息接收 第一种根据参数接收 RequestHeader(请求头的 key) GetMapping(/demo)
public void handle(RequestHeader(Accept-Encoding) String encoding, RequestHeader(Keep-Alive) long keepAlive) { ...
}第二种根据形参名自动匹配
//获取 token
//这种是根据根据参数名自动匹配
GetMapping(/demo)
public void handle(RequestHeader String token) { }原生 API 参数调用 直接在形参传就行 /*** 如果想要获取请求或者响应对象,或者会话等,可以直接在形参列表传入,并且不分先后顺序!* 注意: 接收原生对象,并不影响参数接收!*/
GetMapping(api)
ResponseBody
public String api(HttpSession session , HttpServletRequest request,HttpServletResponse response){String method request.getMethod();System.out.println(method method);return api;
}共享域对象操作 1. ServletContext 共享域ServletContext 对象可以在整个 Web 应用程序中共享数据是最大的共享域。一般可以用于保存整个 Web 应用程序的全局配置信息以及所有用户都共享的数据。在 ServletContext 中保存的数据是线程安全的。 . 2. HttpSession 共享域HttpSession 对象可以在同一用户发出的多个请求之间共享数据但只能在同一个会话中使用。比如可以将用户登录状态保存在 HttpSession 中让用户在多个页面间保持登录状态。 . 3. HttpServletRequest 共享域HttpServletRequest 对象可以在同一个请求的多个 handler 方法之间共享数据。比如可以将请求的参数和属性存储在 HttpServletRequest 中让处理器方法之间可以访问这些数据。 API功能void setAttribute(String name,String value)向域对象中添加/修改数据Object getAttribute(String name);从域对象中获取数据removeAttribute(String name); 移除域对象中的数据
request 级别共享域
RequestMapping(/attr/request/original)
ResponseBody
// 拿到原生对象就可以调用原生方法执行各种操作
public String testAttrOriginalRequest(HttpServletRequest request) {request.setAttribute(requestScopeMessageOriginal, i am very happy[original]);return target;
}session 级别共享域 获取 Session 对象HttpSession session req.getSession();获取 Session 的 IDString jSessionId session.getId();判断session是不是新创建的session boolean isNew session.isNew();向session对象中存入数据session.setAttribute(username,username); RequestMapping(/attr/session)
ResponseBody
public String testAttrSession(HttpSession session) {//直接对session对象操作,即对会话范围操作!return target;
}Application 级别共享地域 springmvc 会在初始化容器的时候将 servletContext对象存储到 ioc 容器中 /自动装配
Autowired
private ServletContext servletContext;RequestMapping(/attr/application)
ResponseBody
public String attrApplication() {servletContext.setAttribute(appScopeMsg, i am hungry...);return target;
}//使用 request 或者 seesion 获取public void data(HttpServletResponse response, HttpServletRequest request, HttpSession session) {//正常使用原生对象就可以ServletContext servletContext request.getServletContext();ServletContext servletContext1 session.getServletContext();}SpringMVC 响应数据 开发模式介绍 前后端不分离: controller 通过共享域对象让动态页面从共享域取数据然后返回装配好的 html 文件。然后把 html 文件返回给浏览器 页面跳转
快速返回模板视图
第一步导入 jsp 依赖
!-- jsp需要依赖! jstl--
dependencygroupIdjakarta.servlet.jsp.jstl/groupIdartifactIdjakarta.servlet.jsp.jstl-api/artifactIdversion3.0.0/version
/dependency第二步创建 jsp 页面 建议位置/WEB-INF/下避免外部直接访问 位置/WEB-INF/views/home.jsp % page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitleTitle/title/headbody!-- 可以获取共享域的数据,动态展示! jsp 后台vue --\){msg}/body
/html
第三步配置 jsp 视图解析器
EnableWebMvc //json数据处理,必须使用此注解,因为他会加入json处理器
Configuration
ComponentScan(basePackages com.atguigu.controller) //TODO: 进行controller扫描//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {//配置jsp对应的视图解析器Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {//registry 可以快速添加前后缀registry.jsp(/WEB-INF/views/,.jsp);}
}第五步handler 返回视图
Controller
RequestMapping(jsp)
public class JspController {/*** 快速查找视图* 1.方法的返回值是字符串类型* 2.不能添加 ResponseBody* 3.通过返回值拼接视图名称* return/GetMapping(index)public String index(HttpServletRequest request) {//request 数据发送给 jsprequest.setAttribute(data, hello);//和前后缀拼接return index;}
}请求转发和响应重定向 将方法的返回值设置String类型转发使用 forward关键字重定向使用redirect关键字总之就是 fordwrad/redirect: /路径注意如果是项目下的资源转发和重定向都一样都是项目下路径都不需要添加项目根路径 请求转发 客户端只发送了一次请求, 客户端地址栏不变请求转发可以转发给WEB-INF下受保护的资源请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转 Controller
RequestMapping(jsp)
public class JspController {GetMapping(index)public String index(HttpServletRequest request) {//request 数据发送给 jsprequest.setAttribute(data, hello);//和前后缀拼接return index;}/** 转发: 只能是项目下的资源* 1.方法的返回值写成字符串* 2.不能添加 responseBody 注解* 3. 返回的字符串前 forward: /转发地址/GetMapping(forward)public String forward() {/* / 表示 http://localhost:8080/ jsp/index 表示要转发的地址*/return forward:/jsp/index}
}响应重定向 客户端至少发送了两次请求, 客户端地址栏是要变化的重定向可以是其他Servlet动态资源,也可以是一些静态资源以实现页面跳转重定向不可以到给WEB-INF下受保护的资源 Controller
RequestMapping(jsp)
public class JspController {GetMapping(index)public String index(HttpServletRequest request) {//request 数据发送给 jsprequest.setAttribute(data, hello);//和前后缀拼接return index;}/* 转发: 只能是项目下的资源* 1.方法的返回值写成字符串* 2.不能添加 responseBody 注解* 3. 返回的字符串前 forward: /转发地址/GetMapping(redirect)public String redirect() {/* / 表示 http://localhost:8080/ jsp/index 表示要重定向的地址*/return redirect:/jsp/index}
}返回 JSON 数据
基本使用
导入 json 依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.0/version
/dependency添加 EnableWebMvc 注解
//TODO: SpringMVC对应组件的配置类 [声明SpringMVC需要的组件信息]EnableWebMvc //json数据处理,必须使用此注解,因为他会加入json处理器。还会自动导入 handlerMapping 和 handlerAdapter
Configuration
ComponentScan(basePackages com.atguigu.controller) //TODO: 进行controller扫描//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {}创建 pojo
Data
public class User {private String name;private int age;}响应数据
RequestMapping(json)
RestController //Controller ResponseBody
public class JsonController {GetMapping(data2)public ListUser data1() {User user new User();user.setName(two dogs!);user.setAge(3);ListUser users new ArrayList();users.add(user);return users;}
}ResponseBody 注解
方法上使用 ResponseBody 在前后端分离项目里ResponseBody 注解加在方法上它会把方法返回的对象序列化成 JSON 或 XML 格式的数据直接发给客户端。这意味着返回值 不会走视图解析器渲染这一步而是 直接作为数据响应。] RequestMapping(value /user/detail, method RequestMethod.POST)
ResponseBody
public User getUser(RequestBody User userParam) {System.out.println(userParam userParam);User user new User();user.setAge(18);user.setName(John);//返回的对象,会使用jackson的序列化工具,转成json返回给前端!return user;
}类上使用 ResponseBody 如果类中每个方法上都标记了 ResponseBody 注解那么这些注解就可以提取到类上。 ResponseBody //responseBody可以添加到类上,代表默认类中的所有方法都生效!
Controller
RequestMapping(param)
public class ParamController {RestController 注解 类上的 RestponseBody 注解可以和 Controller 注解合并为 RestController 注解。所以使用了 RestController 注解就相当于给类中的每个方法都加了 ResponseBody 注解。 返回静态资源 资源本身已经是可以直接拿到浏览器上使用的程度了不需要在服务器端做任何运算、处理。典型的静态资源包括 纯HTML文件图片CSS文件JavaScript文件…… 在 web 应用中加入静态资源 手动构建确保编译 改造配置类 重写 configureDefaultServletHandling 开启经他i资源处理 EnableWebMvc //json数据处理,必须使用此注解,因为他会加入json处理器
Configuration
ComponentScan(basePackages com.atguigu.controller) //TODO: 进行controller扫描
//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {//配置jsp对应的视图解析器Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {//快速配置jsp模板语言对应的//这里是前缀和后缀。等下会把 controller 中发过来的字符串进行拼接访问registry.jsp(/WEB-INF/views/,.jsp);}//开启静态资源处理 mvc:default-servlet-handler///dispatcherServlet - handlerMMapping 找有没有对应的 handler(controller) - 没有再去找 - 有没有静态资源Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}
}RESTFul 风格设计规范 HTTP 协议请求方式要求 REST 风格主张在项目设计、开发过程中具体的操作符合HTTP协议定义的请求方式的语义。 操作请求方式查询操作GET保存操作POST删除操作DELETE更新操作PUT
URL 风格要求 在 RESTful 风格的 API 设计里URL 路径一般用名词命名用来表示资源。资源可以是用户、订单这类实体也能是搜索、计算等服务。设计 URL 路径时强调用名词标识资源而非用动词描述操作。比如把/editEmp动词改成/Emp名词 。 . 例如 GET /users检索用户列表POST /users创建新用户PUT /users/123更新ID为123的用户DELETE /users/123删除ID为123的用户 操作传统风格REST 风格保存/CRUD/saveEmp URL 地址/CRUD/emp 请求方式POST删除/CRUD/removeEmp?empId2 URL 地址/CRUD/emp/2 请求方式DELETE更新/CRUD/updateEmp URL 地址/CRUD/emp 请求方式PUT查询/CRUD/editEmp?empId2URL 地址/CRUD/emp/2 请求方式GET
传递参数设计要求 获取数据 GET 删除数据 DELTETE 参数是 id 标识。使用路径 方式 /url/id参数是 是 范围参数。使用 param 方式 /url?page1size10 保存数据 POST修改数据 PUT 全部使用请求体传递 JSON 方式 其他原则 请求参数应该限制在 10 个以内过多的请求参数可能导致接口难以维护和使用。对于敏感信息最好使用 POST 采用请求体来传递参数。如果地址冲突 (请求方式 和 路径都一样) 那就在后面加个动词区分一下比如 GET /user 和 GET /user/search 实战举例
接口设计
功能接口和请求方式请求参数返回值分页查询GET /userpage1size10{ 响应数据 }用户添加POST /user{ user 数据 }{响应数据}用户详情GET /user/1路径参数{响应数据}用户更新PUT /user{ user 更新数据}{响应数据}用户删除DELETE /user/1路径参数{响应数据}条件模糊GET /user/searchpage1size10keywork关键字{响应数据}
用户 pojo
package com.atguigu.pojo;/* projectName: com.atguigu.pojo* 用户实体类/
Data
public class User {private Integer id;private String name;private Integer age;
}
controller
/** projectName: com.atguigu.controller** description: 用户模块的控制器/
RequestMapping(user)
RestController
public class UserController {/** 模拟分页查询业务接口/GetMappingpublic Object queryPage(RequestParam(name page,required false,defaultValue 1)int page,RequestParam(name size,required false,defaultValue 10)int size){System.out.println(page page , size size);System.out.println(分页查询业务!);return {status:ok};}/** 模拟用户保存业务接口/PostMappingpublic Object saveUser(RequestBody User user){System.out.println(user user);System.out.println(用户保存业务!);return {status:ok};}/** 模拟用户详情业务接口/PostMapping(/{id})public Object detailUser(PathVariable Integer id){System.out.println(id id);System.out.println(用户详情业务!);return {status:ok};}/** 模拟用户更新业务接口/PutMappingpublic Object updateUser(RequestBody User user){System.out.println(user user);System.out.println(用户更新业务!);return {status:ok};}/** 模拟条件分页查询业务接口*/GetMapping(search)public Object queryPage(RequestParam(name page,required false,defaultValue 1)int page,RequestParam(name size,required false,defaultValue 10)int size,RequestParam(name keyword,required false)String keyword){System.out.println(page page , size size , keyword keyword);System.out.println(条件分页查询业务!);return {status:ok};}
}SpringMVC 声明式全局异常处理 单独写一个异常类。发生异常就会走此类下的 handler 方法 ControllerAdvice: 走字符串拼接网址那一套。前后端不分离的RestControllerAdvice直接返回数据。不拼接。前后端分离 只要发生异常就进入这里寻找对应的异常处理并且要注意在配置类扫描这个全局异常类
//全局异常发生会走此类下的 handler 方法
//ControllerAdvice //可以返回逻辑视图 转发和重定向
RestControllerAdvice
public class GlobalExceptionHandler {//发生异常 - 进入 ControllerAdvice 注解的类型 - 根据ExceptionHandler(指定的异常) 去处理//指定的异常 可以精准查找 或者查找父异常ExceptionHandler(ArithmeticException.class)public Object ArithmeticException(ArithmeticException e) {String message e.getMessage();System.out.println(message message);return message;}//如果没有 ArithmeticException 就走 ExceptionExceptionHandler(Exception.class)public Object Exception(Exception e) {String message e.getMessage();System.out.println(message message);return message;}}!– 扫描controller对应的包,将handler加入到ioc–ComponentScan(basePackages {com.atguigu.controller,com.atguigu.exceptionhandler})SpringMVC 拦截器 拦截器方法拦截位置 拦截器使用 就是自定义一个拦截器类实现 HandlerInterceptor 然后配置类实现 WebMvcConfigurer 扫描拦截器类。配置拦截路径 实现 HandlerInterceptor 实现其所有方法 配置类实现 WebMvcConfigurer 添加拦截器
EnableWebMvc //json数据处理,必须使用此注解,因为他会加入json处理器
Configuration
ComponentScan(basePackages {com.atguigu.controller,com.atguigu.exceptionhandler})
public class SpringMvcConfig implements WebMvcConfigurer {//添加拦截器Overridepublic void addInterceptors(InterceptorRegistry registry) {//配置方案1 拦截全部请求registry.addInterceptor(new MyInterceptor());//配置方案2 指定地址拦截// * 任意一层字符串 ** 任意多层字符串registry.addInterceptor(new MyInterceptor()).addPathPatterns(/user/data);//配置方案3 排除拦截 // addPathPatterns 需要拦截的路径// excludePathPatterns 需要拦截的路径中有哪些不拦截registry.addInterceptor(new MyInterceptor()).addPathPatterns(/user/**).excludePathPatterns(/user/data1);}
}
多个拦截器情况 如果有多个拦截器执行顺序 preHandle() 方法SpringMVC 会把所有拦截器收集到一起然后按照配置顺序调用各个 preHandle() 方法。postHandle() 方法SpringMVC 会把所有拦截器收集到一起然后按照配置相反的顺序调用各个 postHandle() 方法。afterCompletion() 方法SpringMVC 会把所有拦截器收集到一起然后按照配置相反的顺序调用各个 afterCompletion() 方法。 SpringMVC 参数校验 为什么使用参数校验 本来是要在 Service 写校验的。现在我们直接在 pojo 类加校验注解就行 校验注解详解
注解规则Null标注值必须为 nullNotNull标注值不可为 nullAssertTrue标注值必须为 trueAssertFalse标注值必须为 falseMin(value)标注值必须大于或等于 valueMax(value)标注值必须小于或等于 valueDecimalMin(value)标注值必须大于或等于 valueDecimalMax(value)标注值必须小于或等于 valueSize(max,min)标注值大小必须在 max 和 min 限定的范围内Digits(integer,fratction)标注值值必须是一个数字且必须在可接受的范围内Past标注值只能用于日期型且必须是过去的日期Future标注值只能用于日期型且必须是将来的日期Pattern(value)标注值必须符合指定的正则表达式 JSR 303 只是一套标准需要提供其实现才可以使用。Hibernate Validator 是 JSR 303 的一个参考实现除支持所有标准的校验注解外它还支持以下的扩展注解 注解规则Email标注值必须是格式正确的 Email 地址Length标注值字符串大小必须在指定的范围内NotEmpty标注值字符串不能是空字符串Range标注值必须在指定的范围内 配置 EnableWebMvc 后SpringMVC 会默认装配好一个 LocalValidatorFactoryBean通过在处理方法的入参上标注 Validated 注解即可让 SpringMVC 在完成数据绑定后执行数据校验的工作。 参数校验使用
第一步导入依赖
!– 校验注解 –
dependencygroupIdjakarta.platform/groupIdartifactIdjakarta.jakartaee-web-api/artifactIdversion9.1.0/versionscopeprovided/scope
/dependency!– 校验注解实现–
!– https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator –
dependencygroupIdorg.hibernate.validator/groupIdartifactIdhibernate-validator/artifactIdversion8.0.0.Final/version
/dependency
!– https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor –
dependencygroupIdorg.hibernate.validator/groupIdartifactIdhibernate-validator-annotation-processor/artifactIdversion8.0.0.Final/version
/dependencyPOJO类
public class User {NotNullprivate String name;Emailprivate String email;Size(min 6, max 20)private String password;// 省略 getter 和 setter
}Controller 类
RestController
public class UserController {//User 类用 JSR 303 注解校验属性。//UserController 的 addUser 方法加 Validated 触发 User 对象校验请求 /user 时不符规则会返回错误信息。PostMapping(/user)public String addUser(Validated RequestBody User user) {return User added successfully;}
}易混淆注解总结 NotNull 适用于包装类型若被标注字段的值为 null校验失败并抛出异常。不能用于字符串类型的校验。 . NotEmpty 可用于 CharSequence、Collection、Map 或数组对象类型的属性。对于其他类型的属性该注解无效校验规则若属性为 null 或 size() 为 0则校验失败。对于仅包含空格的字符串中间有空格也算不会认为是空字符串校验不会失败。 . NotBlank 专门用于字符串类型属性的校验。校验规则若属性为 null、空字符串 “” 或仅含空格则校验失败。 . 在数据校验时要根据具体情况选用合适的注解 对包装类型且不能为 null 的使用 NotNull。对于 CharSequence、Collection、Map 或数组不能为 null 且 size() 不为 0 的使用 NotEmpty。对于字符串不能为 null、空串或仅含空格的使用 NotBlank。
- 上一篇: 网站中转页网站网页怎么压缩
- 下一篇: 网站重新制作多久google重新收录wordpress守望
相关文章
-
网站中转页网站网页怎么压缩
网站中转页网站网页怎么压缩
- 技术栈
- 2026年03月21日
-
网站中有一个非常著名的原则天津网站备案
网站中有一个非常著名的原则天津网站备案
- 技术栈
- 2026年03月21日
-
网站中如何嵌入支付宝Html5移动网站
网站中如何嵌入支付宝Html5移动网站
- 技术栈
- 2026年03月21日
-
网站重新制作多久google重新收录wordpress守望
网站重新制作多久google重新收录wordpress守望
- 技术栈
- 2026年03月21日
-
网站主办者有效证件电子件重庆建工集团建设网站
网站主办者有效证件电子件重庆建工集团建设网站
- 技术栈
- 2026年03月21日
-
网站主机提供商网站建设怎样才能吸引顾客
网站主机提供商网站建设怎样才能吸引顾客
- 技术栈
- 2026年03月21日
