运行流程
1. HTTP请求访问 WEB应用,WEB服务器加载web.xml,web.xml拦截请求进入Spring MVC入口DispatcherSevlet
2. DispatcherSevlet 根据web.xml中<servlet-name> 找配置文件 {servlet-name}-servlet.xml;
3. {servlet-name}-servlet.xml配置 访问路径到控制类的映射
4. 控制类:实现接口Controlle, 处理来自对应的请求,返回ModelAndView对象给DispatcherServlet;
ModelAndView对象:包含了模型(Model)和视图(View)
5. DispatcherServlet将View对象渲染出的结果返回给.jsp;
ViewResoler视图解析器:视图定位。在Web应用中查找View对象,从而将响应结果渲染给客户
6. .jsp页面:通过EL表达式显示的返回内容;
图解:
框架是围绕DispatcherServlet设计的,它处理所有的HTTP请求和响应。 请求处理工作流如下图所示:
- 在接收到HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller。
- Controller接受请求并根据使用的GET或POST方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
- DispatcherServlet将从ViewResolver获取请求的定义视图。
- 当视图完成,DispatcherServlet将模型数据传递到最终的视图,并在浏览器上呈现。
HandlerMapping对象:客户请求到Controller之间的映射。借助于Spring提供的HandlerMapping定位到具体的Controller。 Spring默认使用BeanNameUrlHandlerMapping。还有SimpleUrlHandlerMapping、CommonsPathMapHandlerMapping
例
1) web.xml:
初始化时,框架将尝试从位于应用程序的WebContent/WEB-INF目录中的名为[servlet-name]-servlet.xml的文件加载应用程序上下文。
需要通过使用web.xml文件中的URL映射来映射希望DispatcherServlet处理的请求。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern> <!--拦截所有的请求,注1-->
</servlet-mapping>
注1:*.do 只针对以'.do'结尾的请求进行处理,不再维护静态资源
2){servlet-name}-servlet.xml 映射配置:
用于创建定义的bean,它会覆盖在全局范围中使用相同名称定义的任何bean的定义
表示访问路径/index会交给id=indexController的bean处理; id=indexController的bean配置为类:controller.Controller
<beans······>
<!--表示从 包路径 下扫描有@Controller注解的类-->
<context:component-scan base-package="包路径" />
<!--定义用于解析视图名称的规则,前缀+后缀-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
<!--------------------------------------------------------------------------->
<!--定义访问路径对应的处理类方法,可用注解方式替代-->
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="访问路径">控制类indexController</prop>
</props>
</property>
</bean>
<bean id="控制类indexController" class="控制类indexController路径"></bean>
<!--------------------------------------------------------------------------->
</beans>
3)控制类Controller
DispatcherServlet将请求委派给控制器以执行特定于其的功能。 提供方法handleRequest处理请求。 通过 ModelAndView 对象把模型和视图结合在一起
@Controller 注释定义该类作为一个 Spring MVC 控制器,不再实现Controller接口
@RequestMapping 注释用于映射 URL 到整个类或一个特定的处理方法。
@RequestMapping("/hello")表示访问路径/hello会映射到该方法上
@RequestMapping(method = RequestMethod.GET) 声明方法作为控制器的默认service方法来处理 HTTP GET 请求
import......
----------------------------------------------------------------------xml方式
public class IndexController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index");
//模型数据是message,内容是“Hello Spring MVC”
mav.addObject("message", "Hello Spring MVC");
//返回给视图
return mav;
}
}
----------------------------------------------------------------------注解方式1
@Controller
@RequestMapping("/hello")
public class HelloController{
@RequestMapping(method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
----------------------------------------------------------------------注解方式2
@Controller
public class HelloController{
//写在此处表示/hello路径GET时触发
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
----------------------------------------------------------------------
//访问/index
@RequestMapping("/index")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
//访问/jump客户端跳转到/index
@RequestMapping("/jump")
public ModelAndView jump() {
ModelAndView mav = new ModelAndView("redirect:/index");
return mav;
}
----------------------------------------------------------------------
//Model,ModelMap,ModelAndView三者区别
}
4)index.jsp
EL表达式显示message的内容:${message}