• 浅谈spring——spring MVC(十一)


    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进行封装,再以统一的适配器接口调用HandlerHandlerAdapter充当一个适配器的角色,它以统一的接口对各种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

  • 相关阅读:
    针对wamp的phpmyadmin显示#2003无法连接mysql
    vs2019编译gdal3.1.0报错 (filemanager.obj) : error LNK2001: 无法解析的外部符号 __imp_SHGetFolderPathW
    半透明遮罩层覆盖整个可视区域
    css首字下沉
    仿花瓣标题栏始终在页面顶部(ie6下position:fixed失效解决方法)
    Redis最佳实践及核心原理
    Java对接微信公众号模板消息推送
    XXLJOB任务调度
    MyBatis学习笔记
    SpringBoot集成Redis
  • 原文地址:https://www.cnblogs.com/riskyer/p/3280014.html
Copyright © 2020-2023  润新知