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