Spring MVC的配置与DispatcherServlet的分析
Spring MVC是一款Web MVC框架,是目前主流的Web MVC框架之一。
Spring MVC工作原理简单来看如下图所示:
接下来进行Spring MVC的配置
首先我们配置Spring MVC先要引进相关的jar包
我们需要有一个处理器,即Controller层,并将它配置到ioc中,当用户访问一个路径是,前端控制器拦截后会产生一个handler映射到ioc容器中,如果有匹配的RequestMapping就会访问这个方法,否则产生404异常。
@Controller
public class helloworld {
@RequestMapping("hello1.action")
public ModelAndView hello(){
ModelAndView mav = new ModelAndView();
mav.addObject("data", "你好");
mav.setViewName("hello");
return mav;
}
}
并将它扫描到ioc容器中
<context:component-scan base-package="package com.xt.crud"></context:component-scan> <mvc:default-servlet-handler/> <mvc:annotation-driven ></mvc:annotation-driven> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
<mvc:default-servlet-handler/>表示将没有匹配到Controller的静态资源的处理交给web容器,例如css,js等
但是当我们把静态资源的处理交给web容器时,你会发现我们写的RequestMapping中的路径无法访问,这是因为当我们没有添加这个标签时,框架默认注册有
AnnotationMethodHandlerAdapter这个类,他会对spring MVC中的注解进行处理,匹配RequestMapping中的路径,但是当我们加了<mvc:default-servlet-handler/>,
前端控制器拦截后会将拦截路径和资源型请求交给默认的处理器处理,而这个处理器无法处理Controller中的路径,而<mvc:annotation-driven >会注册一个RequestMappingHandlerAdapter,
并在默认处理器处理完静态资源后处理RequestMapping中的路径。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
可以简化我们返回视图层的路径,比如我们要返回view/success.jsp,配置了以上内容后,我们只需要写success就可以了。
接下来配置前端控制器(DispatcherServlet),打开web.xml
找到spring-webmvc包下的Dispatcher.class并把它配置到servlet标签
<servlet> <servlet-name>Dispatchar</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/crud.xml</param-value> </init-param> </servlet>
在配置前端控制器时,我们需要初始化org.springframework.web.servlet.DispatcherServlet中的contextConfigLocation属性,将他赋值为我们刚才写的ioc容器的路径,
这样他才能将我们的请求与ioc中Controller中的RequestMapping作对比。在servlet标签中还有一个<load-on-startup></load-on-startup>标签,它是用来设置多个servlet
拦截的优先级的,数字越小优先级越高,例如<load-on-startup>0</load-on-startup>的servlet会比<load-on-startup>1</load-on-startup>的优先执行。
接下来配置前端控制器的拦截路径
<servlet-mapping> <servlet-name>Dispatchar</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
/表示拦截所有路径,包括静态资源
以上就是前端控制器(DispatcherServlet)的配置过程,下一周会分享spring MVC中的Restful,自动装箱和重定向