随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、HelloWorld 运行流程

1、运行流程

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

2、来到 Tomcat 服务器

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

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

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

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

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

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

2、请求流程图解

二、细节

1、@RequestMapping 注解

@RequestMapping

就是告诉 SpringMVC:这个方法用来处理什么请求

这个 / 是可以省略的,即使省略了,也是默认从当前项目下开始,习惯加上比较好

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

@RequestMapping(value="/helloworld",method=RequestMethod.GET)
public String helloworld(){
    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/pages/<viewName>.jsp

注意: 不要把“/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>

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

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

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

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

默认的配置文件为: /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 ,此为最终跳转的页面路径

posted on   格物致知_Tony  阅读(62)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2019-11-03 算法的时间复杂度与空间复杂度
2019-11-03 排序算法
2019-11-03 递归—八皇后问题
2019-11-03 递归—迷宫问题
2019-11-03 递归
点击右上角即可分享
微信分享提示

目录导航