SpringMvc专题

简介: SpringMvc笔记(持续更新)此方法的执行时机是在控制器方法执行之前,所以我们通常是使用此方法对请求部分进行增强。同时由于结果视图还没有创建生成,所以此时我们可以指定响应的视图。

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我们就说到这里!!接下来还想看什么专题欢迎到评论区评论!

相关文章
|
8月前
|
前端开发 Java 数据处理
|
8月前
|
前端开发 Java 网络架构
|
8月前
|
XML 运维 前端开发
|
8月前
|
前端开发 Java 程序员
|
8月前
|
XML JSON fastjson
|
9月前
|
前端开发 Java Spring
你真的了解SpringMVC吗?(下)
你真的了解SpringMVC吗?(下)
42 0
|
5月前
|
前端开发 Java API
|
5月前
|
存储 JSON 前端开发
|
5月前
|
存储 JSON Java
SpringMVC应用
SpringMVC应用
32 0
|
8月前
|
存储 前端开发 应用服务中间件

相关课程

更多