一介绍
1.什么是MVC
Javabean:项目中所有处理数据的类
2.什么是SpringMVC
是基于servlet的,封装了处理请求等等的过程
三层架构和MVC
表示层(web层) :包括 servlet 和展示页面
业务逻辑层(service层)、数据访问层(dao层)
3.SpringMVC的特点
二.入门案例
1.创建空maven项目 不选择idea 中的maven模板
复制粘贴 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.donggei.mvc</groupId>
<artifactId>springMVC-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
<!-- Tomcat 里包括了servlet,设置provided后 这个依赖不会打包
因为这个api本身就由服务器提供,程序也没有提供的必要了。
-->
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
</dependencies>
</project>
provided—只在maven编译和测试阶段生效,不在打包,安装,部署中生效
2.main 下创建webapp目录
3.在webapp下创建web.xml (是web工程的入口和配置文件)
以后可以用 注解 配置类 代替web.xml和SpringMCV的配置文件以及Spring的配置文件
如果选择了webapp模板 其实2,3步就省略了
4.写web.xml
配置前端控制器
<!-- 配置SpringMVC 前端控制器 对浏览器所有请求统一管理-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
<!-- / 表示的是除了.jsp请求外的所有请求-->
</servlet-mapping>
/
表示的是除了.jsp请求外的所有请求(一般也不会用到jsp) , 因为jsp 本质是一个servlet, 一般是做特定的处理,不需要被前端控制器统一处理
如果被前端控制器统一处理,请求这个jsp 就找不到 你要访问的jsp啦
/* 表示的是包括.jsp的所有请求 注意区别
(一般不使用 使用的是下面这种)
不使用上面这种是因为和maven的打包有关
前端控制器是一个Servlet 所以要在web.xml配置,前端控制器有它的初始化初始化参数指向了spingMVC.xml
![]](https://img-blog.csdnimg.cn/dfbea11bd63847b78c76bff04fe3a0d6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVnaW5uZXJEWg==,size_20,color_FFFFFF,t_70,g_se,x_16)
web.xml:
<?xml version="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">
<!-- 配置SpringMVC 前端控制器 对浏览器所有请求统一管理-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置SpringMVC配置文件的位置和名称-->
<init-param>
<!--上下文配置路径-->
<param-name>contextConfigLocation</param-name>
<!--配置文件的位置和名称 classpath 表示类路径 就是java和resources-->
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<!--把前端控制器DispatcherServlet
的初始化提前到启动服务器时,默认是在第一次访问时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
<!-- / 表示的是除了.jsp请求外的所有请求-->
</servlet-mapping>
</web-app>
初始化参数,是要在init方法中完成,那么servlet的创建是在第一次访问的时候创建,所以初始化参数会在第一次访问时加载
但是初始化参数的操作如果过多,那么影响的就是客户体验。所以一般都会提前创建servlet。使用标签在服务器启动的时候就加载,那么耗时操作就是在服务器开启。
![]](https://img-blog.csdnimg.cn/eca37e86d6c94eb1a8e46da5f5e98c1c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVnaW5uZXJEWg==,size_20,color_FFFFFF,t_70,g_se,x_16)
注解+扫描 使用IOC (可以用xml配置文件也可以用配置类,这里是xml配置)
@Controller
public class HelloController {
}
springMVC.xml:
<context:component-scan base-package="com.donggei.mvc.controller"></context:component-scan>
这个图标表示 当前对象已经交给IOC啦
然后配置Thymeleaf视图解析器 它负责页面跳转
<context:component-scan base-package="com.donggei.mvc.controller"></context:component-scan>
<!-- 配置Thymeleaf视图解析器 -->
<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>
在对应目录下写一个index.html
写HelloController
@Controller
public class HelloController {
// "/" -->/WEB- INF/templates/index.html
//请求映射的注解
@RequestMapping("/")
public String index() {
// 返回的是最后要跳转的页面 也就是视图名称(视图名称: 去掉前后缀)
return "index"; //相当于请求跳转,因为重定向不能访问到web-inf目录
}
}
浏览器访问=》转到分发器=》读取配置文件=》组件扫描到对应控制器=》RequestMapping映射