目录
2 .创建模块 spring_mvc_helloworld com.atguigu
springmvc的底层也是servlet
在后台能接请求的 只能servlet和过滤器
原理

解释:
当我们的浏览器(客户端)发出请求时,不是到达Controller
而是先达到DispatcherServlet(中央处理器,前端控制器/核心处理器),DispatcherServlet负责接收请求,响应请求,DispatcherServlet收到请求之后,要调用Controlle,但是不知道要调用哪个Controller能够处理发过来的请求,这时就先让HandlerMapping(处理器映射器)去找Controller,看哪个Controller可以处理发过来的请求,等找到之后 在安排HandlerAdapter(处理器适配器)去调用Controller,HandlerAdapter就可以去调用Controller方法,调用Controller方法之后会返回一个视图名称,然后视图解析器在去咨询找页面,在经过渲染页面,在返回给我们的客户端
解释:
ViewResolver视图解析器
调用之后,得到视图,在根据ViewResolver视图解析器
寻找页面




转war包的第一种方法
war
spring_mvc_helloworld后面添加\src\main\webapp
变成 D:\review_ssm\workspace\SSM\spring_mvc_helloworld\src\main\webapp\WEB-INF\web.xml


转war的第二种办法


③引入依赖war org.springframework spring-webmvc 5.3.1 ch.qos.logback logback-classic 1.2.3 javax.servlet javax.servlet-api 3.1.0 provided org.thymeleaf thymeleaf-spring5 3.0.12.RELEASE
注册SpringMVC的前端控制器DispatcherServlet
- "1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
-
-
- <servlet>
- <servlet-name>springMVCservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- servlet>
-
-
- <servlet-mapping>
- <servlet-name>springMVCservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
- web-app>
- "1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
-
-
- <servlet>
- <servlet-name>springMVCservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
-
- <init-param>
-
- <param-name>contextConfigLocationparam-name>
-
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
- servlet>
-
-
- <servlet-mapping>
- <servlet-name>springMVCservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
-
-
- web-app>
重新测试
如果报错 可以先clean 在打包


DispatcherServlet是框架帮我们创建出来的 他的初始化里面会做很多操作 接下来我们来简单的看下DispatcherServlet的源码:
单击DispatcherServlet 按住Ctrl+鼠标左健

DispatcherServlet extends FrameworkServlet
单击FrameworkServlet 按住Ctrl+鼠标左健
FrameworkServlet extends HttpServletBean

单击HttpServletBean 按住Ctrl+鼠标左健
HttpServletBean extends HttpServlet

单击HttpServlet 按住Ctrl+鼠标左健
HttpServlet extends GenericServlet

单击GenericServlet 按住Ctrl+鼠标左健
GenericServlet implements Servlet

单击Servlet 按住Ctrl+鼠标左健

总结:
DispatcherServlet extends FrameworkServlet
FrameworkServlet extends HttpServletBean
HttpServletBean extends HttpServlet
HttpServlet extends GenericServlet
GenericServlet implements Servlet
然后Alt+7 查看类的内容结构




具体源码分析 这里面不讲 总结一句话在DispatcherServlet 在初始化的过程中执行了非常多的操作
所以我们最好不要让DispatcherServlet第一次访问的时候进行初始化 因为初始化要花很多时间还要进行接收请求 很慢 所以我们这里面加上
- "1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
-
-
- <servlet>
- <servlet-name>springMVCservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
-
- <init-param>
-
- <param-name>contextConfigLocationparam-name>
-
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
-
-
- <load-on-startup>1load-on-startup>
-
-
- servlet>
-
-
- <servlet-mapping>
- <servlet-name>springMVCservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
-
-
- web-app>
注:标签中使用 / 和 /* 的区别: / 所匹配的请求可以是 /login 或 .html 或 .js 或 .css 方式的请求路径,但是 / 不能匹配 .jsp 请求路径的请求因此就可以避免在访问 jsp 页面时,该请求被 DispatcherServlet 处理,从而找不到相应的页面/* 则能够匹配所有请求,例如在使用过滤器时,若需要对所有请求进行过滤,就需要使用 /* 的写法
com.atguigu.controller.HelloController
- package com.atguigu.controller;
-
- import org.springframework.stereotype.Controller;
-
- @Controller
- public class HelloController {
-
-
- }


- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
-
-
-
-
- <context:component-scan base-package="com.atguigu.controller">context:component-scan>
-
-
- <bean id="viewResolver"
- class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
- <property name="order" value="1"/>
- <property name="characterEncoding" value="UTF-8"/>
- <property name="templateEngine">
- <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
- <property name="templateResolver">
- <bean
- class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
-
- <property name="prefix" value="/WEB-INF/templates/"/>
-
- <property name="suffix" value=".html"/>
- <property name="templateMode" value="HTML5"/>
- <property name="characterEncoding" value="UTF-8" />
- bean>
- property>
- bean>
- property>
- bean>
-
-
-
-
-
- beans>

- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
- body>
- html>
现在我们需要往/WEB-INF/templates/index.html里面跳转
我们现在不用写这么长的路径
我们把前缀/WEB-INF/templates去掉 把后缀.html去掉 变成index
现在我们只需要通过index的逻辑视图一定要访问到他所对应的访问视图
物理视图/WEB-INF/templates/index.html去掉前缀和后缀就变成逻辑视图






在想访问tomcat里面的工程 就是通过上下文路径来访问的 因为一个web服务器可以部暑多个工程 要想访问到具体的哪个工程 就是通过工程的上下文路径进行访问的 换句话说 通过他就可以访问服务器中的工程了




这里面报404是因为 还没首页 还没有处理首页的程序
这里面如果报的是500 可以去看我的另一个笔记 我这边的和视频里面的不同
视频里面SpringMVC 我是springMVC才是正确的 才能报404
SSM复习中的报错问题(还没完)_姜小白程序的博客-CSDN博客
现在我们要在我们的控制层里面 处理首页的请求
- // @RequestMapping注解:处理请求和控制器方法之间的映射关系
- // @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径
- // localhost:8080/SpringMVC/
-
- @Controller
- public class HelloController {
-
- @RequestMapping("/")
- public String protal(){ //控制器方法 //这个方法用来处理请求的
- //将逻辑视图返回
- return "index";
- }
-
-
- }

解释:
控制器方法处理的请求就是请求路径为上下文路径的请求 如果浏览器发生的是 @RequestMapping("/") 那么当前的控制器方法的方法就是处理请求的方法
我们主要在方法中返回一个逻辑视图 然后我们返回的逻辑视图会被springMVC-servlet.xml解析
然后 把逻辑视图加上前缀 加上后缀 就可匹配到一个完整的物理视图 然后通过Thymeleaf的渲染 然后跳转到页面
小细节
第一个小细节

以后主要点击刷新 就是重新部暑的功能
第二个小细节
把thymeleaf的约束加到模板中

现在重新部暑



绝对路径是由浏览器解析的 所以把路径解析成http://localhost:8080 没有上下文路径
如果我们用的是Thymeleaf来解析这个路径 他会自动帮助我们把上下文路径给加上的
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
-
- <h1>index.htmlh1>
- <a th:href="@{/hello}">测试SpringMVCa>
- <a href="/hello">测试绝对路径a>
- body>
- html>

写成功success页面
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>成功title>
- head>
- <body>
- <h1>success.htmlh1>
- body>
- html>

现在要跳转到成功页面
- @RequestMapping("/hello")
- public String hello(){
- return "success";
- }

重新部暑





注意:
如果这里面报500 刚把上下文路径修改成如下所示
