SpringMvc笔记(持续更新)
它是 SpringMVC 在 3.0 之后新加入的一个注解,是 SpringMVC 支持 Restful 风格 URL 的一
个重要标志。
该注解的作用大家已经非常熟悉了,就是把藏在请求 URL 中的参数,给我们控制器方法的形参赋
值。而Restful
风格的 URL,在现如今的开发中使用越来越普遍了。那么它是如何实现封装的呢?请看下图:
首先还是执行到红框中解析参数这行代码,
我们看出 SpringMVC 在实现请求 URL 使用占位符传参并封装到控制器方法的形参中,
是通过请求域来实现的。最后把请求域转成一个 Map,再根据形参的名称作为 key,从 map 中
获取 value,并给形
参赋值。当然如果我们使用了 PathVariable 注解的 value 属性,则不会以形参名称为 key,而是
直接使用 value
属性的值作为 key 了。
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
此方法的执行时机是在控制器方法执行之前,所以我们通常是使用此方法对请求部分进行增强。同
时由于结果
视图还没有创建生成,所以此时我们可以指定响应的视图。
此方法的执行时机是在控制器方法执行之后,结果视图创建生成之前。所以通常是使用此方法对响
应部分进行
增强。因为结果视图没有生成,所以我们此时仍然可以控制响应结果。
此方法的执行时机是在结果视图创建生成之后,展示到浏览器之前。所以此方法执行时,本次请求
要准备的数
据具已生成完毕,且结果视图也已创建完成,所以我们可以利用此方法进行清理操作。同时,我们
也无法控制响应
结果集内容。
我们先来看基于 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 注解来比,显然注解来的更
方便。
它就相当于在 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 ‐‐>
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 IOC 容器之间可以设置为父子关系,以实现良好的解耦。
• Spring MVC WEB 层容器可作为 “业务层” Spring 容器的子容器:即 WEB 层容器可以引用业
务层容器的 Bean,而业务层容器却访问不到 WEB 层容器的 Bean
SpingMvc我们就说到这里!!接下来还想看什么专题欢迎到评论区评论!