目录
🥳🥳Welcome Huihui's Code World ! !🥳🥳
接下来看看由辉辉所写的关于SpringMVC的相关操作吧
一.SpringMVC是什么
SpringMVC是Spring提供的一个强大而灵活的web框架,借助于注解,Spring MVC提供了几乎是POJO的开发模式【POJO是指简单Java对象(Plain Old Java Objects、pure old java object 或者 plain ordinary java object)。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的Java对象。POJO让开发者可专注于业务逻辑和脱离框架的单元测试。可以把POJO看作是一个普通的Java类,它具有简单、灵活和可扩展的编程模型,使开发人员可以专注于业务逻辑的实现,而不需要过多考虑框架相关的规范和限制】,使得控制器的开发和测试更加简单。它是一个基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFramework的后续产品,已经融合在Spring Web Flow中 ,你可以把SpringMVC看作是一个控制器,它负责处理用户请求并返回响应。在SpringMVC中,控制器(Controller)、视图(View)和模型(Model)是分离的。控制器负责处理用户请求并返回响应,视图负责显示数据,模型负责存储数据
二.为什么要使用 SpringMVC
清晰的角色划分:SpringMVC将控制器(controller)、验证器(validator)、命令对象(command object)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、试图解析器(view resolver)等等。每一个角色都可以由一个或多个组件来实现,这样的设计使得开发人员可以更加专注于业务逻辑的实现
无需配置:SpringMVC是一个典型的轻量级MVC框架,相对于之前的struts2框架,SpringMVC运行更快,其注解式开发更高效灵活。可以和Spring框架无缝整合
代码可重用性高:SpringMVC支持RESTful风格的URL设计和参数传递,这使得代码具有很好的可读性和可维护性
易于测试:SpringMVC支持JUnit和Mockito等测试框架,这使得开发人员可以更加方便地进行单元测
三. SpringMVC的工作流程【附有超详细流程图】
关于流程图的详细说明
- 用户发送请求到前端控制器(DispatcherServlet)
- 前端控制器(DispatcherServlet)根据请求信息调用处理器映射(HandlerMapping)
- 处理器映射器(HandlerMapping)根据 URL/请求参数找到具体的处理(Handler)生成处理器对象及处理器拦截器(如果有则生成)一并返回给前端控制器(DispatcherServlet)
- 前端控制器(DispatcherServlet)通过处理器适配器(HandlerAdapter)执行Handle
- 处理器处理请求(调用方法处理业务逻辑)
- 将结果封装成 ModelAndView 对象并且返回
- 前端控制器(DispatcherServlet)将 ModelAndView 对象传给视图解析器(ViewResolver),之后返回视图ModelAndView
- 视图解析器(ViewResolver)根据 ModelAndView 对象找到对应的视图(View)
- 返回真正的视图对象
- 将视图进行渲染
- 返回渲染完毕的视图
- 前端控制器(DispatcherServlet)将响应内容写到响应对象中,响应对象返回给客户端
其实明白了流程之后,我们便可以很好的将其总结出来了,无非就是用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它。页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名)。前端控制器收回控制权,然后根据返回的逻辑视图名,把模型数据传入,选择相应的视图进行渲染
更加通俗的话,可以举一个例子来熟知,当你在淘宝购物时,你打开了某个商品页面,这个页面是由淘宝的前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它。接着,该页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象(例如商品信息),然后将命令对象委托给业务对象(例如卖家)进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名)。最后,前端控制器收回控制权,并根据返回的逻辑视图名选择相应的视图进行渲染,并把模型数据传入以便视图渲染。
四. SpringMVC的入门小案例
配置pom.xml
首先需要再pom.xml中进行配置,导入相关依赖
<!-- jstl--> <jstl.version>1.2</jstl.version> <!-- standard --> <standard.version>1.1.2</standard.version> <!-- spring --> <spring.version>5.0.2.RELEASE</spring.version> <!-- spring mvc相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>${standard.version}</version> </dependency>
创建spring-mvc.xml
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)--> <context:component-scan base-package="com.wh"/> <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --> <mvc:annotation-driven /> <!--3) 创建ViewResolver视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--4) 单独处理图片、样式、js等资源 --> <!-- <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>--> </beans>
配置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_3_1.xsd" version="3.1"> <display-name>Archetype Created Web Application</display-name> <!-- Spring和web项目集成start --> <!-- spring上下文配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:Spring-context.xml</param-value> </context-param> <!-- 读取Spring上下文的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Spring和web项目集成end --> <!-- 中文乱码处理 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring MVC servlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:Spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <!--web.xml 3.0的新特性,是否支持异步--> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
运用SpringMVC注解配置Web层
package com.wh.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author 王辉 * @site www.shihuihuila.com * @create 2023-09-04 18:47 */ @Controller @RequestMapping("/smvc1") public class Springmvc1 { @RequestMapping("/print") public String test(){ return "hello_huihui"; } }
jsp页面
<%-- Created by IntelliJ IDEA. User: W Date: 2023/9/4 Time: 18:49 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>SpringMVC测试</title> </head> <body> 💗💗I LOVE YOU!!💗💗 </body> </html>
运行结果
小贴士:关于 SpringMVC中的注解
下列都为SpringMVC中的常用注解
- 1. @Controller:用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类,并将其注册为一个控制器
- 2. @RequestMapping:用于映射请求路径和处理请求的方法
- 3. @RequestParam:用于从请求参数中获取值,可以指定参数的名称、是否必须、默认值等
- 4. @PathVariable:用于获取URL中的参数值,可以指定参数的名称
- 5. @ModelAttribute:用于将请求参数绑定到模型对象上
- 6. @RequestBody:用于将请求体中的数据绑定到方法参数上
- 7. @ResponseBody:用于将方法返回值绑定到响应体上
五.SpringMVC处理静态资源
如果访问不了静态资源,那或许是因为DispatcherServlet拦截了所有的请求,同时对静态资源的访问也被拦截了。如果你的DispatcherServlet拦截“/”,那么所有的请求都会被拦截,包括对静态资源的访问
那么我们只需要在Spring-mvc中添加一行代码,便可让静态资源成功被访问
<mvc:resources location="/static/" mapping="/static/**"/>
如此便可以访问静态资源了
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊