springmvc的核心在于其流程,这是使用Springmvc框架的基础,它是一种基于servlet的技术。提供了核心控制器DispatcherServlet和相关组件。servlet初始化时,springmvc会根据配置获取配置信息,从而得到统一资源标识符(URI)和处理器(Handler)之间的映射关系(HandlerMapping),为了更加灵活和增强功能,springmvc还会给处理器加入拦截器,这样就构成了一个处理器的执行链,并且根据上下文初始化视图解析器等内容,当处理器返回的时候就可以通过视图解析器定位视图,然后将数据模型渲染到视图中。以下图片从网上拷贝:
springmvc的组件和流程
当一个请求到来时,DispatcherServlet首先通过请求和事先解析好的HandlerMapping配置,找到对应的处理器(Handler),通过处理器的适配器(HandlerAdapter)来运行对应的处理器及其拦截器,在处理器返回模型和视图给DispatcherServlet后,DispatcherServlet就会把对应的视图信息传递给视图解析器(ViewResolver)。如果使用逻辑视图
,视图解析器就会解析它,否则直接通过视图渲染数据模型。
1、web.xml
<!--配置spring IOC配置文件路径,如果有多个文件可以用逗号将他们分隔开,默认值是/WEB-INF/applicationContext.xml-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring.xml
</param-value>
</context-param>
<!--配置ContextLoaderListener用以初始化SpringIOC容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--springmvc会根据servlet-name找到对应的配置文件,默认情况下的路径为/WEB-INF/springMvc-servlet.xml,
也可以通过下面的init-param指定,如src/main/resources下创建/spring/spring-mvc.xml-->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
默认会根据servlet-name找到相应的配置文件servletName-servlet.xml,这里采用指定的文件路径
2、spring-mvc.xml文件
<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
<context:annotation-config/>
<!--表示使用注解驱动SpringMvc-->
<mvc:annotation-driven/>
<!--它有一个use-default-filters属性,该属性默认为true,扫描并装载指定包下的bean-->
<context:component-scan base-package="com.changhf"/>
<!-- 定义受环境影响易变的变量 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="ignoreResourceNotFound" value="false"/>
<property name="locations">
<list>
<value>classpath*:/config.properties</value>
</list>
</property>
</bean>
<!-- 处理静态资源请求,由web应用服务器处理 -->
<mvc:default-servlet-handler/>
<!--定义视图解析器,如果前后端分离,可以不加该解析器-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/view/" p:suffix=".jsp"/>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为1MB -->
<property name="maxUploadSize">
<value>2097152</value>
</property>
</bean>
<mvc:annotation-driven/>
该注解一定要配置,不然无法装载bean。
p:prefix="abc"和如下写法同样效果
<property name="prefix">
<value>abc</value>
</property>
3、DemoController.java
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/index")
@ResponseBody
public String index() {
return "hello world";
}
@RequestMapping("/home")
public ModelAndView home() {
ModelAndView mv = new ModelAndView();
mv.setViewName("home");
return mv;
}
}
这里测试时index()没有采用相应的任何逻辑视图,而是直接返回一个字符串,所以需要加上@ResponseBody
,home()返回”/WEB-INF/view/home.jsp”。
springmvc开发流程
当启动Springmvc的时候,Springmvc就会去解析@Controller中的@RequestMapping的配置,再结合所配置的拦截器,这样它就会2组成多个拦截器和一个控制器的形式,存放到一个HandlerMapping中去。当请求来到服务器,首先是通过请求信息找到对应的HandlerMapping,进而可以找到对应的拦截器和处理器,这样就能够运行对应的控制器和拦截器。
DispatcherServlet和ContextLoaderListener
同一个web容器中,只允许存在一个ContextLoaderListener,但可以存在多个DispatcherServlet,DispatcherServlet和ContextLoaderListener在初始化时分别会生成一个WebApplicationContext,获取bean组件时,会先从DispatcherServlet的WebApplicationContext中查找,若不存在再通过ContextLoaderListener的WebApplicationContext查找,DispatcherServlet除了会装载bean之外,更重要的是会自动加载与springMvc相关的bean,如RequestMapping、ViewResolver、ExceptionHandler等