第三个基础框架 — springMVC
2021/10/27 6:10:04
本文主要是介绍第三个基础框架 — springMVC,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、什么是springMVC?
-
还是老规矩,百度百科一下
-
这里面说了一堆废话,去官网瞄一下
- 官网网址:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
-
唯一有用的信息:springMVC就是spring的一部分
-
我来说一下:
-
springMVC本质就是前面说过的servlet,所以它的职责还是和servlet的一样 ———— 获取请求,解析请求,实现页面跳转,只是对servlet做了比较深的封装,使我们编写代码变得轻松了而已
-
因此:玩springMVC就和servlet差不多,做的事情都一样,什么请求转发、重定向、文件上传、文件下载、过滤器、拦截器......
-
因此:学springMVC之前,玩一下servlet的请求转发( 只玩请求转发即可,有利于理解springMVC的流程
-
-
既然是springMVC,那MVC指的是什么?
- M 即:model 模型:提供要进行展示的数据
- V 即:view 试图:负责进行模型的展示嘛
- C 即:controller 控制层:接受请求,委托给模型进行处理
-
MVC的主要作用: 降低视图和业务层之间的双向耦合,MVC是一种架构模式,典型的就是:jsp+servlet+entity
-
springMVC的中央大脑:DispacherServlet
-
先上springMVC的执行原理
-
2、实操理解springMVC的执行原理( 使用纯的xml配置 )
-
1)、准备工作:创建maven项目( 可以直接选择maven的webapp模板【 这种方式版本很老,需要手动把web.xml进行更新 [ 这在我的servlet博客内容中安装maven已说明 ] 】,也可以选择创建单纯的maven项目,然后转web项目,这种方式生成的web.xml是对应java版本最新的 ———— 我自己使用的是这样方式 )
- 我的servlet博客内容链接
-
导入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.12.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
- 2)、跟着流程图来玩一玩
- (1)、配置springMVC的中央大脑,即:前端控制器DispacherServlet
- (1)、配置springMVC的中央大脑,即:前端控制器DispacherServlet
<?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"> <servlet> <!-- <servlet-name>springmvc</servlet-name> 这里的springmvc名字乱取都可以,只要自己和别人看得懂就行 DispatcherServlet 就是springMVC的中央大脑 所有的请求都会经过它 由这个中央大脑来分配这个请求的流程是怎么样的 --> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 把springMVC的配置文件集成过来 为什么需要把springMVC集成到这里到? 这个web.xml其实也算一个容器,这个容器处理的是后端的程序,这个需要知道servlet的执行原理 和 这个web.xml 及tomcat中的web.xml的关系才能理解 就当补充知识点吧,在我的servlet中只讲了这个web.xml和Tomcat中的web.xml的关系,其他的没讲 因此:为了这里面话别太多影响内容,待会儿完了之后再补充servlet的执行原理,这里就这么配置就行了 注:<param-value>classpath:springmvc.xml</param-value>中的springmvc.xml就是要配置的springMVC文件名 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 这个这个在servlet中说明过,这个值只要大于 -1 即可,就是servlet加载的优先级 这里简单粗暴理解可以认为是:单例模式的懒汉式加载( 虽然不对,但是用这个想法来理解也算对 ) --> <load-on-startup>1</load-on-startup> </servlet> <!-- 这里的springmvc名字必须和前面说的乱取的<servlet-name>springmvc</servlet-name>名字保持一致 <url-pattern>/</url-pattern> 这里面必须用 / 不能用其他的 千万注意:这里不用用成 /* / 和 /*的区别 / 不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 /* 会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类, 导致找不到对应的controller,从而报404错误 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
(2)、配置springMVC文件( 一是刚刚的web.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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 添加处理器映射器 就是原理图中的映射器 HandlerMapping--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 添加处理器适配器 就是原理图中的适配器HandlerAdapter--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 添加视图解析器 这个的本质就是把controller中返回的视图名进行拼接,从而找到相应的视图xxxx,jsp而已 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- prefix 要展示的视图的前缀 这里是/ 是因为一:我的视图就放在web目录下的,要是加了另外的目录,那就再拼接 如:/WEB-INF/jsp/ 二是:在浏览器中发起请求的时候,对应的url路径名其实是/xxxx.jsp涩 而这里的xxxx就是待会儿controller中返回回来的那个名字 --> <property name="prefix" value="/"/> <!-- suffix 要展示的视图的后缀 --> <property name="suffix" value=".jsp"/> </bean> </beans>
(3)、编写controller
(4)、把这个controller中的类托管到springMVC.xml这个容器中、以及编写要跳转的视图
(5)、配置Tomcat,启动项目
(6)、会报404的情况
-
1、检查自己的控制台,看报的错是什么,或者看它是不是报了少了什么jar,少了就看是不是自己漏了
-
2、最常见的一种:IDEA的bug,控制台没有报任何错误,但是一请求路径,就报404,在浏览器
F12控制台抓包看就是报的请求路径找不到- 解决办法:
-
提示:弄完lib之后,记得把maven使用clean工具清除一下( 有时idea会开小差,没clean好,clean好了就是那个target目录没了 ),然后重启tomcat就可以了
- 解决办法:
-
3、额外原因导致报404 ———— 这种是自己粗心代码导致的,一般为以下情况:
-
前后缀哪里配错了
-
handler配错了,严格来说是:那个id值搞错了
-
以上两种情况属于:not mapping for get 的404情况
-
-
玩完了上面的流程之后,试着自己多写几次其他的页面展示,然后结合servlet的转发,这个springMVC的执行原理就理解的差不多了( 流程图也就到自己脑海中去了 )
补充:3、servlet的执行原理
-
web.xml和tomcat中web.xml的联系已在我的servlet博客内容中说明过:项目中的web.xml处理的是后端的代码;tomcat中的web.xml处理的是前端的代码,并把他们通过流的形式给到了后台,同时转成了一个servlet( tomcat的web.xml中有一个servlet配置是default )
-
servlet的执行原理:
-
当客户端发起一个请求之后,tomcat会帮我们开启一个容器( 即:我在servlet中说明过的全局域servletContext ),请求能够精准找到tomcat就是因为客户端的那个url地址中有ip和端口号( localhost:8080 )
-
这个容器怎么去加载另外的东西才是关键点
-
请求进来要找servlet,而servlet是一个接口,不能做事,因此又创建GenericServlet,而这是一个抽象类 ( 对servlet做了简单的实现而已 ),因此还不能做事,所以继续创建HttpServlet ———— 这才是我们用的那个servlet
-
HttpServlet根据http协议接收了客户端的请求,为什么能够接收请求?
-
因为:GenericServlet还是serializeable的抽象类 ———— serializeable序列化嘛,流技术咯
-
-
HttpServlet要去找我们编写的servlet在哪里,怎么找?
- 注解版是使用了@webServlet,xml版是在web.xml中配了一个servlet,里面的那个servlet-class就是指向的我们编写的servlet,这样就找到了我们编写的servlet在哪里
-
找到我们自己编写的servlet之后,我们编写的servlet里面需要用到HttpServlet涩( 重写了doGet和doPost方法嘛)
- 因此:这里才有的servlet的生命周期:即创建 ———— 使用构造器创建的、初始化init()、服务service() ———— 我们重写了这里面的两个方法doGet和doPost、销毁destroy()
-
到了我们自己编写的servlet之后,把编写的东西( 响应信息 )通过HttpResponse对象把响应信息返回给客户端
- 它怎么知道返回到哪个url路径去?
- 注解版@webServlet()这个()里面有一个请求路径、xml版中web.xml中有一个servlet-mapping,这个mapping下面有一个url-pattern路径,这就是HttpResponse应该把信息返回到的地方
- 它怎么知道返回到哪个url路径去?
-
-
前面在springMVC项目中,为什么那个web.xml中需要配置:
<init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param>
这是一个初始化参数嘛,别忘了GenericServlet还是servletConfig的实现类,因此:servletConfig的功能它也有,相应的HttpServlet也有,作用就是为了读取初始化参数嘛 ———— 获取初始化参数在我的servlet说明servletContext获取初始化参数时已经说明了,原理就是一样的,servletContext这里面的东西在我们编写的任何一个servlet中都可以拿到,因此:这里web.xml中加入了springMVC的参数路径,也就把springMVC的xml配置文件在请求进来时也加载出来了( 这也是我说的哪个load-on-start大于-1可以理解为:单例模式的懒汉式加载的原因 ,因为:相对于servlet本身来说,这个springMVC的配置文件确实是后面controller中用时才加载的,只是那个数字大小也关系到多个servlet的加载时的先后顺序而已 )
4、企业级使用springMVC ———— 注解版开发
-
1)、导入的依赖、配置web.xml没变
-
2)、编写springmvc配置文件的表空间和检测表
-
3)、编写springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!-- 添加注解支持--> <mvc:annotation-driven/> <!-- 让springMVC的注解在什么地方有效 springMVC是处理controller的,因此:精确到controller包就可以了 表示:这个包下的所有类都支持springMVC注解 --> <context:component-scan base-package="cn.xiegongzi.controller"/> <!-- 编写视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 配置不处理静态资源,即:html,jsp....之类的 这种方式是:遇到访问静态资源的请求 即:web目录下的html、jsp....., 让他们默认走tomcat的servlet处理方式( 即:tomcat中的那个web.xml ) 这个还有另外两种方式,这里先用这种,后续会说明,后续内容多得很,反正servlet能玩的,这个springMVC都能玩 --> <mvc:default-servlet-handler/> </beans>
-
4)、编写controller
-
5)、编写视图
-
6)、配置当前程序的tomcat,然后启动程序
-
7)、若报404,则:注意前面xml版报404的说明
这篇关于第三个基础框架 — springMVC的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南