SpringMVC是Spring为表述层开发提供一套解决方案。
表述层:前台页面和后台的Servlet
业务逻辑层:
数据访问层:
SpringMVC:前台发送请求,后台Servlet处理请求,响应请求
首先有个project:SpringMVC
这个是一个普通的java项目
在这个项目里面新建一个module
依赖1:
org.springframework spring-webmvc 5.3.1
对应的所有依赖:
依赖2:
日志的依赖:
ch.qos.logback logback-classic 1.2.3 test
依赖三:
servletAPI
javax.servlet javax.servlet-api 3.1.0 provided
Tomcat服务器里面自带servletAPI和jsp的api
所以,这里的范围是provided
provided:当你这个项目打包的时候,这个依赖不会被打包进去。因为服务器Tomcat本身自带了。
其他的没有写provided的jar包打成war包之后就会进入WEB-INF里面的lib目录下。
依赖4:
spring5和Thymeleaf整合包
org.thymeleaf thymeleaf-spring5 3.0.12.RELEASE
Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎
Thymeleaf是一个java类库,他是一个xml/xhtml/html5的模板引擎,可以作为mvc的web应用的view层。
maven工程创建完毕。 2、在当前的 maven工程里面添加web模块1、
在src下面创建dir webapp
2、创建核心配置文件web.xml
path那里的路径一定不能使用默认的,我们需要手动加上srcmainwebappWEB-INFweb.xml
最后是这样的:
D:ideaCodeSpringMVCspringMVC-demo1srcmainwebappWEB-INFweb.xml
之后,他就会为我们创建好web-inf目录和web.xml文件
之前原生的javaweb,是在web.xml配置servlet和监听器过滤器的。
现在使用springMVC
需要注册前端控制器DispatcherServlet
这个注册就是因为,用户点击某个连接不能直接去访问类。
只有通过注册,路径和Servlet全类名映射好,才可以访问。
一共有两种配置方式:
1、默认配置(配置文件的命名的位置默认,不能乱写和乱放)
因为我们这个前端控制器的DispatcherServlet是对前端的请求进行统一处理。
之前学习javaweb要么写的是/某个具体的请求路径
或者或者拦截器写上/*
这里的/只能匹配:
/login .html .css .js
因为jsp本质就是servlet
它是需要服务器当中指定的servlet来进行处理的。
所以.jsp发送的请求路径不需要服务器的前端控制器DispatcherServlet来处理。
之前学习的/* 它也是所有请求,包括.jsp
这个标签是伴随servlet的初始化而初始化的。
类路径下:
classpath:
就是src下面。
注意:这个src是一个蓝色的框。
类路径指的就是:
java或者resources下面的目录
在resources目录下面创建:springMVC.xml配置文件
如何创建这个:springMVC.xml呢?
之前学习servlet的生命周期是在第一次访问的时候进行初始化:
但是,前端控制器DispatcherServlet的初始化不能全部放在第一次请求的时候,否则,第一次请求的时候,压力很大。
所以要提前初始化。
总结:
在web.xml配置文件里面,需要写好SpringMVC的配置文件的名字和位置,以及MVC里面前端控制器DispatcherServlet的初始化时机。
默认是在第一次请求的时候,创建前端控制器DispatcherServlet
我们手动修改初始化时间为服务器启动的时候。
设置为1
问:为什么需要在web.xml里面配置以下内容?1
答:因为我们准备将浏览器的请求统一交给前端控制器来处理。
而前端控制器是一个Servlet,它想处理请求,响应请求,就需要在web.xml里面进行注册。
注册的时候,需要借助init-param来设置SpringMVC配置文件的命名和位置,通过load-on-startup将前端控制器的初始化时间提前到服务器启动的时候(默认第一次请求,但是不好,第一次请求会非常慢)。
注册的时候,写url,写的是/,因为前端控制器需要处理所有的请求(除了.jsp)
前端控制器对浏览器发送的所有请求进行了统一的处理。
但不同的请求还是需要不同的处理方式。
所以,还是需要创建具体请求的处理类,即请求控制器
POJO(Plain朴素的 Ordinary 普通的 Java Object)简单的Java对象
新建包:
com.rtl.mvc.controller:
使用注解+扫描的形式把HelloController加到Spring容器中。
配置他,来解析视图。
因为我们使用的视图是Thymeleaf,所以要配置Thymeleaf解析器(ThymeleafViewResolver)。
1、配置视图解析器的优先级:
视图解析器有多个。
2、配置解析视图的策略:
把当前的视图名称加上前缀和后缀
最终可以跳转到指定的页面
每当实现页面跳转的时候,如果视图名称是符合条件的话,就会,对这个视图进行解析,找到对应的页面实现跳转。
准备主页面:
WEB-INF右键,创建/templates/index.html文件
注意:WEB-INF里面的内容 ,浏览器是不能直接访问的。
重定向也不能访问。
只能通过转发。
符合条件的index.html:
这个需要记住或者加到html的模板里面。
如何设置HTML的模板呢?
xmlns:th="http://www.thymeleaf.org"准备index.html 测试功能1: 实现对首页的访问:
现在我们的index.html是不能通过浏览器的请求访问得到的。
因为它的位置:
写一个使用SpringMVC的请求,访问上下文路径的时候, 访问index.html
1、请求路径是: /
2、对应想访问的资源是:
/WEB-INF/templates/index.html
HelloController控制器里面才是真正处理请求的方法。
前端控制器DispatcherServlet只是统一接收来自前端的请求。
编写HelloController控制器去获取index.html资源
编写这个类:
里面定义方法:
返回值是:视图名称。
视图名称决定了我们最终要跳转的页面
/WEB-INF/templates/index.html
根据视图名称解析器,
把前缀去掉,把后缀去掉,得到的就是返回值。
使用注解
@RequestMapping
这个注解:
就是将当前的请求和控制器方法进行映射。
当注解@RequestMapping里面的value属性=/ 上下文路径
的时候,它就会执行注解所标志的方法。
这个方法返回的是视图名称index
然后得到的index,经过视图解析器进行解析,
加上前缀和后缀
变成:/WEB-INF/templates/index.html
就会跳转到我们最终的页面。
如果这个注解,只为value属性赋值,那么,value可以不写。
package com.rtl.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping(value = "/")
public String index(){
return "index";
}
}
配置Tomcat服务器:
因为这里写的是:/springMVC
所以当Tomcat服务器启动的时候
再浏览器输入:
http://localhost:8080/springMVC/
就会进入首页。
就已经访问到了这个资源:
SpringMVC的一个组件:
RequestMappingHandlerMapping
练习2:访问指定页面(刚才访问首页)从浏览器发送一个超链接请求。
这个路径就是上下文路径。
写超链接地址的时候,要么写/项目名(/上下文路径),
要么就写相对路径,直接写target
但是我们发现上下文路径在这个地方是可以进行修改的:
所以:
我们在写超链接的路径的时候,这个不能写死
访问目标页面target.html
“/springMVC/target”
这样写是直接写死了。
使用Thymeleaf框架来动态获取上下文路径/springMVC。
前提:
使用Thymeleaf框架必须要有命名空间
xmlns:th="http://www.thymeleaf.org"
对比:
之前写死的写法:
访问目标页面target.html
现在动态获取:
访问目标页面target.html准备target.html 在HelloController里面处理请求。 点击index.html的超链接,跳转到target.html
@RequestMapping的value的请求地址写的和超链接那里一样。
全是/target
浏览器访问:
http://localhost:8080/springMVC/
鼠标停留在超链接上面:
点击超链接就会跳转到target.html



