• SpringMVC-使用、运行流程、配置文件寻找


    SpringMVC

    FirstSpringMVC

    1.环境

    maven依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
    

    资源过滤问题

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
    

    右键添加web支持

    会出现带蓝点的web文件夹

    2.FirstCode

    SpringMVC思想是有一个前端控制器能拦截所有请求,并智能派发;
    这个前端控制器是一个servlet,应该在web.xml中配置这个servlet来拦截请求

    1.配置web.xml

    <!--
        前置控制器
        <load-on-startup>:servlet启动加载,
        servlet原本是第一次访问创建对象,有了这个标签后就会在服务器启动时候创建对象
        值越小 优先级越高 越先创建对象
    -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--contextConfigLocation:指定SpringMVC配置文件位置
                classpath:路径下的文件地址
            -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <!--处理所有请求的
            写/ 不是 /*,
            /*范围更大,会连接到*.jsp这些请求;一旦拦截,jsp页面不能显示
            /也会拦截所有请求,但不会拦截jsp,jsp访问请求正常。
        -->
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    • <load-on-startup>servlet启动加载,servlet原本是第一次访问创建对象,有了这个标签后就会在服务器启动时候创建对象,值越小 优先级越高 越先创建对象
    • contextConfigLocation:指定SpringMVC配置文件位置
    • classpath:路径下的文件地址
    • /*范围更大,会连接到*.jsp这些请求;一旦拦截,jsp页面不能显示
    • /也会拦截所有请求,但不会拦截jsp,jsp访问请求正常

    2.在index.jsp页面中使用超链接

    <a href="hello">helloworld</a>
    

    当点击hellowrold时候会跳转到连接hello

    3.在web-inf下创建文件夹jsp

    创建hello.jsp页面

    <h1>成功啦</h1>
    

    这样当我们点击index.jsp中的hellowrold时候就会到hello.jsp中显示成功啦

    4.在Controller包创建FirstController

    @Controller
    public class FirstController {
        /*
            1.告诉SpringMVC这是一个处理器,可以处理请求;
            @Controller 标识那个组件是控制器
         */
        //@RequestMapping:请求映射注解  /hello 表示当前项目下的hello请求
        @RequestMapping("/hello")
        public String myFirstRequest(){
            System.out.println("请求收到。。。正在处理");
            return "hello";
        }
    }
    

    告诉SpringMVC这是一个处理器,可以处理请求;
    @Controller 标识那个组件是控制器
    @RequestMapping:请求映射注解
    /hello 表示当前项目下的hello请求

    5.springmvc.xml

    <!--扫描所有组件-->
    <context:component-scan base-package="com.jiang"></context:component-scan>
    
    
    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    

    6.配置服务器

    注意:如果404 可以看一下是不是lib没加载

    File->project structure ->Artifacts ->新建目录lib ->+libfiles 全选添加进去

    3.运行流程

    • 点击链接发送http://localhost:8880/hello
    • 来到tomcat服务器
    • SpringMVC的前端控制器收到所有请求
    • 来看请求地址和@RequestMapping标注的那个地址匹配,找到使用那个类那个方法来处理
    • 前端控制器找到了目标处理器类和方法,直接利用反射执行该方法
    • 方法执行完以后会有一个返回值,将该返回值作为要去的地址
    • 拿到返回值后通过视图解析器获得完整路径
    • 拿到完整路径,前端控制器帮我们转发到该路径

    4.配置文件的寻找

    如果你在web.xml中没有配置SpringMVC的配置文件

    你可以在WEB-INF下 创建一个名为前端控制器-servlet.xml的文件,即<servlet-name>springDispatcherServlet</servlet-name>那就是springDispatcherServlet-servlet.xml

    /*和/

    /:拦截所有请求,但不拦截jsp页面,*.jsp请求

    /*:拦截所有请求,也拦截jsp页面

    处理*.请求是tomcat做的事:所有项目的小web.xml都是继承于tomcat的大web.xml

    • 服务器的大web.xml中有一个DefaultServlet是url-pattern=/
    • 我们配置中的前端控制器url-pattern也=/

    DefaultServlet是Tomcat中处理静态资源的:

    除了jsp和servlet其他都是静态资源,所以如果index.html如果让tomcat来处理,那么tomcat就会在服务器下找到这个资源并返回。

    那么这就相当于我们前端控制器中的/ 禁用了我们tomcat服务器中的 / (理解为方法重写),那么此时静态资源脑会来到前端控制器看那个方法的RequestMapping是这个

    Jsp资源能访问,是因为我们没有覆盖服务器中的jspServlet的配置(*.jsp)

    所以如果写/*就是直接拦截所有请求,我们写/ 也是为了迎合后来的REST风格

  • 相关阅读:
    【HCIE-RS_TAC诊断5-2】
    【HCIE-RS_TAC诊断5-1】
    【HCIE-RS_TAC诊断4】
    【HCIE-RS_TAC诊断3】
    【HCIE-RS_TAC诊断2】
    华为ICT大赛辅导——双AC主备双链路备份
    shell 函数与内置变量
    CF505E Mr. Kitayuta vs. Bamboos
    CF559E Gerald and Path
    CF538H Summer Dichotomy
  • 原文地址:https://www.cnblogs.com/pengcode/p/12747505.html
Copyright © 2020-2023  润新知