在前一篇博客<<SpringMVC学习道路上的点滴---SpringMVC前奏准备Web MVC>>中,我们了解到WebMVC实现了FrontController +Application Controller +Page Controller+Context(前端控制器+应用控制器+动作+上下文),那么SpringMVC也是FrontController +Application Controller +Page Controller+Context的实现,根据请求映射规则分发给相应的页面控制器进行处理.
先来了解一下Spring MVC处理请求的流程:
从途中,我们可以清楚的知道SpringMVC具体的执行步骤,不知你思考过这样几个问题:
1.请求如何给前端控制器
在web.xml中进行部署描述. <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> </servlet-mapping>
看到这个配置,你是否想到了学习servlet的时候web的配置
2.前端控制器如何根据请求信息选择页面控制器进行功能处理
配置HandlerMapping进行映射
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
BeanNameUrlHandlerMapping它存在spring-webmvc-3.2.4.RELEASE.jar包下面,它表示将请求的URL和Bean名字映射.例如URL为"context/user",则spring配置文件必须有一个名字为"/user"的bean,context可以忽略
3.如何支持多种页面控制器呢?
配置HandlerAdapter从而支持多种类型的页面控制器
<beanclass="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
SimpleControllerHandlerAdapter表示所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean可以作为springMVC中的处理器.
4.如何页面控制器如何使用业务对象
利用Spring Ioc容器的依赖注入功能
5.页面控制器如何返回模型数据
使用ModelAndView返回,在controller中返回
return newModelAndView(getSuccessView()); return newModelAndView(getFormView());<span style="font-family: Calibri; font-size: 14pt; background-color: rgb(255, 255, 255);"> </span>
进入ModelAndView类中,可以看到ModelAndView的构造函数由以下几种:
publicModelAndView() { } publicModelAndView(String viewName) { this.view= viewName; } publicModelAndView(View view) { this.view= view; } publicModelAndView(String viewName, Map<String, ?> model) { this.view= viewName; if(model != null) { getModelMap().addAllAttributes(model); } } publicModelAndView(View view, Map<String, ?> model) { this.view= view; if(model != null) { getModelMap().addAllAttributes(model); } } publicModelAndView(String viewName, String modelName, Object modelObject) { this.view= viewName; addObject(modelName,modelObject); } publicModelAndView(View view, String modelName, Object modelObject) { this.view= view; addObject(modelName,modelObject); }
6.前端控制器如何根据页面控制器返回的逻辑视图选择具体的视图近渲染
使用ViewResolver进行解析,在spring配置文件中配置ViewResolver
<beanid="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <propertyname="prefix"> <value>/view/</value> </property> <propertyname="suffix"> <value>.jsp</value> </property> </bean>
注:
InternalResourceViewResolver :用于支持Servlet,jsp视图解析
prefix/suffix:查找视图页面的前缀和后缀,例如传进来的逻辑视图名为user,则该jsp视图页面应该存放在"view/user.jsp
7.不同的视图技术如何使用相应的模型数据.
因为Model是一个Map数据结构,很容易支持其他视图技术
从以上的处理流程图加上思考的那几个问题,我们可以看出具体的核心开发步骤:
1.DispatcherServlet在web.xml中的部署,从而拦截请求到SpringMVC.
2.HandlerMapping的配置,从而将请求映射到处理器
3.HandlerAdapter的配置,从而支持多种类型的处理器.
4.ViewResolver的配置,从而将逻辑视图名解析为具体视图技术
5.处理器的配置,从而进行功能处理.
先从宏观入手,先了解springMVC的处理流程是怎么样的,然后再进行一个demo,你会发现springmvc就是那一回事,很简单了的.下篇博客将介绍一个springMVC的小demo,帮助理解springMVC的流程处理.