本人在学习 spring mvc 开始时对以下几个基本概念的理解:
以上概念写的比较简单,要是想理解的更深还是看文档.
下面是这些概念实际的执行顺序:
接下来说明下他们在实际应用中代码的编写:
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet 配置要在 web.xml 中声明
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
DispatcherServlet 默认加载的bean文件是/WEB-INF/(servlet-name)-servlet.xml
可以通过配置contextConfigLocation来改变加载的文件
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截所有以 do 结尾的请求 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
在web.xml中声明后就可以来写整个处理过程所需要的其他配置,该配置文件的名字应该符合上面说述的规则
(servlet-name)-servlet.xml,所以文件名是dispatcherServlet-servlet.xml
HandleMapping
<!--
定义处理器映射
将要处理的请求映射到处理器上
-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="helloWorld.do">helloWorldController</prop>
</props>
</property>
</bean>
SimpleUrlHandlerMapping将映射的信息存入到mappings中,
key : DispatcherServlet响应的请求,
value : 映射的处理器,
也就是 urlMappin 将请求 helloWorld.do 由处理分配到了下面要配置的 helloWorldController 控制器上
Controller
<!--
定义控制器, 继承 AbstractController ,实现 handleRequestInternal 方法
通过注入来避免硬编码
显示的信息:helloWorld
视图名称:viewPage
除了继承AbstractController以外, Spring还有提供了一些方便的Controller, 可以参考文档来用
-->
<bean id="helloWorldController" class="com.mvc.HelloWorldController">
<property name="helloWorld">
<value>AbstractController --- HelloWorld</value>
</property>
<property name="viewPage">
<value>/WEB-INF/jsp/index.jsp</value>
</property>
</bean>
到了这Controller要开始做事了, Controller的java代码:
public class HelloWorldController extends AbstractController{
private String helloWorld;
private String viewPage;
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
/*要进行的处理在这执行*/
Map<String,String> model = new HashMap<String,String>();
model.put("helloWorld",getHelloWorld());
/*返回ModelAndView(传入视图名称,处理得到的数据)*/
return new ModelAndView(getViewPage(),model);
}
public String getHelloWorld() {
return helloWorld;
}
public void setHelloWorld(String helloWorld) {
this.helloWorld = helloWorld;
}
public String getViewPage() {
return viewPage;
}
public void setViewPage(String viewPage) {
this.viewPage = viewPage;
}
}
Controller会返回一个ModelAndView并携带视图名,处理得到的数据剩下的事就要交给视图解析器去做了.
ViewResolver
<!--
定义视图解析器
UrlBasedViewResolver 允许将视图名直接解析到URL上, 不需要显示的映射定义. 如果你的视图名称直接符合视图资源的
名字而不需要任意的映射, 就可以使用这个解析器.
InternalResourceViewResolver 是 UrlBasedViewResolver 的子类, 支持InternalResourceView, JstlView, TitleView
这个解析器生成的视图的类都可以用setViewClass指定 (相关的内容可查阅文档).
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.InternalResourceView</value>
</property>
</bean>
<!--
因为我用的视图名是直接符合视图资源的名字/WEB-INF/jsp/index.jsp, 所以选用,InternalResourceViewResolver,
若是选用UrlBasedViewResolver, 注入Controller的视图名因该是"index", 最后请求的视图资源才是/WEB-INF/jsp/index.jsp
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.InternalResourceView</value></property>
或
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
最后通过解析器将视图交给RequestDispatcher, RequestDispatcher将请求再传递给/WEB-INF/jsp/index.jsp, 也就是Controller返回的ModelAndView中所携带的视图名.