SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。
MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
Spring MVC相应流程如下:
** 使用SpringMVC
>> 首先需要导入相应的Jar包
>> 再需要配置一个前端控制器DispatherServlet
前端控制器其实就是一个特殊的Servlet,注意在初始化参数配置的时候需要导入SpringMVC的配置文件,<load-on-startup>设置这个servlet的启动顺序。<url-pattern>/</url-pattern>拦截所有的请求。
<!-- 配置前端控制器:DispatcherServlet -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/resources/SpringMVC-Servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置拦截那些请求 -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
>>
在
SpringMVC
配置文件中配置映射处理器
HandlerMapping
和视图解析器
ViewResolver
对于HandlerMapping在一般的情况下可以不用配置,因为DispatherServlet在创建的时候就已经使用了常用的BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping。
关于视图解析器配置,我们一般使用的都是InternalResourceViewResolver,视图处理器返回的是一个前缀+控制器返回值+后缀的全路径。如下图:
当然还要添加对注解的支持
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.test.controller"></context:component-scan>
<!--
配置视图解析器 :最后解析返回的就是一个物理的地址
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/Views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
>>
响应控制器
Controller
在类上添加@controller注解,表明这个是一个控制器,在方法上添加@RequestMapping设置对应的映射路径。
@Controller
public class HomeController {
@RequestMapping(value={"/","/index"})
public String index(){
System.out.println(">> welcome to index");
return "index";
}
}
这样启动服务器,就能正确的访问了,如下图
**SpringMVC配置文件
在之前我们导入SpringMVC配置文件,是通过contextConfigLocation来实现的,其实在默认情况下是DispatherServlet通过基于<servlet-name>名字的XML文件中加载Spring应用上下文。比如这里<servlet-name>test</servlet-name>,则,如果用默认的话你创建的文件应该在WEB-INF目录下,文件名为:test-servlet.xml
还有就是<servlet-mapping>的<url-pattern>属性,以前常常使用*.do、*.htm来防止静态资源被拦截,不过现在Spring3以后提供了<mvc:resources>元素来处理静态资源被拦截,实例配置如下:
<!--
防止静态资源被拦截:
location: 路径 -->
<mvc:resources location="/resources/*" mapping="/resources/**"></mvc:resources>
** 实现注解驱动
如果我们只使用上面的配置,会出现404错误,这时候我们需要实现注解驱动,注解驱动能帮我们将请求映射到方法上,将参数绑定到控制器的方法上,信息校验等。其实是DispatherServlet在创建的时候就会默认使用DefaultAnnotationHandlerMapping,<mvc:annotation-driven>会缺省使用DefaultAnnotationHandlerMapping来注册handler method和request的mapping关系。 AnnotationMethodHandlerAdapter来在实际调用handlermethod前对其参数进行处理[Spring3.1后变成了RequestMappingHandlerMapping和RequestMappingHandlerAdapter]。 配置如下:
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven>
这样就能正常的访问了。
** 视图解析器
视图解析器就是为用户渲染输出,视图解析器不仅仅支持JSP,还支持Velocity、FreeMarket等。我们需要配置一个视图解析器来将控制器返回的逻辑视图转换成渲染结果的实际视图。视图解析器有如下图这些:
其实这么多视图解析器我也就用过红线画出来的这些,其中InternalResourceViewResolver是最常用的。
在视图解析器中除了配置前后缀[prefix和suffix]还可能常常使用到viewClass,当我们的jsp界面里有JSTL标签时,我们就需要将InternalResourceViewResolver转换成JstlView
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="text/html"/>
<property name="prefix" value="/View/"/>
<property name="suffix" value=".jsp"/>
</bean>