目录
[1. 什么是MVC](#1. 什么是MVC)
[2. 什么是SpringMVC](#2. 什么是SpringMVC)
[3. springMVC特点](#3. springMVC特点)
[1. 开发环境](#1. 开发环境)
[2. 创建maven工程](#2. 创建maven工程)
[3. 配置web.xml](#3. 配置web.xml)
[4. 创建请求控制器](#4. 创建请求控制器)
[5. 创建springMVC的配置文件](#5. 创建springMVC的配置文件)
[6. 测试HelloWorld](#6. 测试HelloWorld)
一、SpringMVC概述
1. 什么是MVC
MVC是一种软件架构的思想,将软件按照 模型、视图、控制器来划分
M:model 模型层,指工程中的JavaBean(不是实例类,是当前工程里所有处理数据的一个类 处理数据 的类学过 实体类存储数据 原来实现持久化操作时查询表中的一个数据都让他来对应当前实体类对象就 是因为实体类是用来存储数据的),作用是处理数据
JavaBean分为两类
一类称为实体类bean:专门用来存储业务数据 原来实现持久化操作时查询表中的一个数据都让他 来对应当前实体类对象就是因为实体类是用来存储数据的
一类称为业务处理的bean:处理数据的类 比如Service处理业务逻辑Dao用来查询数据库实现持久 化操作的,专门用于处理业务逻辑和数据访问
V:视图层,指工程中的html或jsp等页面,作用是与用户进行业务交互,展示数据
C:Controller,其实就是Servlet 控制层 主要接受请求和响应 Controller再根据请求处理的结果找到响 应的View视图,渲染数据后最终响应给浏览器。
MVC的工作流程:
用户通过视图层发送请求到服务器,服务器中能够接受请求处理请求响应浏览器的就是控制层 接受请 求之后 调用对应的service来处理业务逻辑 service再调用Dao进行数据库的操作 然后结果 返回service 再返回给控制层 控制层根据结果来响应浏览器在服务器中请求被Controller接受,Controller调用相应 的Model层处理请求,处理完毕后将结果返回Controller,再根据请求处理的结果找到相应的View视 图,渲染数据后最终响应给浏览器
2. 什么是SpringMVC
SpringMVC是Spring的一个后续产品 是spring的一个子项目
SpringMVC是spring为表述层开发提供的一整套完备的解决方案
不用写的很复杂 因为springMVC封装了请求响应等功能 所以我们只需使用springMVC为我们提供的实现 各个功能的代码 然后完成一个请求的处理了
目前业界普遍选择了SpringMVC作为javaEE项目表述层开发的首选方案
框架其实是配置文件加jar包
3. springMVC特点
- Spring家族原生产品,与IOC容器等基础设施无缝对接,不需要我们创建ioc容器
- 基于原生的Servlet,封装了之后,通过了功能强大的前端控制器DispatcherServlet,对请求和 响应进行统一处理(原来的浏览器发送请求要我们自己写servlet处理 而现在 发送的请求都是被前端 控制器来进行统一处理,过程都封装了比如跳转重定向传参。所以我们需要使用mvc提供使用的方 式)
- 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案。 只需要接受前端控制器处理之后的数据就可以 形参不用getparamer了只要在真正处理请求和响应方法里面在形参位置写一个形参直接接收请求 参数
- 代码清新简洁,大幅度提升开发效率
- 内部组件化程度高,可插拔式即插即用,想要什么功能配置相应组件即可 如果要实现什么功能,只需要将对应的组件配置到springMVC的核心配置文件中就可以直接实现
- 性能卓越,尤其适合现代大型、超大型互联网项目要求
二、HellWorld
1. 开发环境
2. 创建maven工程
是一个构建工具 通过原材料生产完整工程--构建 我们使用的maven其实是通过maven来管理jar包 打包 得引入依赖
web.app里配web.xml是web工程的入口配置文件 里面可以注册过滤器监听器
servlet webinfo下只放页面
3. 配置web.xml
注册SpringMVC的前端控制器DispatcherServlet
servlet要处理请求就得注册 为什么注册 因为浏览器不能直接访问到一个类,想访问servlet必须设置 一个匹配路径 如果路径匹配,当前请求就会被servlet来进行处理
/ 当前浏览器发送的所有请求 但是不包括jsp为后缀的请求路径 因为它本质是servlet服务器处理了就不 会显示页面了 其他请求都交给前端控制器处理
java
<?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">
<!-- 4 为什么要配置 因为当前浏览器发送的请求统一交给前端控制器来处理,而前端控制器是一个
servlet 我们想要servlet处理请求就必须在web.xml中进行注册
注册过程中通过init-param 配置文件的位置和名称-->
<servlet>
<servlet-name>mvcServlet</servlet-name>
<servletclass>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC配置文件的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!-- servlet的生命周期,默认是在第一次访问时候初始化 前端控制器封装了所有请求的处理 所
以初始化执行很多内容 会影响第一次访问的速度 -->
<!-- 所以 加load 将前端控制器初始化时间提前到服务器启动时候 这时就不会影响到第一次访问
速度了-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvcServlet</servlet-name>
<!-- 前端控制器处理请求的路径是上下文路径下的所有的请求路径-->
<url-pattern>/</url-pattern>
<!-- / 当前浏览器发送的所有请求 但是不包括jsp为后缀的请求路径 因为它本质是servlet服
务器处理了就不会显示页面了 其他请求都交给前端控制器处理-->
<!-- 如果写路径就相当于告诉Dispatcher只处理这个路径的请求了,就不能进行统一处理了-->
</servlet-mapping>
</web-app>
4. 创建请求控制器
由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要 创建处理具体请求的类,即请求控制器
请求控制中每一个处理请求的方法成为控制器方法
和servlet一样吗不一样 因为数据已经在前端处理器中获取过了 所以只需要创建方法 通过springMVC方 式去匹配这个方法
因为springMVC的控制器由一个普通java类担任,因此需要通过@Controller注解将其标识为一个控制层 组件,交给spring的IoC容器管理,此时SpringMVC才能够识别控制器的存在
注解加扫描的方式来配置当前控制器
把一个类标识为IoC容器组件的注解有四个 :
- Component------当前类标识为普通组件
- Controller---------当前标识为控制层组件
- Service-------------当前标识为业务层组件
- Repository--------当前标识为持久层组件
5. 创建springMVC的配置文件
javascript
<servlet-mapping>
<servlet-name>mvcServlet</servlet-name>
<!-- 前端控制器处理请求的路径是上下文路径下的所有的请求路径-->
<url-pattern>/</url-pattern>
<!-- / 当前浏览器发送的所有请求 但是不包括jsp为后缀的请求路径 因为它本质是servlet服
务器处理了就不会显示页面了 其他请求都交给前端控制器处理-->
<!-- 如果写路径就相当于告诉Dispatcher只处理这个路径的请求了,就不能进行统一处理了-->
</servlet-mapping>
</web-app>
<!-- 自动扫描包 -->
<context:component-scan base-package="com.atguigu.mvc.controller"/>
<!-- 配置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>
<!--
处理静态资源,例如html、js、css、jpg
若只设置该标签,则只能访问静态资源,其他请求则无法访问
此时必须设置<mvc:annotation-driven/>解决问题
-->
<mvc:default-servlet-handler/>
<!-- 开启mvc注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 处理响应中文内容乱码 -->
<bean
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="UTF-8" />
<property name="supportedMediaTypes">
<list>
<value>text/html</value>
<value>application/json</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
6. 测试HelloWorld
实现对首页的访问
java
@Controller
public class HelloController {
// 只有我们把这个类作为IoC容器的一个组件的时候他才是一个控制器
// 变绿了表示,当前这个类对象交给IoC容器管理了
// 注解请求映射 作用 将浏览器当前的请求和控制器方法创建映射关系 如果设置value属性
// 就是当浏览器发送的请求为/即上下文路径时候 他就会执行我们当前注解所标识的方法
// 返回视图名称 index被视图解析器解析加上前后缀就能跳转到最终的页面
@RequestMapping(value = "/")
public String index(){
// 返回视图名称 ---决定了我们要跳转到的页面 因为当前的htnl是无法直接访问的
return "index";
}
}
href
以斜线开头的路径叫做绝对路径 而绝对路径又分为浏览器解析 和 服务器解析
要想通过thmleaf解析属性可以在属性前加th:
怎么解决浏览器解析的绝对路径 当检测到里面是绝对路径时候 就会自动添加上下文路径 访
html<a th:href="@{/target}">访问目标页面target.html</a>
主页index.html中设置超链接
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<a th:href="@{/hello}">HelloWorld</a><br/>
</body>
</html>
在请求控制器中创建处理请求的方法
java
@RequestMapping("/hello")
public String HelloWorld() {
return "target";
}
三、@RequestMapping注解
1、@RequestMapping功能
作用,将请求和处理请求的控制器方法关联起来,建立映射关系
SpringMVC接收到指定的请求,就会来找到映射关系中对应的控制器方法 来处理这个请求
一个对应请求对应一个处理器方法 value值不能相同
2、@RequestMapping注解的位置
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息 先初始再具体信息
java
@Controller
@RequestMapping("/test")
public class RequestMappingController {
//此时请求映射所映射的请求的请求路径为:/test/testRequestMapping
@RequestMapping("/testRequestMapping")
public String testRequestMapping(){
return "success";
}
}
3、@RequestMapping注解的value属性
必须设置
发送一个请求最直观的表示方式就是一个请求路径
alt+enter 进入接口方法 再用 alte+7 查看里面的属性
value值可以是数组 value={"test","test1"} 只满足任何一个请求地址就会调用此方法
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射 @RequestMapping注解的 value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址 所对应的请求
@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
html
<a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性--
>/testRequestMapping</a><br>
<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><br>
java
@RequestMapping(
value = {"/testRequestMapping", "/test"},
method = {RequestMethod.GET, RequestMethod.POST}
)
public String testRequestMapping(){
return "success";
}
下文请看文章 SpringMVC框架②
欢迎大家指点评论~ 点赞+关注⭐⭐⭐