• SpringMVC初步


    SpringMVC框架介绍

        1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

    Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。

            Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

        2) Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。

    一、SpringMVC原理图

    二、Spring结构图

    三、SpringMVC架构图

    四、SpringMVC请求流程图

     

    五、SpringMVC请求流程文字描述:

    request-------->DispatcherServler(中央调度器/前端控制器)-----> HandlerMapping(处理器映射器)------>返回一个执行链----->将执行链转交给HandlerAdaptor(处理器适配器)----->调度Handler(处理器)-----> ModelAndView----->先将结果交给HandlerAdaptor,然后再由HandlerAdaptor转交给 DispatcherServler--------->DispatcherServler调度ViewResolver(视图解析器)---->交给DispatcherServler-------> 寻找View---->View做出响应(response)

    SpringMVC接口解释

    DispatcherServlet接口:

    Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

    HandlerMapping接口:

    能够完成客户请求到Controller映射。

    Controller接口:

    需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。

    Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

    从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

    ViewResolver接口:

    Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

    SpringMVC运行原理

    1. 客户端请求提交到DispatcherServlet

    2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

    3. DispatcherServlet将请求提交到Controller

    4. Controller调用业务逻辑处理后,返回ModelAndView

    5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

    6. 视图负责将结果显示到客户端

    DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:

           1. 截获符合特定格式的URL请求。
           2. 初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
           3. 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

     

    SpringMVC 简单案例

    1、引入jar文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <display-name></display-name>    
     8   <!-- 监听器 -->
     9   
    10   <servlet>
    11     <servlet-name>springmvc</servlet-name> 
    12     <!-- 配置中央调度器 -->
    13     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    14     <init-param>
    15     <param-name>contextConfigLocation</param-name>
    16     <!-- 关联核心配置文件 -->
    17     <param-value>classpath:applicationContext.xml</param-value>
    18     </init-param>
    19     <!-- tomcat服务一启动,就加载以上步骤 -->
    20     <load-on-startup>1</load-on-startup>
    21   </servlet>
    22   
    23   <servlet-mapping>
    24     <servlet-name>springmvc</servlet-name>
    25     <url-pattern>/</url-pattern>
    26   </servlet-mapping>
    27   <!-- <servlet-mapping>
    28     <servlet-name>default</servlet-name>
    29     <url-pattern>*.jpg</url-pattern>
    30   </servlet-mapping> -->
    31   
    32   <welcome-file-list>
    33     <welcome-file>index.jsp</welcome-file>
    34   </welcome-file-list>
    35 </web-app>
    步骤二:配置web.xml配置文件
    package cn.happyl.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    public class FirstController implements Controller {
    
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            ModelAndView mv=new ModelAndView();
                    //返回逻辑视图名
            mv.setViewName("index");
                   //在作用域中放入数据
            mv.addObject("hehe", "zz");
            return mv;
        }
    
    }
    步骤三:配置控制器类
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            ">
            <!-- 视图解析器 -->
             <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp"></property>
                <property name="suffix" value=".jsp"></property>
            </bean>
             
            <!-- 注册处理器 -->
         <bean id="/hello.do" class="cn.happy.controller.Y2Controller"></bean>
          
           
    </beans>       
    步骤四:applicationContext.xml
    <body>
       This is my SpringMVC 简单案例. <br>
       <!-- 图片 -->
       <img src="image/1.jpg" width="500px" height="400px">
     </body>
    jsp页面

    关于urlpattern 

    最好配成*.do

    不能配成/* ===[无法访问*.jsp等动态资源]

    最好也不要配成/ === [无法访问静态资源]

    不得不配成/

     如果url-pattern配成/*,则无法访问动态资源,出现404. 如果配成/ ,则无法访问静态资源,图片无法显示。

    不能配成/*缘由:

     DispatcherServlet会将向动态页面请求,即向jsp页面的跳转请求也当做是一个普通的Controller请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然是找不到的。jsp页面会报404错误

    结论:/*会拦截动态资源

    不能配成/:

     方案一:使用Tomcat默认的Servlet解决

     

     

    方案二:使用MVC的default-servlet-handler

    会将对静态资源的访问请求通过HandlerMapping映射到默认Servlet请求处理器DefaultServletRequestHandler对象。而该处理器调用了Tomcat的DefaultServlet来处理静态资源的访问请求。当然需要引入mvc约束

     

    方式三:使用MVC的resource解决

    在Spring3.0.4之后,Spring定义了专门用于处理静态资源请求的处理器ResourceHttpRequestHandler。并且添加了<mvc:resources/>标签,专门用于解决静态资源无法访问问题。

    Location:静态资源所在目录 mapping: 对资源的请求 注意:需要Tomcat7支持

     

     

     

  • 相关阅读:
    蝶恋花
    JVM解毒——JVM与Java体系结构
    超赞!IDEA 最新版本,支持免打扰和轻量模式!
    SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
    神奇的 SQL 之 WHERE 条件的提取与应用
    终于放弃了单调的swagger-ui了,选择了这款神器—knife4j
    Git 高级用法,喜欢就拿去用
    既然有 HTTP 请求,为什么还要用 RPC 调用?
    SpringBoot和Spring到底有没有本质的不同?
    一条简单的更新语句,MySQL是如何加锁的?
  • 原文地址:https://www.cnblogs.com/yangronglin/p/6198033.html
Copyright © 2020-2023  润新知