介绍MVC
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
M:Model,模型层,指工程中的JavaBean,作用是处理数据
JavaBean分为两类:
- 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
- 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller 调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果 找到相应的View视图,渲染数据后最终响应给浏览器
三层架构分为:
表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台 servlet
SpringMVC的特点
- Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
- 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一 处理
- 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
- 代码清新简洁,大幅度提升开发效率 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
- 性能卓著,尤其适合现代大型、超大型互联网项目要求
SpringMVC处理请求案例
- 首先创建web工程,可以直接选择webapp进行创建,也可以自己手动创建
- 配置web.xml文件 (注意这里的servlet-name必须要与WE-INF下的XXX-servlet.xml文件中的XXX名称相同)
1.配置SpringMVC-servlet.xml文件 (注意文件中的视图前缀下的文件名/WEB-INF/templates/就是在templates下创建的文件)
<?xml version="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_Ray.springMVC.controller"></context:component-scan> <!-- 配置Thymeleaf视图解析器 作用:解析视图 ,使用之后就可以使用springmvc为我们提供的方式来进行视图渲染,并实现页面跳转 --> <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/"/> <!-- 逻辑视图:/WEB-INF/templates/(前缀) index - .html(后缀) == 物理视图(全地址) - 视图前缀 - 视图后缀 物理视图(需要访问的网页)--> <!-- 视图后缀 --> <property name="suffix" value=".html"/> <property name="templateMode" value="HTML5"/> <property name="characterEncoding" value="UTF-8" /> </bean> </property> </bean> </property> </bean> </beans>
- 创建Controller控制层的相关代码,用于接受请求和进行请求转发和跳转
- 模块名+Controller 类其中方法名加 @RequestMapping(“/”)标签就是作为请求映射的标签,其中(“/”): 表示的是绝对路径为http://localhost:8080/SpringMVC/ 上下文的这个请求 返回值return作用就是跳转至需要跳转的页面,内容:“逻辑视图名称”
- 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/maven-v4_0_0.xsd"> <parent> <artifactId>java_workSpace_SSM</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> <name>SpringMVC</name> <artifactId>SpringMVC</artifactId> <build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.7</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8888</port> <maxIdleTime>30000</maxIdleTime> </connector> </connectors> <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version} </webAppSourceDirectory> <contextPath>/</contextPath> </configuration> </plugin> </plugins> </build> <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> </dependency> <!-- Spring5和Thymeleaf整合包 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> </dependencies> </project>
如果想要将配置文件放在类路径下的resources下,那么就可以这样设置
<!--a - SpringMVC 的前端控制器DispatcherServlet - Servlet that dispatches requests to the Spring managed block servlets --> <servlet> <!-- 这里的servlet-name一定要与WEB_INF下的配置文件XXX-servlet.xml中的XXX名字相同--> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!--初始化的作用:将我们的配置文件放到resources路径下--> <param-name>ContextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <!-- URL space mappings ============================================= --> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern><!--表示所有的请求都需要进行过滤 (被前端控制器处理) *.do :表示后缀处理--> </servlet-mapping>
总结简单的运行原理及过程
- 浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被 前端控制器 DispatcherServlet 处理。
- 前端控制器会 读取SpringMVC的核心配置文件 ,通过 扫描组件 找到控制器, 将请求地址和控制器中@RequestMapping注解的 value属性值进行匹配
- 若匹配成功,该注解所标识的控制器方法就是处理请求的方法。
- 处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会 被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视 图所对应页面
具体如何处理一个请求★★★★★:
- @RequestMapping注解功能: 从注解名称上我们可以看到,@RequestMapping注解的作用就是 将请求和处理请求的控制器方法关联 起来,建立映射关系。 SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
- @RequestMapping注解位置★★★(类与方法) :
@RequestMapping 标识一个类 :设置映射请求的请求路径的 初始信息**
@RequestMapping 标识一个方法 :设置映射请求请求路径的 具体信息**
如果说两个都设置了RequestMApping , 那么就是在 访问方法上的请求时需要加上类上的RequestMapping的地址
@Controller @RequestMapping("/test/") public class EmployeeController { @Autowired private EmployeeDao employeeDao; //查询所有的员工信息 //请求地址问 : /test/employee @GetMapping("/employee") public String selectAll(Model model){ Collection<Employee> employeeAll = employeeDao.getAll(); model.addAttribute("employeeAll",employeeAll); return "emp_list"; } }
@RequestMapping注解的value属性:(可以设置多个) : 为数组属性,即为浏览器所发送请求的请求路径匹配的value属性中的任何一个值(只要一个满足就可以)
//查询所有的员工信息 @GetMapping({"/test/employee","test/hello","..."}) public String selectAll(Model model){ Collection<Employee> employeeAll = employeeDao.getAll(); model.addAttribute("employeeAll",employeeAll); return "emp_list"; }
@RequestMapping注解的method属性( 也是数组 ): 表示请求方式() mathod={RequestMethod.POST ,RequestMethod.GET } 作用: 通过请求方式匹配请求
注: 1、对于处理指定请求方式的控制器方法,SpringMVC中提供了
@RequestMapping的派生注解
处理get请求的映射–>@GetMapping
处理post请求的映射–>@PostMapping
处理put请求的映射–>@PutMapping
处理delete请求的映射–>@DeleteMapping
2、常用的请求方式有get,post,put,delete 但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符 串(put或delete),则按照默认的请求方式get处理 若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter
1.@RequestMapping注解的param属性作用 :
通过请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性到的设置
注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数 和请求映射的匹配关系
对于params属性的设置: 如果params属性设置了值,那么请求参数就必须加上对应的值 (否则报400错误) 下面是两种方式 :
一定不能携带password
1.@RequestMapping注解的header属性(用法和param用法一模一样):
SpringMVC支持ant风格的路径
?:表示任意的单个字符
? 就会被解析成和前后字符相同的字符 ,但是不能匹配特殊字符(比如 ? )
*:表示任意的0个或多个字符
以下两种都可以 (但是不能为 / )
******* :表示任意层数的任意目录 注意:在使用时,* 只能使用//xxx的方式** ( //中间不能出现其他字符** )
SpringMVC中支持路径中的占位符
原始方式: /deleteUser?id=1
rest方式: /user/delete/1****
其中的admin/1 都是参数 : 需要进行赋值