《Java EE SSM框架》学习笔记(14)

Spring MVC的初始化和流程:

Spring MVC是Spring提供给Web应用的框架设计。

Spring MVC的根本是,它的流程和各个组件的应用和改造。

早期的MVC模型为:Servlet+JSP+Java Bean,使得前后台分离。

MVC的经典框架:Struts2和Hibernate,使得控制器和模型层分离,Java代码可以得到重用。

如今互联网开发:Web页面大部分采用Ajax请求,交互只需要JSON数据,使得对JSP的耦合度的依赖降低。

随着移动互联网的发展,依赖于页面编程的Struts不适合时代的发展了。

并且随着软件发展,迁移数据库的可能性很小,用不到Hibernate的HQL来满足移植数据库的要求。

Spring MVC结构松散,可以使用各类试图:JSON、JSP、XML、PDF。

 

Spring MVC的组件和流程图

 

DispatcherServlet是一个Servlet,可以拦截HTTP发送过来的请求。

当Servlet在init时,Spring MVC根据配置获取配置信息,获得URI和Handler的映射关系。

并给Handler加入拦截器,可在Handler执行前后加入代码。构成处理器执行链。

初始化视图解析器和处理器返回后,通过视图解析器定位视图,用模型渲染视图,来相应用户请求。

ps:

运行处理器和拦截器,需要一个对应的环境,即处理器的适配器。

处理器会返回模型和视图,若返回的视图是逻辑视图,则用视图解析器解析。

 

入门实例:

配置web.xml

设置Spring IOC的配置文件路径:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

设置监听器,ContextLoaderListener继承ServletContexListener,在Web工程前后,初始化或释放Spring IOC容器的资源。

<listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

配置DispatcherServlet:

<servlet>
        <!-- 注意:Spring MVC框架会根据servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作为配置文件载入Web工程中 -->
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 使得Dispatcher在服务器启动的时候就初始化 -->
        <load-on-startup>2</load-on-startup>
</servlet>
<!-- Servlet拦截配置 -->
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
 </servlet-mapping>

本例子,Spring Ioc没有装载自己的类,但会加载一个dispathcer-servlet.xml的文件。

dispathcer-servlet功能:

可定义一个扫描的包,用以加载控制器和一些组件。

定义视图解析器,指定视图具体路径。

 

定义一个控制器(Controller):

说明,通过注解@Controller,Spring MVC扫描时,会把它看作是控制器加载进来。

@RequestMapping,指定对应的请求URI,Spring MVC解析URI后,存入HandlerMapping。

 

实例组件和运行流程

其中,RequestMappingHandlerAdapter的实例,实在DispatchServlet初始化的时候进行创建的。

 

Spring MVC初始化:

问题:String IoC容器上下文和映射请求上下文是如何初始化的呢?

其中,映射请求,是基于Spring IoC上下文扩展出来。

一、初始化Spring IoC上下文

1、Java Web容器为其生命周期中提供ServletContextListener接口。

2、通过上述接口,能在初始化DispatcherServlet之前,完成对Spring IoC容器的初始化。

3、Spring MVC把初始化工作交给了,ContextLoaderListener。

 

二、初始化映射请求上下文

若没有注册ContextLoaderListener,则ServletContextListener对Spring IoC容器执行初始化,然后再初始化各个组件。

这些组件,DispatcherServlet会根据内置配置文件DispatcherServlet.properties进行初始化。

推荐使用ContextLoaderListener进行初始化。

DispatcherServlet的设计

因为DispatcherServlet间接继承HttpServlet,因此,可载入Web容器中。

Web容器对于Servlet的初始化,首先是调用其init方法,DispatcherServlet被父类HttpServletBean初始化。

 

三、使用注解配置方式初始化

Spring3.1之后的版本提供了注解方式配置,可取消web.xml配置。

通过继承类,AbstractAnnotationConfigDispatcherServletInitializer,并实现它的方法,即可完成初始化。

在Servlet3.0之后,允许动态加载Servlet,只需实现ServletContainerInitializer接口即可。

Spring MVC框架在自己的包内实现了一个类SpringServletContainerInitializer,继承了上述接口,所以可加载开发者提供的Initializer。

WebApplicationInitializer初始化器的继承关系

从SpringServletContainerInitializer源码可知,只要实现了WebApplicationInitializer接口的onStartup方法,Spring MVC就会把类当做一个初始化器加载进来,并同时初始化Spring IoC上下文和映射关系上下文。

 

Spring MVC开发流程详解:

以一个注解@Controller标注,一般只需要通过扫描配置,就能够将其扫描出来,往往还要结合注解@RequestMapping去配置它。

@RequestMapping:可配置在类或方法上,作用是指定URI和哪个类或方法作为一个处理请求的处理器。

还可定义处理器的拦截器,启动时,解析@Controller中的@RequestMapping配置,再结合所配置的拦截器,就会组成多个拦截器和一个控制器的形式,存放到HandlerMapping中去。

请求到来时,通过请求信息找到HandlerMapping,进而找到对应的拦截器和处理器,这样就能够运行对应的控制器和拦截器。

 

控制器开发:

获取请求参数:

ps:虽然Spring MVC会自动解析代码中的方法参数,建议不要使用Servlet容器所给予的API,不然,就会使得控制器和Servlet容器紧密关联,不利于扩展和测试。

可通过@RequestParam注解获取HTTP请求参数,默认不允许对注解了的参数为空。否则注解启用required=false

从Session中获取参数,使用@SessionAttribute注解。

视图渲染:

默认使用JstlView进行渲染,即将查询出来的模型绑定到JSTL(JSP标准标签库)模型中,这样通过JSTL就可把数据模型在JSP中读出展示数据了。

MappingJackson2JsonView是一个非逻辑视图,对于它而言并不需要视图解析器进行解析。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值