SpringMvc专题
1.PathVariable
文章目录
前言
SpringMvc笔记(持续更新)
正文
它是 SpringMVC 在 3.0 之后新加入的一个注解,是 SpringMVC 支持 Restful 风格 URL 的一
个重要标志。
该注解的作用大家已经非常熟悉了,就是把藏在请求 URL 中的参数,给我们控制器方法的形参赋
值。而Restful
风格的 URL,在现如今的开发中使用越来越普遍了。那么它是如何实现封装的呢?请看下图:
首先还是执行到红框中解析参数这行代码,
我们看出 SpringMVC 在实现请求 URL 使用占位符传参并封装到控制器方法的形参中,
是通过请求域来实现的。最后把请求域转成一个 Map,再根据形参的名称作为 key,从 map 中
获取 value,并给形
参赋值。当然如果我们使用了 PathVariable 注解的 value 属性,则不会以形参名称为 key,而是
直接使用 value
属性的值作为 key 了。
拦截器的 AOP 思想
AOP 思想是 Spring 框架的两大核心之一,是解决方法调用依赖以及提高方便后期代码维护的重要
思想。它是
把我们代码中高度重复的部分抽取出来,并在适当的时机,通过代理机制来执行,从而做到不修改
源码对已经写好
的方法进行增强。
而拦截器正式这种思想的具体实现。
拦截器代码
1 public class MyInterceptor1 implements HandlerInterceptor{ 2 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse respons e, Object handler) throws Exception { 5 6 System.out.println("拦截器执行了"); 7 return false; 8 } 9 10 11 12 @Override 13 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception { 14 15 System.out.println("执行了 postHandle 方法"); 16 17 } 18 19 @Override 20 public void afterCompletion(HttpServletRequest request, HttpServletResponse res ponse, Object handler, Exception ex) throws Exception { 21 22 System.out.println("执行了 afterCompletion 方法"); 23 } 24 } 25
自定义拦截器中三个方法说明及使用场景
preHandle
此方法的执行时机是在控制器方法执行之前,所以我们通常是使用此方法对请求部分进行增强。同
时由于结果
视图还没有创建生成,所以此时我们可以指定响应的视图。
postHandle
此方法的执行时机是在控制器方法执行之后,结果视图创建生成之前。所以通常是使用此方法对响
应部分进行
增强。因为结果视图没有生成,所以我们此时仍然可以控制响应结果。
afterCompletion
此方法的执行时机是在结果视图创建生成之后,展示到浏览器之前。所以此方法执行时,本次请求
要准备的数
据具已生成完毕,且结果视图也已创建完成,所以我们可以利用此方法进行清理操作。同时,我们
也无法控制响应
结果集内容。
为什么不使用 XML 配置 SpringMVC
我们先来看基于 XML 的 SpringMVC 配置:
第一步:配置 web.xml
第二步:编写控制器
第三步:编写 springmvc.xml
第四步:配置控制器
第五步:配置处理器映射器,处理器适配器。
第六步:配置视图解析器。
其中,前 3 步和第六步基于注解配置时也都有,而第四第五步注解配置只需:
1 <!‐‐ 开启 springmvc 对注解的支持‐‐> 2 3 <mvc:annotation‐driven></mvc:annotation‐driven> 4 5 而 XML 配置则需: 6 7 <!‐‐ 实现 Controller 接口‐‐> 8 9 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 10 <bean name="/sayhello2" class="com.baiqi.web.controller.HelloController2"/> 11 12 <!‐‐ 继承 HttpRequestHandler 类‐‐> 13 <bean name="/sayhello3" class="com.baiqi.web.controller.HelloController3"/> 14 <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/> 15
而对比注解配置只需一个 Controller 注解和一个 RequestMapping 注解来比,显然注解来的更
方便。
mvc:annotation-driven 的说明
它就相当于在 xml 中配置了:
1 <!‐‐ Begin ‐‐> 2 3 <!‐‐ HandlerMapping ‐‐> 4 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappin gHandlerMapping"></bean> 5 6 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> </bean> 7 8 <!‐‐ HandlerAdapter ‐‐> 9 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappin gHandlerAdapter"></bean> 10 11 <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></b ean> 12 13 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapte r"></bean> 14 15 <!‐‐ HadnlerExceptionResolvers ‐‐> 16 <bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHan dlerExceptionResolver"></bean> 17 18 <bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExcep tionResolver"></bean> 19 20 <bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptio nResolver"></bean> 21 22 <!‐‐ End ‐‐>
Spring整合SpringMvc注意事项
Bean 被创建两次 ?
• Spring 的 IOC 容器不应该扫描 SpringMVC 中的 bean, 对应的SpringMVC 的 IOC 容器不应该
扫描 Spring 中的 bean
1 <context:component‐scan base‐package="com.baiqi.springmvc" use‐default‐ filters="false"> 2 <context:include‐filter type="annotation" expression="org.springframework.st ereotype.Controller"/ 3 <context:include‐filter type="annotation" expression="org.springframework.w eb.bind.annotation.ControllerAdvice"/> 4 </context:component‐scan>
1 2 <context:component‐scan base‐package="com.baiqi.springmvc"> 3 <context:exclude‐filter type="annotation" expression="org.springframework.st ereotype.Controller"/> 4 <context:exclude‐filter type="annotation" expression="org.springframework. web.bind.annotation.ControllerAdvice"/> 5 </context:component‐scan>
在 Spring MVC 配置文件中引用业务层的 Bean
• 多个 Spring IOC 容器之间可以设置为父子关系,以实现良好的解耦。
• Spring MVC WEB 层容器可作为 “业务层” Spring 容器的子容器:即 WEB 层容器可以引用业
务层容器的 Bean,而业务层容器却访问不到 WEB 层容器的 Bean
SpingMvc我们就说到这里!!接下来还想看什么专题欢迎到评论区评论!