浅谈spring——spring MVC(十一)
来源:互联网 发布:巨人通力知乎 编辑:程序博客网 时间:2024/05/15 04:49
springMVC框架主要是围绕DispatcherServlet这个核心展开,它负责拦截请求并将其分派给相应的的处理器处理,然后将结果响应给用户。包括注解驱动控制器、请求及响应信息处理、视图解析、本地化解析、上传文件解析、异常处理、表单绑定等
springMVC是基于Model2来实现的,利用处理器分离模型、视图和控制,达到不同技术层级间松散层耦合的效果,提高系统灵活性、复用性和可维护性。而Model1则是将展现逻辑和业务逻辑集中在一起,耦合性高,不容易扩展。
spring MVC的整体架构:
整个框架中DispatcherServlet处于核心位置,负责协调不同组件完成请求处理和响应工作。
1. 首先客户端发起一个HTTP请求,web服务器接收这个请求,如果匹配DispatcherServlet的请求路径(web.xml里面配置),web容器会将该请求交由DispatcherServlet处理
2. DispatcherServlet接收这个请求后,根据请求信息(URL、HTTP方法、请求参数、Cookie等)及HandlerMapping配置找到处理该请求的处理器(Handler)。我们可以将HandlerMapping看作是路由控制器,将Handler看作目标主机。实际上spring MVC并没有单独定义一个Handler接口,Handler只是一个虚拟的概念,任何Object对象都可以作为请求处理器
3. 当DispatcherServlet根据HandlerMapping找到对应的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter充当一个适配器的角色,它以统一的接口对各种Handler方法进行调用。
如:SimpleControllerHandlerAdapter.java
public class SimpleControllerHandlerAdapter implements HandlerAdapter {public boolean supports(Object handler) {return (handler instanceof Controller);}public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return ((Controller) handler).handleRequest(request, response);}public long getLastModified(HttpServletRequest request, Object handler) {if (handler instanceof LastModified) {return ((LastModified) handler).getLastModified(request);}return -1L;}}
Controller.java
public interface Controller {ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;}4. Handler处理器完成业务逻辑处理后会返回一个ModelAndView给DispatcherServlet,其中ModelAndView包含了视图逻辑名和模型数据(k-v键值对)
5. ModelAndView中包含的是“逻辑视图名”而非真正的视图对象,DispatcherServlet会借助ViewResolver完成从逻辑视图名到真实视图对象的解析工作
6. 当得到真实的视图对象View后,DispatcherServlet使用这个View对象对ModelAndView中的模型数据进行视图渲染。
7. 最后将信息响应给客户端。会存在多种方式,html、xml 、json串、或图片等等
实例:
1. 配置web.xml,指定业务层对应的Spring配置文件,定义DispatcherServlet
<servlet><servlet-name>mvcDispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvcDispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
容器初始化时会自动加载/WEB-INF/mvcDispatcher-servlet.xml配置文件,启动web层的Spring容器(子容器)
2. 编写处理器
/** * 类HelloWorldController.java的实现描述:TODO 类实现描述 * * @author onlyone 2013-8-23 下午10:07:43 */public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { // 1、收集参数 // 2、绑定参数到命令对象 // 3、调用业务对象 // 4、选择下一个页面 ModelAndView mv = new ModelAndView(); // 添加模型数据 可以是任意的POJO对象 mv.addObject("refundObject", "hello tom !"); // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("hello"); return mv; }}
3. 编写视图对象
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>This is the first sample of springMVC</title></head><body>Result is : ${refundObject}</body></html>
4. 配置Spring MVC的配置文件,使用控制器、视图解析器生效
mvcDispatcher-servlet.xml
<!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 处理器 --> <bean name="/hello" class="com.alibaba.china.HelloController"/>
参考文章:http://jinnianshilongnian.iteye.com/blog/1752171
- 浅谈spring——spring MVC(十一)
- Spring学习(十一)spring mvc上传下载
- Spring MVC 浅谈
- 2.浅谈Spring Mvc
- 菜鸟之路——Spring MVC(十一)ContextLoaderListener加载配置文件
- spring 3.1 mvc 例子浅谈(1)
- Spring Web MVC框架(十一) Spring Web MVC测试框架
- 【笔记】Spring MVC学习指南(十一)上传文件
- Spring MVC — @SessionAttributes
- Spring MVC 学习笔记 十一 data binding
- 浅谈spring——Spring资源加载(十二)
- Spring MVC 学习总结(六)——Spring+Spring MVC+MyBatis框架集成
- 初识spring(十一)
- 浅谈spring——引言(一)
- 浅谈spring——切面(七)
- Spring读书学习笔记(一)——Spring MVC
- Spring学习总结(2.1)— Spring MVC
- Spring—spring mvc框架入门
- Kids and Prizes(SGU495,概率DP)
- 关于Android开发的规范性
- 数据库系统管理与维护
- initwithcoder和 initwithframe 区别?
- php日志处理
- 浅谈spring——spring MVC(十一)
- gcc 安装详解
- Wall(HDU1348,凸包周长)
- PendingIntent详解
- 论C++构造函数中的不合理设计
- 熟悉jdk与jre区别有助于开发
- Linux学习之道:linux下的bash与sh 详解以及例子
- mysql 语句case when
- 无限大的两个整数相加