最近学习了Spring MVC,Spring Web Flow和Spring Security,作为三者的基石,我首先来总结Spring MVC里的东西吧
1. 客户端来了一个request之后,首先会被DispatcherServlet捕获
2. Dispatcher在默认的情况下(可以自行配置),会通过客户请求过来的url去和具体Controller的方法上的RequestMapping上的地址匹配,若找到就高数DispatcherServlet去找相应的Controller。
3. 当request到达Controller后,真正的逻辑处理通常都放在controller下面,在逻辑处理后,controller通常会返回一个ModelAndView对象,其构造函数里面包含接下来具体的JSP页面的URL、用于在JSP页面显示用的SpringEL会用到的model名,最后还会返回具体model的名字,此model会装一些在controller下处理的逻辑的结果,以供其他调用。
4. DispatcherServlet通过ModelAndView里的URL找到相应的JSP页面去进行显示。
下面是一些配置:
web.xml: 配置DispatcherServlet,Spring会根据servlet-name去找定义在另一个xml文件(名称为myDispatcher-servlet.xml)下定义的一些解析request用的对象。
<servlet>
<servlet-name>myDispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
myDispatcher-servlet.xml:里面定义了annotation-driven,此定义将会用于解析定义在整个项目下的annotation。context:component-scan,它用于解析使用annotation定义使之有特殊意义的类,如使用@Controller定义的类,它会被扫描并被已bean的形式保存在spring container中。最后viewResolver定义了解析controller返回特定地址后去找到相应页面的方法。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=
"http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.thoughtworks.mvc"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
HomeController.java:具体处理controller的类。
package com.thoughtworks.mvc;
import com.thoughtworks.domain.First;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("first")
public class HomeController {
@RequestMapping("second")
public ModelAndView writeTheFirst(Model model) {
First first = new First("kkk", "lll");
First second = new First("aaa", "bbb");
model.addAttribute(first);
model.addAttribute(second);
return new ModelAndView("home" ,"homeK", model);
}
}
package com.thoughtworks.domain;
public class First {
String kkk, lll;
public First(String kkk, String lll) {
this.kkk = kkk;
this.lll = lll;
}
public String getKkk() {
return kkk;
}
public void setKkk(String kkk) {
this.kkk = kkk;
}
public String getLll() {
return lll;
}
public void setLll(String lll) {
this.lll = lll;
}
}
home.jsp:和controller最后返回的ModelAndView的第一个参数对应,并使用viewResolver定义的解析方法被找到。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<table>
<thead>
<th>Index</th>
<th>Content</th>
</thead>
<tbody>
<tr>
<td><c:out value="${model.kkk}"/></td>
<td><c:out value="${homeK.lll}"/></td>
</tr>
</tbody>
</table>
以上就为Spring处理一个请求的完整过程。