一、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.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 的加载时间
细节三: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、流程分析图