SpringMVC实现原理(转载)
在整个spring MVC框架中,DispatcherServlet处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应的工作。具体流程为:
1)客户端发送http请求,web应用服务器接收到这个请求,如果匹配DispatcherServlet的映射路径(在web.xml中配置),web容器将请求转交给DispatcherServlet处理;
2)DispatcherServlet根据请求的信息及HandlerMapping的配置找到处理该请求的Controller;
3)Controller完成业务逻辑处理后,返回一个ModelAndView给DispatcherServlet;
4)DispatcherServlet借由ViewResolver完成ModelAndView中逻辑视图名到真实视图对象View的解析工作;
5)DispatcherServlet根据ModelAndView中的数据模型对View对象进行视图渲染,最终客户端得到的响应消息可能是一个普通的html页面,也可能是一个xml或json串,甚至是一张图片或一个PDF文档等不同的媒体形式。
下载spring框架用包
访问spring.io,在PROJECTS目录中找到SPRING FARAMWORK,找到下面文字点击链接
All avaible features and modules are described in the Modules section of the reference documentation.
Their maven/gradle coordinates are also described there.
在里面Distribution Zip Files介绍中可下载所需包。
http://repo.spring.io/release/org/springframework/spring
引包
将下载后的文件中的libs中的20个包导入项目中,并需要额外引入commons-logging.jar,可在Maven Repository中搜索下载。
配置MVC核心配置文件
首先在web.xml中web-app标签下添加如下代码:
<!-- 配置DispatcherServlet --> <servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc</servlet-name> <!-- 所有资源都要经Dispatcher处理 --> <url-pattern>/</url-pattern> </servlet-mapping>
然后在WEB-INF目录下建立核心配置文件,方法如下:
选中WEB-INF目录,右键New,Other,找到Spring,建立一个Spring BeanConfiguration File文件,注意给文件取名严格遵守[servlet-name]-servlet.xml的方式,此处示例文件名应取为mvc-servlet.xml;取名结束后点击next,选择相应的XSD,方便以后代码提示,这里只选择beans,在弹出的版本中选4.2版本即可。
简单举例(SpringMVC XML实现方式举例)
新建类,实现Controller接口。
public class IndexController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //该方法返回一个存储返回路径的对象,被DispatcherServlet接到, //调用视图解析器解析出返回路径并跳转 ModelAndView mav = new ModelAndView(); mav.setViewName("index"); return mav; } }
IndexController类就相当于一个普通的servlet,handRequest相当于doGet/doPost方法;如果要执行servlet,请求路径是必要的,那么请求路径在哪里?
在mvc-servlet.xml文件中,添加标签
<bean class="self.exercise.controller.IndexController" id="/index"></bean>
这里的id中的路径即为请求路径,DispatcherServlet根据该路径匹配到class中的类,执行其中的方法。
在mvc-servlet.xml文件中配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean>
视图解析器会将controller返回的ModelAndView对象传递的字符串解析出返回路径/WEB-INF/index.jsp,最终以请求转发的方式跳转到该页面。
如果想重定向而非请求转发跳转该如何实现呢?
mav.setViewName(InternalResourceViewResolver.REDIRECT_URL_PREFIX + "main.jsp");
此时xml中的视图解析器将不起作用,直接重定向到/main.jsp。
如果上述代码中将字符串中的.jsp去掉会怎样呢?
mav.setViewName(InternalResourceViewResolver.REDIRECT_URL_PREFIX + "main");
会重定向到请求路径为/main的另一个controller中去,同理,若想请求转发到另一个controller,则:
mav.setViewName(InternalResourceViewResolver.FORWARD_URL_PREFIX+ "main");
以上就是MVC的XML实现方式,但一个controller只对应一个访问路径,业务复杂时实现较为麻烦,而注解方式是我们推荐的实现方式。