SpringMVC
== 学习笔记,后续持续更新==
0. 一些基本概念及要求
ssm:spring + springMVC MVC三层架构 + mybatis
JavaSE:java基础学习
JavaWeb:java网站设计
框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力
大数据学习基于Spring的前后端建议:Spring + Spring MVC + Spring Boot + Spring Cloud + Linux + Vue;
课程要求:
- 至少要懂SpringMVC的执行流程
- SSM框架的整合
0. MVC简介
- MVC是模型(model)、视图(view)、控制(Controller)的简写,是一种软件设计的规范。
- MVC是采用将逻辑、数据、显示分离的方法来组织代码。
- MVC主要的作用是降低了视图和业务逻辑间的双向耦合
- MVC不是一种设计模式,MVC是一种架构模式,当然不同的MVC存在一定的差异
MVC框架
MVC层 | 描述 |
---|---|
Model(模型) | 数据模型,提供要展示的数据,因此包含了数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都是分离来:Value Object(数据Dao)和服务层(行为Service)。也就是模型提供了模型的数据查询和模型数据的状态 |
View(视图) | 负责进行模型的展示,一般是我们见到的用户界面,客户想要看到的东西 |
Controller(控制器) | 接收用户请求,委托给模型(model)进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示,也就是说控制器(Controller)在MVC框架中充当调度员的工作 |
最典型的MVC框架
JSP + servlet + JavaBean
JSP:属于视图层的内容
servlet:用于转发,重定向
Model1时代
-
早期开发通常采用两层结构完成:视图层和模型层
-
优点:架构简单,比较适合小型项目开发
-
缺点:JSP职责不单一,职责过重,不便于维护
Model2时代
- Model2把一个项目分成三部分,包括视图、控制、模型
- JSP本质是一个Servlet
1. SpringMVC概述
SpringMVC是SpringFramework的一部分,是基于Java实现的MVC的轻量级Web框架
1.1 为什么要学SpringMVC
- 轻量级,易学
- 高效,基于请求响应的MVC框架
- 可以与Spring兼容性好,可以无缝结合
- 约定由于配置
- 功能强大:RESTful,数据验证、格式化、本地化、主题等
- 简洁灵活
1.2 中心控制器
Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring2.5开始,使用Java5或者以上版本的用户可以采用基于注解的controller声明方式。
SpringMVC框架像许多其他的MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类)
1.3 简要概述MVC的执行流程
- DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用于拦截客户端发送的匹配的请求,并把拦截下来的请求,依据相应的规则划分到目标Controller中处理,是整个SpringMVC的第一步(DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,同时负责用户请求的分派,而且可以与SpringIOC容器无缝集成,从而可以兼容Spring框架)
- 假设请求的url为:http://localhost:8080/SpringMVC/hello 可以将url拆分成三部分
- http://localhost:8080 表示服务器域名
- SpringMVC 表示我们请求的服务器上的web站点
- hello表示控制器
- 通过上面三点分析,我们请求的url含义为:请求为与http://localhost:8080上的SpringMVC站点的hello控制器
- 假设请求的url为:http://localhost:8080/SpringMVC/hello 可以将url拆分成三部分
- HandlerMapping:为处理器映射,当DispatcherServlet调用HandlerMapping时,HandlerMapping会根据客户端发送的url请求查找Handler处理器
- HandlerExecutionChain:是Handler的执行链,由HandlerMapping会把请求映射为HandlerExecutionChain类型的handler对象,如上url别查找的控制器为:hello
- HandlerExecution将解析后的信息传递给DispatcherServlet,如:解析控制器映射等。
- HandlerAdapter:表示处理器适配器,由DispatcherServlet将经HandlerMapping处理得到的handler对象作为参数传递给HandlerAdapter的实例化对象,并按照一定规则执行handler(其实就是通过handler去找到对应的controller并执行的一个过程),返回一个ModelAndView对象
- Handler让具体的Controller执行
- Controller将具体的执行信息返回给HandlerAdapter,如:ModelAndView,
- HandlerAdapte将视图逻辑名或模型传递给DispatcherServlet
- DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
- 视图解析器将解析的逻辑视图名传递给DispatcherServlet
- DispatcherServlet根据视图解析器的视图结果,调用具体的视图
- DispatcherServlet将最终的视图呈现给用户
1.4 小结
使用SpringMVC必须配置的三大组件:处理器映射器,处理器适配器,视图解析器
通常,我们只需要手动配置视图解析器即可,而处理器映射器和处理器适配器只需要开启注解驱动即可,这样可以省去大段的xml配置
2. SpringMVC配置过程
2.1 原生态-配置版
- 新建一个Module,导入web模块支持
- 配置SpringMVC相关的依赖
- 配置web.xml文件,注册DispatcherServlet
<!--1. 配置Web容器的servlet控制中心-->
<servlet>
<!--1.1 配置Servlet的名称及类型-->
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--1.2 配置Servlet控制器的拦截机制-->
<init-param>
<param-name>contextConfigLocaton</param-name>
<param-value>classpath:</param-value>
</init-param>
<!--1.3 配置当前Servlet的运行级别-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--2. 配置Web控制中心的映射-->
<servlet-mapping>
<!--2.1 绑定Servlet-->
<servlet-name>spring-mvc</servlet-name>
<!--2.2 对映射内容进行过滤,/表示允许jsp之外的全部文件通过,/*表示允许全部文件通过-->
<url-pattern>/</url-pattern>
</servlet-mapping>
- 在web.xml指定好spring的配置文件后,为spring的配置文件添加以下内容
<!--1. 配置Spring核心三要素-->
<!--1.1 处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--1.2 处理适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--1.3 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--2. spring的其它配置-->
<!--BeanNameUrlHandlerMapping:bean-->
<bean id="/hello" class="com.fuxi.spring.Collector.HelloController"/>
- 接下来可以构建Controller开发业务
2.2 注解-SpringMVC开发
- 新建一个Module,导入web模块支持
- 由于Maven可能UC存在资源过滤的问题,我们可以在poem.xml配置文件中将配置完善
<build>
<resources>
<!--配置Spring的src/main/java源码下的资源过滤,允许以.properties和.xml结尾文件通过-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!--配置Spring的src/main/resources源码下的资源过滤,允许以.properties和.xml结尾文件通过-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
-
在pom.xml文件中引入相关的依赖:包括Spring核心框架库、SpringMVC、Servlet、JSTL等,当然,如果在父类pom.xml已经引入了,则可以无需引入
-
配置web.xml
- 注意
- 注意web.xml的版本问题,尽量要使用最新版,比如当前使用的环境,使用的就是web 4.0版本
- 要注册DispatcherServlet
- 管线SpringMVC的配置文件
- 启动级别为1
- 映射路径【尽量不用用/*,否则可能会出现404】
- 注意
-
添加SpringMVC配置文件
-
过程
- 让IOC的注解生效
- 静态资源过滤:HTML,JS,CSS,图片,视频……
- MVC的注解驱动
- 配置视图解析器
-
-
完成上述配置,整个Spring-MVC-Annotation的基本环境配置就已经完成了,这时候就可以开始进行Controller层、Service层、Dao(Mapper)层的业务开发了。
-
Spring-MVC开发中常用注解
注解 应用 描述 @Component 组件 @Repository 常作为dao层容器注解 @Service 常作为Service层注解 @Controller 常作为Controller层注解 @Controller代表这个类会被Spring托管,被这个注解的类中所有的方法,如果返回的是String,并且没有具体页面可以跳转,那么就会被视图解析器解析
3. RestFul风格
3.1 概念
Restfult是一个用于做资源定位和资源操作的风格。它既不是标准,也不是协议,仅仅是一种风格,基于这种风格开发的软件可以更简洁,更有层次,且更易于实现缓存等机制。
3.2 功能
- 资源:互联网所有的事物都可以被抽象为资源
- 资源操作:使用PSOT、DELETE、PUT、GET,使用不同方法对资源进行操作
- 分别对应 添加、删除、修改、查询
3.3 传统资源操作与RestFult资源操作的对比
3.3.1 传统资源操作示例:
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或PSOT
3.3.2 RestFul操作资源示例
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,
4. SpringMVC:结果跳转方式
4.1 ModelAndView
- 在Spring-MVC的主配置文件中配置“视图解析器”
- 在Controller层通过实现Controller接口的方式实现Controller层对应类的具体方法。即通过原生态的方式完成对Controller层跳转的实现
4.2 ServletAPI
- 通过SpringMVC来实现转发和重定向,则不需要 视图解析器(如果已经写了视图解析器,可以在配置文件中将其暂时注解
- HttpServletResponse实现三种视图跳转控制
ServletAPI | 描述 |
---|---|
HttpServletResponse | 通过HttpServletResponse实现输出 |
HttpServletResponse | 通过HttpServletResponse实现重定向 |
HttpServletResponse | 通过HttpServletResponse实现转发 |
示例:
-
通过return实现跳转和重定向:
示例:
5. Ajax
ajax三要素:
- url:请求连接
- data:要发送的数据
- recallfunction:回调函数,一般常用的有两个success()和error()
//post模式
$.post({
url: window.location.href.replace(window.location.pathname, "")+"/a1",
data: {"":$("#username").val()},
success:function (data) {
console.log("成功获取到服务器响应");
alert(data);
},
error:function(){
alert("未获取到数据的的响应")
}
})
//get模式
$.get({
url: window.location.href.replace(window.location.pathname, "")+"/a1",
data: {"":$("#username").val()},
success:function (data) {
console.log("成功获取到服务器响应");
alert(data);
},
error:function(){
alert("未获取到数据的的响应")
}
})
6. 文件上传与下载
-
SpringMVC可以很好的支持文件上传,但因为SpringMVC并没有装配MultipartResolver,因此默认情况下不能处理文件上传工作,如果想要使用Spring的文件上传功能,需要在上下文中高配置MultipartResolver
-
前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data,只有在这样配置下,浏览器才会把用户选择的文件以二进制数据的方式发送给服务器
-
<form action="" enctype="multipart/form-data" method="post"> <input type="file" name="file"/> <input type="sumbit"/> </form>