一、执行过程
- 用户发起请求,请求到DispatchServlet前端控制器
DispatchServlet(中央调度),负责request和response,负责调用处理器映射器查找Hander,负责调用处理器适配器执行Handler,有了前端控制器降低了各各组件之间的耦合性,系统扩展性提高。 - DispatcherServlet前端控制器请求处理器映射器HandlerMappering查找Handler,根据一定的规则去查找(比如:xml配置,注解)
- HandlerMapping处理器映射器将Handler返回给前端控制器。
- DispatcherServlet前端控制器调用HandlerAdapter处理器适配器执行Handler,程序员编写的Handler是按照适配器要求的规则去执行Handler。
- Handler执行完成,返回给HandlerAdapter处理器适配器ModelAndView。
- 处理器适配器HandlerAdapter将ModelAndView返回给DispatchServlet前端控制器。
- 前端控制器调用ViewResolver根据ModelAndView得到View,然后再进行视图渲染(将模型数据填充到View响应给用户)
- 前端控制器响应给用户。
小结:
一个中心:DispatchServlet前端控制器
三个组件:处理器适配器、处理器映射器、视图解析器
其他:Handler、view
二、原理图
三、helloworld
前端控制器:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
三个组件:
<!-- 处理器映射器,根据URL匹配bean的name,处理器映射器实现HandlerMappering接口 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 处理器适配器,实现了HandlerAdapter接口,action按照适配器要求开发,规则是实现Controller接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 视图解析器:解析jsp视图,默认使用jstl,要求classpath下有jstl的jar包 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 视图后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置action -->
<bean name="/helloworld.action" class="com.app.HelloWorld"></bean>
Handler:
public class HelloWorld implements Controller{
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse res) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//向页面显示一行提示信息
//下边的方法就相当于request.setAttribute();
modelAndView.addObject("message", "helloworld!!!");
//指定逻辑试图名
modelAndView.setViewName("hello");
return modelAndView;
}