zoukankan      html  css  js  c++  java
  • 第三节:HelloWorld案例细节

    一、HelloWorld 运行流程

      1、运行流程

    1、客户端点击链接会发送http://localhost:8080/SpringMVC_1_helloWord/hello 请求

    2、来到tomcat服务器

    3、SpringMVC的前端控制器收到所有请求

    4、看请求地址和和@RequestMapping注解哪个匹配,来找到到底使用那个类的哪个方法来处理请求

    5、前端控制器找到了目标处理器类和目标方法,直接利用反射执行目标方法

    6、目标方法执行完成以后会有一个返回值,SpringMVC认为这返回值,就是要去的页面地址

    7、拿到方法返回值后;用视图解析器进行拼串得到完整的页面地址

    8、拿到页面地址后,前端控制器帮我们请求转发到页面

      2、请求流程图解

        

    二、细节

      1、@RequestMapping 注解

    @RequestMapping
          就是告诉SpringMVC:这个方法用来处理什么请求
          这个 / 是可以省略的,即使省略了,也是默认从当前项目下开始
          习惯加上比较好
    

        ① 一般请求和映射路径名称和处理请求的方法名称最好一致(实质上方法名称任意)

    @RequestMapping(value="/helloworld",method=RequestMethod.GET)
    public String helloworld(){
    //public String abc123(){
        System.out.println("hello,world");
        return "success";
    }

         ② @RequestMapping 可以应用的地方

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Mapping
    public @interface RequestMapping {…}

      2、细节二

        配置视图解析器

    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
        注意: 不要把“/WEB-INF/views/”配置成了 "/WEB-INF/views"

    三、web.xml 中前端控制器的细节

      配置内容:

        <!--
            SpringMVC 思想是有一个前端控制器能拦截所有请求,并智能派发;
            这个前端控制器是一个 servlet,应该在 web.xml 中配置这个 servlet 来拦截所有的请求
        -->
        <!-- 配置SpringMVC核心核心控制器 DispatcherServlet  -->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置DispatcherServlet的初始化參數:设置文件的路径和文件名称 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!--
               servlet 启动加载,servlet 原本是第一次访问创建对象
               load-on-startup:服务器启动的时候就创建对象,值越小优先级越高,越先创建对象
             -->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
    
        <!--
         /* 和 / 都是拦截所有请求,/:会拦截所有请求,但是不会拦截 *.jsp,能保证 jsp访问正常;
         /* 的范围更大,还会拦截 *.jsp 这些请求,一旦拦截 jsp 页面就不能显示了
        -->
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>     <!-- / 这样写,只有请求才处理,页面会过滤掉 -->
        </servlet-mapping>

      细节一:指定配置文件的位置和名称

      (1)指定配置文件位置和名称

        DispatcherServlet 中有一个 contextConfigLocation 属性,可以用来指定 SpringMVC 的配置文件的路径。

            <!-- 配置DispatcherServlet的初始化參數:设置文件的路径和文件名称 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>

        注意:在 <init-param> 标签中可以指定SpringMVC 的配置文件的路径,其中 classpath 指定的是当前工程的 类路径,一定不能写错。(写错后还是到默认位置 WEB-INF 下去找配置文件)   

       

      (2)默认配置文件位置和名称 

         但是如果我们不想配置文件的路径,配置文件有没有默认路径呢?

         默认情况下,核心配置器 DispatcherServlet 会去 WEB-INF 下自动加载配置文件,且配置文件的名字是 <servlet-name>-servlet.xml

      细节二:Servlet 的加载时间

        上面的配置文件中的 <load-on-startup> 用来设置 Servlet 的加载时间。
        如果不进行设置,默认会在第一次访问的时候加载 Servlet。
        如果设置了此标签,会将 Servlet 的加载时间提前到项目启动时。
        此标签中可以写整数,但是写 0 和负整数都没有效果,只有设置成 正整数才会将 Servlet 的加载时间提前到项目启动时。
        注意:如果有多个 Servlet 都需要设置该属性,不能写成一样,值越小,优先级越高,越先执行。

      细节三:Servlet 的拦截路径

        在 url-pattern 标签中配置 servlet 的拦截路径

         /* 和 / 都是拦截所有请求,/:会拦截所有请求,但是不会拦截 *.jsp,能保证 jsp访问正常;
         /* 的范围更大,还会拦截 *.jsp 这些请求,一旦拦截 jsp 页面就不能显示了
    

        

      拦截路径详解: 

        <!--
            /:拦截所有请求,不拦截 jsp页面,*.jsp请求
            /*:拦截所有请求,拦截 jsp 页面,*.jsp 请求
    
    
            处理 *.jsp 是由 Tomcat 做的事,所有项目的小 web.xml 都是继承于大(服务器) web.xml
            DefaultServlet 是Tomcat中处理静态资源的:
                除过 jsp 和 servlet 外剩下的都是静态资源;
                index.html 静态资源,Tomcat 就会在服务器下面找到这个资源并返回
    
                当在项目中配置前端控制器的 url-pattern = /,
                相当于前端控制器的 / 禁用了 Tomcat 服务器的 DefaultServlet,也就无法访问静态资源了;
    
            1)服务器的大 web.xml 中有一个 DefaultServlet 的 url-pattern = /
            2) 我们的配置中前端控制器 url-pattern = /
                    静态资源就会来到前端控制器 DispatcherServlet(前端控制器)看哪个方法的RequestMapping 是 这个?
                    没有方法的请求路径是 index.html,就找不到
            3) 为什么 jsp 又能访问?
                    在 Tomcat 服务器的 web.xml 中还配有了JspServlet,url-pattern=*.jsp,用于拦截所有jsp请求
                    我们在项目中没有覆盖JspServlet的配置,所有jsp页面还是由Tomcat服务器来处理;
            4) /:相当于覆盖了Tomcat服务器中的DefaultServlet配置;我们写/,也是为了迎合 REST 风格的URL 地址
               /* 直接就是拦截所有请求,
        -->
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>     <!-- / 这样写,只有请求才处理,页面会过滤掉 -->
        </servlet-mapping>

    四、流程分析

      1、流程分析图

        

      2、基本步骤 

       (1)客户端请求提交到 DispatchServlet;
            (2)由 DispatchServlet 控制器查询一个或多个 HandlerMapping,找到处理请求的 Controller;
            (3)DispatchServlet 将请求提交到 Controller(也称 Handler);
            (4)Controller 调用业务逻辑处理后,返回 ModelAndView;
            (5)DispatchServlet 查询一个或多个 ViewResoler 视图解析器,找到 ModelAndView 指定的视图;
            (6)视图负责将结果显示到客户端;

     

      3、配置核心控制器 DispatcherServlet 的作用:

         加载 SpringMVC 的配置文件,在上面的配置方式下,DispatcherServlet自动加载配置文件,此时的配置文件有默认的位置和名称。
                    默认位置:WEB-INF下,默认名称<servlet-name>-servlet.xml
                    例如上面的配置方式的文件名:springMVC-servlet.xml
                    当加载了配置文件后,SpringMVC 就会根据扫描组件找到控制层

      4、控制器

       在此类上加上@Controller注解,springMVC就会将此类作为控制层加载,让其处理请求响应
            在控制层中,需要在方法上设置@RequestMapping(value="xxx")
            springMVC就是通过此注解将请求路径与控制层中的方法进行匹配,此时请求路径为 localhost:8080/projectName/xxx
            处理请求的方法会返回一个字符串,即视图名称,最终会通过配置文件中配置的视图解析器实现页面跳转
            方式:prefix + 视图名称 + suffix ,此为最终跳转的页面路径
  • 相关阅读:
    map.entry<k,v>小用法(转)
    zookeeper实现分布式锁服务
    组播协议
    OSPF
    Tomcat默认工具manager管理页面访问配置
    将web应用部署到Tomcat的三种方式
    运行startup.bat的启动过程
    IDEA创建简单servlet程序
    setvlet基础知识
    NIO基本操作
  • 原文地址:https://www.cnblogs.com/niujifei/p/15502572.html
Copyright © 2011-2022 走看看