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风格

原文地址:https://www.cnblogs.com/pengcode/p/12747505.html