spring学习笔记(4)--spring MVC(基础)
目前,项目中在cms子系统中使用了spring MVC,以前没接触过,所以现在从入门开始学习一下。
spring MVC具体流程步骤(来自网络)。
- 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
- DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
- DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
- HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
- ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
- View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
- 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
由此,spring MVC的开发步骤:
- DispatcherServlet在web.xml中的部署描述,从而拦截请求到Spring MVC。
- HandlerMapping的配置,从而将请求映射到处理器。
- HandlerAdapter的配置,从而支持多种类型的处理器。
- ViewResolver的配置,从而将逻辑视图名解析为具体视图技术。
- 处理器(页面控制器)的配置,从而进行功能处理。
下面是按照这个步骤开发的一个简单的Spring MVC项目。
以下是需要使用到的jar包:
1、在web.xml里加入DispatcherServlet配置。
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 容器是在启动的时候就加载这个DispatcherServlet(实例化并调用其init()方法), 它的值必须是一个整数,表示servlet应该被载入的顺序; 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet; 当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载; 正数的值越小,该servlet的优先级越高,应用启动时就越先加载; 当值相同时,容器就会自己选择顺序来加载。 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
这样请求已交给Spring MVC框架处理,因此我们需要配置Spring的配置文件,默认DispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。本测试程序需要需要配置/WEB-INF/dispatcher-servlet.xml。
2、在dispatcher-servlet.xml中配置HandlerMapping和HandlerAdapter。
<!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
3、在dispatcher-servlet.xml中配置ViewResolver。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
nternalResourceViewResolver:用于支持Servlet、JSP视图解析;
viewClass:JstlView表示JSP模板页面需要使用JSTL标签库。
prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为test,则该该jsp视图页面应该存放在“/test.jsp”;
4、开发和配置处理器。
public class SpringController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView(); mv.addObject("message", "test"); mv.setViewName("test"); return mv; } }
页面控制器/处理器必须实现org.springframework.web.servlet.mvc.Controller接口。将SpringController由spring IOC处理。
<bean name="/test" class="com.spring.mvc.SpringController"/>
name="/test":前边配置的BeanNameUrlHandlerMapping,表示如过请求的URL为 “上下文/test”,则将会交给该Bean进行处理。
5、视图页面/test.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>spring mvc test</title>
</head>
<body>
${message}
</body>
</html>
运行步骤:
1、 首先用户发送请求http://localhost:8080/projectName/test——>web容器,web容器根据“/test”路径映射到DispatcherServlet(url-pattern为/)进行处理;
2、 DispatcherServlet——>BeanNameUrlHandlerMapping进行请求到处理的映射,BeanNameUrlHandlerMapping将“/test”路径直接映射到名字为“/test”的Bean进行处理,即SpringController,BeanNameUrlHandlerMapping将其包装为HandlerExecutionChain(只包括SpringController处理器,没有拦截器);
3、 DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter将HandlerExecutionChain中的处理器(SpringController)适配为SimpleControllerHandlerAdapter;
4、 SimpleControllerHandlerAdapter——> SpringController处理器功能处理方法的调用,SimpleControllerHandlerAdapter将会调用处理器的handleRequest方法进行功能处理,该处理方法返回一个ModelAndView给DispatcherServlet;
5、 test(ModelAndView的逻辑视图名)——>InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具体视图页面在/test.jsp;
6、 JstlView(/test.jsp)——>渲染,将在处理器传入的模型数据(message=test!)在视图中展示出来;
7、 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。