#Web框架概述
##Servlet Servlet返回用户响应,JSP的形式,HTML代码,可以制作网页展示信息代码。
##Web页面 定义serlvet的路径,比如定义servletA,在web.xml添加serlvet的名称跟地址的映射如果有servletB,则添加B。如果接口少,则不是问题,如果接口很多 我们在web的一些例如REST的服务,REST接口并不是单纯的静态地址,是动态参数而变化的,/user/{userId}
,前面是user,后面是userId,根据user的不同而不同。动态的映射地址,如果通过Servlet只能通过/user/*定义到某个servlet,然后自己编写代码进行匹配userId。如果我们的接口是以这种资源路径的方式,需要框架管理映射
- 需要一个框架来处理路由
##MVC模式 MVC核心为了解决数据与视图分离,数据进行修改不需要修改视图,视图进行修改不需要修改数据,而由控制器进行处理。
如果我们通过Serlvet制作网页,不可避免的通过Serlvet嵌入大量Html代码。这样我们把html耦合到了Java代码当中。
JSP相反的是Java代码嵌入到了HTML页面中 如果我们要把视图与Java代码解耦
- 需要一个框架来处理MVC
##Web MVC框架
- Handler Mapping
请求过来的请求路径到最终处理逻辑之间的映射关系 - Controller
负责视图与模型之间的关系,在xxx下返回视图,以及使用什么样的数据模型。 - View Resolver
解决在什么情况下展示什么视图,比如在请求JSON数据时,返回JSON数据。在请求XML数据时,返回XML数据。如果是返回普通网页,则返回Html页面 - View
不同的展示方式,页面、JSON、XML等等。
##DispatcherSerlvet使用 首先我们需要在web.xml里面,去定义DispatcherServlet,然后定义这个servlet-name。
在下面的部分,我们需要serlvet-mapping
<!-- SpringMVC的Servlet添加,Web项目载入Spring配置从这里开始 -->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 这里我们配置spring的配置文件位置 -->
<param-value>/WEB-INF/appconfig/mvc/spring/servlet-context.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这里是Spring提供的Serlvet,而不是我们自己编写的。我们通过serlvet-name定义一个dispatcherSerlvet,如果没有填写配置路径,则默认为WEB-INF/[servlet-name]-servlet.xml
##[servlet-name]-servlet.xml
-
HandlerMapping
路径到实际业务的映射,新版本的Spring不需要定义HandlerMapping,把SpringMVC开启默认就定义好Mapping,请求自动返回handler -
Controllers
可以通过Annotation定义Controller,通过Spring自动发现Controller -
View解析相关
如果不定义会默认有一些解析功能,一般情况下我们都会配置View解析,来根据我们不同的需要返回不同的视图。返回的数据相同,但是返回的结果可能是网页,也可能是pdf。
##WebApplicationContext 不需要定义,会根据配置自动生成,WebApplicationContext并不是唯一的,可以定义多个Serlvet匹配不同的规则。我们并不需要指定所有的配置路径的映射。可以定义很多个DispathcerServlet,我们的DAO等通用内容。
##ContextLoaderListener Spring定义了ContextLoaderListener,这种方式定义通用的context
首先我们在web.xml定义listener,然后我们需要去指定Spring的配置文件,可能会指定多个appliactionContext*.xml。我们这种方式WebApplicationContext叫做Root WebApplicationContext.
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
我们通过DispatcherServlet当中定义的WebApplicationContext是局部的配置,比如说controller、view等。但是我们通过ContextLoaderListener定义的,则是全局的,是Root WebApplicationContext。
一般Spring去查找Bean,是通过WebApplicationContext,如果在本DispatcherSerlvet中没有找到,则去Root WebApplicationContext中寻找。
极端的做法把所有的Bean都定义Root WebApplicationContext。但是很不方便。一般标准做法是,对应的Servlet,对应相关的Controller和View。在公共的Root WebApplicationContext定义公共的Service、Repositories。