SpringMVC视频初级教程笔记.md

简书迁移

Posted by thrfox on June 29, 2020

SpringMVC流程与图

1.客户发送request至前端控制器DispatcherServlet 2.DispatcherServlet请求HandlerMapping查找Handler (xml配置或注解查找) 3.HandlerMapping返回Handler 4.DispatcherServlet调用处理器适配器(HandlerAdapter)执行Handler 5.HandlerAdapter执行Handler 6.Handler执行结束返回给HandlerAdapter ModelAndView(底层对象) 7.处理器适配器向前端控制器返回ModelAndView 8.前端控制器请求视图解析器进行视图解析,解析成jsp 9.视图解析器向前端控制器返回View 10.前端控制器进行视图渲染(将ModelAndView数据填充到request) 11.前端控制器向用户相应response

组件 1.DispatcherServlet 接收请求,响应结果,相当于转发器,中央处理器。 减少 了其他组件之间的耦合度。

配置前端控制器

在web.xml中配置前端控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>com.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/spring-mvc/*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--mapping中的name与servlet中的name相同,此mapping才属于该servlet-->
        <url-pattern>*.action</url-pattern>
        <!--第一种:*.action    ,访问以.action结尾由DispatcherServlet进行解析
            第二种:/   ,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析(JSP),
            使用此种风格实现RESTful风格的url
            第三种:/*  ,不对,使用这种配置,最终转发到一个jsp时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错
        -->
    </servlet-mapping>

contextConfigLocation配置spring加载的配置文件(配置处理器映射器,适配器等) ###在classpath下的springmvc.xml中配置处理器映射器 ###在classpath下的springmvc.xml中配置处理器适配器 ###在classpath下的springmvc.xml中配置视图解析器

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--处理器适配器-->
    <!--所有处理器适配器都实现HandlerAdapter接口-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--该适配器能执行实现Controller接口的handler-->
    <!--实现Controller,返回ModelAndView-->

    <!--另一个处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>


    <!--视图解析器-->
    <!--解析jsp视图,默认使用jstl标签,classpath得有jstl的包-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

若不配置,则前端控制器默认从DispatcherServlet.properties中加载默认配置 上述配置为3.1之前过期的配置 3.2之后配置为 image.png

该元素可以代替上边映射器和适配器的配置

使用注解时,映射器与适配器同时使用

@Controller为适配器 @RequestMapping为映射器

对于注解的Handler,可以单个配置,也可以使用组件扫描, 可以扫描controller\service…..

前端控制器源码简单分析

1.前端控制器接收请求调用doDispatch() 2.前端控制器根据映射器查找handler 3.调用适配器执行handler,返回ModelAndView 4.视图解析,得到view; 将model数据填充到request

视图解析器中可以配置前缀和后缀

1
2
3
4
5
6
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图解析器中配置前缀-->
        <property name="prefix" value="WEB-INF/jsp"/>
        <!--视图解析器中配置后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

整合mybatis

image.png

1.整合dao层 mybatis和spring整合,通过spring管理mapper接口. 使用mapper的扫描器自动扫描mapper接口在Spring中进行注册 整合文件applicationContext-dao.xml 配置:数据源/sqlSessionFactory/扫描器 image.png

image.png

image.png

2.整合service层 通过Spring管理service接口. 使用配置方式将service接口配置在spring配置文件中 整合文件applicationContext-service.xml image.png 实现事务控制. 整合文件applicationContext-transaction.xml image.png

3.整合SpringMVC SpringMVC是Spring的模块,不需要整合

在web.xml中加载spring容器

RESTful

http访问的是资源,该资源可以被人或是软件访问, 1.对url进行规范,写RESTful的url 非REST的url : http://…./query?id=001&type=t01 REST的url : http://…./items/001/t01 2.对http的方法规范 不论是删除,添加,更新.使用的url是一致的,如果进行删除,需要设置http的方法为delete,添加同理 后台controller方法:判断http方法(ContentType),DELETE执行删除,POST执行添加 3.对http的contentType规范 请求时,指定contentType,要json数据,设置成json格式的type

使用URL模板映射,实现RESTful风格的URL @RequestMapping(value=”query/{id}”) @pathVariable(“id”) int id image.png

注意:使用RESTful需要将前端控制器设置为/ 并且静态资源需要在springmvc.xml中配置

拦截器

定义拦截器,实现 HandleInterceptor接口,实现三个接口 1.preHandle() 进入Handler方法之前执行 场景: 1.身份认证,身份授权 如身份认证失败,需要此方法拦截不再向下执行 2.postHandle() 进入Handle方法之后,在返回ModelAndView之前执行 场景: 从ModelAndView出发:
1.将公用的模型数据传到视图(如菜单导航) 2.统一指定视图 3.afterCompletion() 执行Handler完成,执行此方法 场景: 1.统一的异常处理 2.统一的日志处理

拦截器配置

一.spring拦截器针对HandleMapping进行拦截设置.
1
即:配置某个HandlerMapping,经过该HandleMapping映射成功的Handle才使用该拦截器. ![image.png](https://upload-images.jianshu.io/upload_images/8222680-e5892ccbe080083a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
二.springmvc配置类似全局的拦截器:

即:springmvc框架将配置的类似全局拦截器注入到每个HandleMapping中 image.png