六安网站制作哪家好,芜湖哪家公司做网站不错,深圳网站建设黄浦网络 骗钱,五分钟wordpress第四章 Spring MVC
第一节 Spring MVC 简介
1. Spring MVC
SpringMVC是一个Java 开源框架#xff0c; 是Spring Framework生态中的一个独立模块#xff0c;它基于 Spring 实现了Web MVC#xff08;数据、业务与展现#xff09;设计模式的请求驱动类型的轻量级Web框架 是Spring Framework生态中的一个独立模块它基于 Spring 实现了Web MVC数据、业务与展现设计模式的请求驱动类型的轻量级Web框架为简化日常开发提供了很大便利。
2. Spring MVC 核心组件 DispatcherServlet 前置控制器 负责接收请求、分发请求 Handler 处理器 处理器包括了拦截器、控制器中的方法等主要负责处理请求 HandlerMapping 处理器映射器 解析配置文件、扫描注解将请求与处理器进行匹配 HandlerAdpter 处理器适配器 根据请求来找到匹配的处理器这个过程称为适配 ViewResolver 视图解析器 处理器执行后得到的结果可能是一个视图但这个视图属于逻辑视图页面中存在逻辑代码比如循环、判断需要使用视图解器行处理这个过程称为渲染视图
第二节 Spring MVC 发展演变
!--低版本--
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion4.3.9.RELEASE/version
/dependency
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion4.3.9.RELEASE/version
/dependency
dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope
/dependency1. Bean的名字或ID匹配URL请求
1.1 web.xml 配置
servletservlet-namedispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-param!--配置Servlet初始化参数--param-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-param!--前置控制器要接收所有的请求因此在容器启动的时候就应该完成初始化--load-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-namedispatcherServlet/servlet-nameurl-pattern//url-pattern
/servlet-mapping1.2 spring-mvc.xml 配置
!--视图解析器在控制器返回视图的时候生效--
bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!--视图资源的前缀--property nameprefix value/ /!--视图资源的后缀--property namesuffix value.jsp /
/bean
!--处理器映射的方式使用bean的名字或者id的值来与请求匹配--
bean classorg.springframework.web.servlet.handler.BeanNameUrlHandlerMapping/1.3 编写控制器
public class UserController extends AbstractController {Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {//这里使用配置的视图解析器进行解析 user / user .jsp /user.jspreturn new ModelAndView(user);}
}1.4 配置控制器
!--通过id值匹配请求的URL--
bean id/view classcom.qf.spring.mvc.controller.UserController /思考按照这种匹配请求的方式每一个请求需要一个控制器与之对应这与使用Servlet开发一样会编写大量的控制器导致开发效率极为低下如何解决
Spring 提供了方法名来匹配请求来解决这个问题2. Bean的方法名匹配请求
2.1 方法名解析器
Spring 提供了控制器内的方法名的解析器 InternalPathMethodNameResolver该解析器作用就是将方法名作为匹配URL请求的依据与控制器关联起来
2.2 多操作控制器
Spring 提供了 MultiActionController 控制器类供其他控制器类继承在其子类中开发者可以编写多个处理请求的方法然后使用方法名解析器去匹配请求
2.3 编写控制器
public class UserMultiController extends MultiActionController {//这个方法就匹配 /login 请求//请求格式必须是 //ModelAndView 方法名(HttpServletRequest req, HttpServletResponse resp){}public ModelAndView login(HttpServletRequest req, HttpServletResponse resp){return new ModelAndView(login);}//这个方法就匹配 /register 请求public ModelAndView register(HttpServletRequest req, HttpServletResponse resp){return new ModelAndView(register);}
}2.4 spring-mvc.xml 配置 !--方法名解析器--
bean idmethodNameResolver classorg.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver /
!-- /login 请求使用该bean对象处理--
bean id/login classcom.qf.spring.mvc.controller.UserMultiControllerproperty namemethodNameResolver refmethodNameResolver /
/bean
!-- /register 请求使用该bean对象处理--
bean id/register classcom.qf.spring.mvc.controller.UserMultiControllerproperty namemethodNameResolver refmethodNameResolver /
/bean思考按照这种匹配请求的方式如果一个控制器要处理多个请求那么就会导致配置信息繁多的问题后期难以维护如何解决
Spring 提供了 SimpleUrlHandlerMapping 映射器 该映射器支持一个控制器与多个请求匹配的同时也解决了配置信息繁多的问题。3. 简单URL处理器映射
使用SimpleUrlHandlerMapping只需要修改 spring-mvc.xml 配置即可。
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--视图解析器在控制器返回视图的时候生效--bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!--视图资源的前缀--property nameprefix value/ /!--视图资源的后缀--property namesuffix value.jsp //bean!--处理器映射的方式使用bean的名字或者id的值来与请求匹配--
!-- bean classorg.springframework.web.servlet.handler.BeanNameUrlHandlerMapping/--!--通过id值匹配请求的URL--
!-- bean id/view classcom.qf.spring.mvc.controller.UserController /--!--方法名解析器--
!-- bean idmethodNameResolver classorg.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver /--!-- /login 请求使用该bean对象处理--
!-- bean id/login classcom.qf.spring.mvc.controller.UserMultiController--
!-- property namemethodNameResolver refmethodNameResolver /--
!-- /bean--!-- /register 请求使用该bean对象处理--
!-- bean id/register classcom.qf.spring.mvc.controller.UserMultiController--
!-- property namemethodNameResolver refmethodNameResolver /--
!-- /bean--bean classorg.springframework.web.servlet.handler.SimpleUrlHandlerMappingproperty namemappingspropsprop key/viewuserController/propprop key/user/*userMultiController/prop/props/property/beanbean iduserController classcom.qf.spring.mvc.controller.UserController /bean iduserMultiController classcom.qf.spring.mvc.controller.UserMultiController /
/beans思考随着项目开发的推进开发的业务功能越来越多控制器的数量也会伴随着增加请求的匹配同时也会增加同样会造成后期难以维护的问题如何解决呢
Spring 提供了 DefaultAnnotationHandlerMapping 映射器支持使用注解来匹配请求这样就解决了请求匹配导致配置信息繁多的问题同时还提升了开发效率。4. 注解匹配请求
4.1 编写控制器
Controller
public class UserAnnotationController {RequestMapping(value /login, method RequestMethod.GET)public String login(){return login;}RequestMapping(value /register, method RequestMethod.GET)public String register(){return register;}
}4.2 spring-mvc.xml 配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd!--视图解析器在控制器返回视图的时候生效--bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!--视图资源的前缀--property nameprefix value/ /!--视图资源的后缀--property namesuffix value.jsp //bean!--处理器映射的方式使用bean的名字或者id的值来与请求匹配--
!-- bean classorg.springframework.web.servlet.handler.BeanNameUrlHandlerMapping/--!--通过id值匹配请求的URL--
!-- bean id/view classcom.qf.spring.mvc.controller.UserController /--!--方法名解析器--
!-- bean idmethodNameResolver classorg.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver /--!-- /login 请求使用该bean对象处理--
!-- bean id/login classcom.qf.spring.mvc.controller.UserMultiController--
!-- property namemethodNameResolver refmethodNameResolver /--
!-- /bean--!-- /register 请求使用该bean对象处理--
!-- bean id/register classcom.qf.spring.mvc.controller.UserMultiController--
!-- property namemethodNameResolver refmethodNameResolver /--
!-- /bean--!--bean classorg.springframework.web.servlet.handler.SimpleUrlHandlerMappingproperty namemappingspropsprop key/viewuserController/propprop key/loginuserMultiController/propprop key/registeruserMultiController/prop/props/property/beanbean iduserController classcom.qf.spring.mvc.controller.UserController /bean iduserMultiController classcom.qf.spring.mvc.controller.UserMultiController /--!--类上的注解处理器--bean classorg.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping /!--方法上的注解处理器--bean classorg.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter /!--扫描包使得该包下类以及类中定义的方法上所使用的注解生效--context:component-scan base-packagecom.qf.spring.mvc.controller /
/beans5. 较新的版本配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd!--视图解析器在控制器返回视图的时候生效--bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!--视图资源的前缀--property nameprefix value/ /!--视图资源的后缀--property namesuffix value.jsp //bean!--较新的版本使用该标签开启注解支持--mvc:annotation-driven /!--扫描包使得该包下类以及类中定义的方法上所使用的注解生效--context:component-scan base-packagecom.qf.spring.mvc.controller /
/beans第三节 Spring MVC 常用注解
1. Controller
该注解是一个控制器的标识
Controller
public class UserController{}2. RequestMapping
该注解用于匹配请求
Controller
RequestMapping(/user)
public class UserController{RequestMapping(value/login, methodRequestMethod.POST)public int login(){return 1;}
}3. RequestBody
该注解只能应用在方法的参数上用于从请求体中获取数据并注入至参数中
Controller
RequestMapping(/user)
public class UserController{RequestMapping(value/login, methodRequestMethod.POST)public int login(RequestBody User user){return 1;}
}4. ResponseBody
该注解用于向页面传递数据
Controller
RequestMapping(/user)
public class UserController{RequestMapping(value/login, methodRequestMethod.POST)ResponseBodypublic int login(RequestBody User user){return 1;}
}5. RequestParam
该注解只能应用在方法的参数上用于从请求头中获取数据并注入至参数中
Controller
RequestMapping(/user)
public class UserController{RequestMapping(value/search, methodRequestMethod.GET)ResponseBodypublic ListUser searchUsers(RequestParam(valuename) String name){return new ArrayList();}
}6. PathVariable
该注解只能应用在方法的参数上用于从请求路径中获取数据并注入至参数中
Controller
RequestMapping(/user)
public class UserController{// /user/adminRequestMapping(value/{username}, methodRequestMethod.GET)ResponseBodypublic User queryUser(PathVariable(username) String username){return new User();}
}7. SessionAttributes[不重要]
该注解只能使用在类定义上用于从将输入放入 session 中
SessionAttributes(typesUser.class) //会将model中所有类型为 User的属性添加到会话中。
SessionAttributes(value{“user1”, “user2”}) //会将model中属性名为user1和user2的属性添加到会话中。
SessionAttributes(types{User.class, Dept.class}) //会将model中所有类型为 User和Dept的属性添加到会话中。
SessionAttributes(value{“user1”,“user2”},types{Dept.class}) //会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。8. RequestHeader
该注解只能应用在方法的参数上用于从请求头中获取数据
RequestMapping(/find)
public void findUsers(RequestHeader(Content-Type) String contentType) {//从请求头中获取Content-Type的值
} 9. CookieValue
该注解只能应用在方法的参数上用于从请求中获取cookie的值
RequestMapping(/find)
public void findUsers(CookieValue(JSESSIONID) String jsessionId) {//从请cookie中获取jsessionId的值
} 10. ControllerAdvice
该注解只能应用在类上表示这个类就是处理异常的控制器
/*** 异常处理的控制器*/
ControllerAdvice //这个注解就是spring mvc提供出来做全局异常统一处理的
public class ExceptionController {
}11. ExceptionHandler
该注解只能应用在ControllerAdvice或者说RestControllerAdvice标识的类的方法上用来处理异常
/*** 异常处理的控制器*/
ControllerAdvice //这个注解就是spring mvc提供出来做全局异常统一处理的
public class ExceptionController {ExceptionHandler //异常处理器ResponseBody //响应至页面public String handleException(Exception e){return e.getMessage();}
}第四节 JSR-303
1. JSR-303 简介
JSR全称为 Java Specification Requests表示 Java 规范提案。JSR-303是 Java 为 Java Bean 数据合法性校验提供的标准框架它定义了一套可标注在成员变量属性方法上的校验注解。Hibernate Validatior提供了这套标准的实现。
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion6.0.1.Final/version!-- 最新7.0.1.Final --
/dependency2. 校验注解
注解解释注解解释Null必须为nullNotNull不能为nullAssertTrue必须为trueAssertFalse必须为falseMin必须为数字其值大于或等于指定的最小值Max必须为数字其值小于或等于指定的最大值DecimalMin必须为数字其值大于或等于指定的最小值DecimalMax必须为数字其值小于或等于指定的最大值Size集合的长度Digits必须为数字其值必须再可接受的范围内Past必须是过去的日期Future必须是将来的日期Pattern必须符合正则表达式Email必须是邮箱格式Length(min,max)字符串的大小必须在指定的范围内NotEmpty不能为null长度大于0Range(min,max,message)元素必须在合适的范围内NotBlank不能为null字符串长度大于0(限字符串)
3. 应用
dependencygroupIdorg.springframework/groupIdartifactIdspring-context-support/artifactIdversion5.3.10/version
/dependency
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.10/version
/dependency
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion6.0.1.Final/version
/dependency
dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.78/version
/dependency
dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope
/dependency!-- web.xml --
servletservlet-namedispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-paramload-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-namedispatcherServlet/servlet-nameurl-pattern//url-pattern
/servlet-mapping?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/pxmlns:mvchttp://www.springframework.org/schema/mvcxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsdbean classorg.springframework.web.servlet.view.InternalResourceViewResolver p:prefix/ p:suffix.jsp /mvc:annotation-drivenmvc:message-converters!--处理字符串的消息转换器--bean classorg.springframework.http.converter.StringHttpMessageConverter /!--处理JSON格式的消息转换器--bean classcom.alibaba.fastjson.support.spring.FastJsonHttpMessageConverterproperty namesupportedMediaTypeslistvaluetext/html;charsetUTF-8/valuevalueapplication/json;charsetUTF-8/value/list/property/bean/mvc:message-converters/mvc:annotation-drivencontext:component-scan base-packagecom.qf.spring.controller /
/beansimport org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;import javax.validation.constraints.NotNull;public class User {NotNull(message 账号不能为空)Length(min 8, max 15, message 账号长度必须为8~15位)private String username;NotNull(message 密码不能为空)Length(min 8, max 20, message 密码长度必须为8~20位)private String password;Range(min 0, max 120, message 年龄只能在0~120岁之间)private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}public int getAge() {return age;}public void setAge(int age) {this.age age;}
}import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.validation.Valid;Controller
RequestMapping(/user)
public class UserController {RequestMapping(/add)ResponseBodypublic Object saveUser(Valid User user, BindingResult result){if(result.hasErrors()) return result.getAllErrors();return 1;}
}第五节 RESTFUL
1. RESTFUL 简介
REST全称为 Representational State Transfer表示 表述性状态转移。
RESTFUL有如下特点
每一个 URI 代表一种资源客户端使用GET、POST、PUT、DELETE4 个表示操作方式的动词对服务端资源进行操作GET用来获取资源POST用来新建资源也可以用于更新资源PUT用来更新资源DELETE用来删除资源
2. RESTFUL 请求
/user GET 获取用户资源
/user POST 增加用户资源
/user PUT 修改用户资源
/user DELETE 删除用户资源/user/{username} GET 获取指定用户资源 这是RESTFUL风格中子资源的表述方式3. Spring 对 RESTFUL 的支持
3.1 RestController
该注解只能应用于类上相当于Controller 和 ResponseBody 注解的组合。表示该类中的所有方法执行完成后所返回的结果直接向页面输出
3.2 GetMapping
3.2 PostMapping
3.2 PutMapping
3.2 DeleteMapping
第六节 静态资源处理
1. 静态资源无法访问的原因
静态资源包含html、js、css、图片、字体文件等。静态文件没有url-pattern所以默认是访问不到的。之所以可以访问是因为tomcat中有一个全局的servletorg.apache.catalina.servlets.DefaultServlet它的url-pattern是 “/”, 所以项目中不能匹配的静态资源请求都由这个Servlet来处理。但在SpringMVC中DispatcherServlet也采用了/ 作为url-pattern, 那么项目中不会再使用全局的Serlvet这样就造成了静态资源不能完成访问。
2. 处理方案
2.1 方案一
DispathcerServlet 对应的 url-pattern 修改为 “/” 以外的其他匹配样式即可。比如 *.do, *.action。这样修改后发送请求时请求URL必须匹配 .do 或者 .action。
2.2 方案二
!-- web.xml --
servlet-mappingservlet-namedefault/servlet-nameurl-pattern/static/*/url-pattern/servlet-mapping2.2 方案三
!-- spring-mvc.xml --
!--
这个handler就是处理静态资源的它的处理方式就是将请求转会到tomcat中名为default的Servlet
--
mvc:default-servlet-handler/
!-- mapping是访问路径location是静态资源存放的路径 --
mvc:resources mapping/static/** location/static/ /第七节 中文乱码处理
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0display-nameArchetype Created Web Application/display-nameservletservlet-namedispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-namedispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mappingfilterfilter-nameencodingFilter/filter-name!--字符编码过滤器--filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-param!--编码格式--param-nameencoding/param-nameparam-valueUTF-8/param-value/init-paraminit-param!--强制编码--param-nameforceEncoding/param-nameparam-valuetrue/param-value/init-param/filterfilter-mappingfilter-nameencodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping
/web-app第八节 Spring MVC工作原理 checkMultipart(request); //检测是否是多部分请求这个只可能在文件上传的时候为真getHandler(processedRequest); //获取处理器 遍历HandlerMapping找到匹配当前请求的执行器链
//没有找到执行器链 就直接向页面报一个404
noHandlerFound(processedRequest, response);
//找到处理当前请求的适配器
HandlerAdapter ha getHandlerAdapter(mappedHandler.getHandler());//控制器之前执行的拦截器将先执行如果拦截器不通过则方法直接结束
if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;
}
//控制器处理请求可能会得到一个ModelAndView
mv ha.handle(processedRequest, response, mappedHandler.getHandler());//控制器之后的拦截器执行
mappedHandler.applyPostHandle(processedRequest, response, mv);
//处理分发的结果这个结果就是控制器处理后的结果
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
//拦截器在控制器给出的结果DispatcherServlet处理后执行
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);