一、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 ,此为最终跳转的页面路径
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题: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 递归