MVC模式
mvc : 是一种用于设计创建web应用表现层的模式。使用它可以将业务逻辑,数据,页面显示代码分离出来
-
Model(模式):数据模型(封装对象)
-
View(试图):用于展示数据(html,jsp)
-
Controller(控制器):用于程序业务逻辑处理
1、封装请求:model
2、调用service
3、响应跳转视图
SpringMVC
-
SpringMVC是Spring产品对MVC模式的一种具体实现, 它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口。
-
SpringMVC中和Spring一样,也存在容器的概念(支持spring的注解)
SpringMVC原理
- 工作流程
- 用户通过浏览器发送请求至DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping
- HandlerMapping找到具体的处理器链返回给DispatcherServlet
- DispatcherServlet会根据返回的处理器链调用HandlerAdapter
- HandlerAdapter经过适配调用具体的Handler(controller)
- Controller执行完成返回一个执行结果
- HandlerAdapter将Handler的结果ModelAndView对象返回给DispatcherServlet
- DispatcherServlet将ModelAndView对象传给ViewReslover
- ViewReslover解析后得到具体View,并返回给DispatcherServlet
- DispatcherServlet根据View进行视图渲染(即将模型数据填充至视图中)
- DispatcherServlet会将渲染后的视图响应给浏览器
- SpringMVC的四大组件
前端控制器:DispatcherServlet
SpringMVC的核心组件(DispathcherServlet),协调所有组件的运行
处理器映射器 HandlerMapping
根据URL请求去寻找对应的处理方法( Controller中的方法)
处理器适配器 HandlerAdapter
真正的去调用处理方法(执行Controller中的方法)
视图解析器 ViewReslover
将逻辑视图翻译成物理视图
物理视图:jsp页面的完整路径
常见注解
@RequestMapping :用于建立请求URL和处理方法之间的对应关系, 也可以通过它的属性对请求做出各种限制.
-
value(path): 用于限制请求URL(和path作用一样)
-
method:用于限制请求类型
配置当前请求的请求类型(RequestMethod.post,RequestMethod.get,RequestMethod.delete,RequestMethod.put) -
params:用于限制请求参数的条件(了解中的了解)
此注解可以标注在方法上,也可以标注在类上,标注在类上代表类中的所有方法都可以共用一段URL
示例:
springMVC处理文件上传
前端三要素:
- form表单的method = post
- form表单的enctype=“multipart/form-data”
- from表单中的input的type = file
springmvc中服务端: - 需要在springmvc的配置文件中,添加文件解析器(自动的将上传的内容,转化为MultipartFile对象)
- 在控制器方法上,直接使用MultipartFile对象标识上传的文件
前台示例代码:
导入依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
配置文件上传解析器
<!--
文件解析器
id:固定值(multipartResolver)
其中指定上传文件的大小规则
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件的大小规则 5M = 1024 * 1024 * 5 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
后台代码示例:
配置释放静态资源
方式一
在Springmvc的配置文件中添加释放静态资源
<!--
释放静态资源的方式一
mapping : 请求路径的URL的映射规则
location: 静态资源的物理目录
当静态资源请求到SpringMVC的前端控制器时,根据释放资源的配置
1、不在查找具体的controller处理
2、从location路径中查找匹配的资源
-->
<mvc:resources mapping="/js/*" location="/js/"></mvc:resources>
<mvc:resources mapping="/image/*" location="/image/"></mvc:resources>
<mvc:resources mapping="/css/*" location="/css/"></mvc:resources>
配置繁琐,所有的静态资源分门别类放置到不同的文件夹,一个一个进行配置
方式二
在Springmvc的配置文件中添加释放静态资源
<!--
统一释放所有的静态资源文件
当SpringMVC处理静态资源时,委托给默认的Servlet处理
默认Servlet:tomcat中的默认Servlet
-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
方式三
修改web.xml
中前端控制器的URL映射规则,已特殊字符串结尾的请求会交给前端控制器处理。
- 需要进入SpringMVC的所有请求,都需要已.do结尾
- 控制器方法中@RequestMapping不需要做额外的配置,和之前一模一样
Ajax+json实现异步交互
在SpringMVC中进行ajax的数据交互,需要通过两个注解简化开发
- @RequestBody : 自动的将请求的json字符串,转化为指定java对象(处理请求)
用于接收前端传递的请求体中的json数据, 并可以自动转换封装进指定的对象中
- @ResponseBody:自动的将java对象,转化为json字符串并相应(处理相应)
用于将controller方法返回的对象通过转换器转换为指定的格式(通常为json)之后,写入到response对象的body区
注意: Springmvc默认用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
Restful风格
REST是一种软件架构风格, 其强调HTTP请求的URL应当以资源为中心 ( 以后的URL中尽量不要出现动词 )
REST规范了HTTP请求动作(请求方式:post,put),使用四个词语分别表示对资源的CRUD操作:
GET(获取)、POST(新建)、PUT(更新)、DELETE(删除)
Restful :
- 针对同一个URL,根据不同的请求方式做不一样的业务处理
- 地址参数 /user/{id}
- 请求方式:GET(获取),POST(新建),PUT(更新),DELETE(删除)
原来 | Restful | |
---|---|---|
保存 | /saveUser | POST /user |
修改 | /udpateUser | PUT /user/1 |
删除 | /deleteUser?uid=1 | DELETE /user/1 |
查询所有 | /findUser | GET /user |
查询一个 | /findUserByUid?uid=1 | GET /user/1 |
异常处理机制
SpringMVC的统一异常处理
对于异常的处理一般有两种方式:
-
一种是当前方法处理(try-catch),这种处理方式会造成业务代码和异常处理代码的耦合。
-
一种是当前方法不处理, 出现异常后直接抛给调用者处理。
使用Spring框架后,我们的代码最终是由框架来调用的。也就是说,异常最终会抛到框架中, 然后由框架指定异常处理器来统一处理异常
方式一:自定义异常处理器
自定义一个类实现HandlerExceptionResolver接口,将异常处理器交给spring容器管理即可
方式二: 注解方式
可以通过@ControllerAdvice 和 @ExceptionHandler注解定义全局异常处理
使用方式:
- @ControllerAdvice:配置到java类
- 定义一个异常处理方法
- 返回值String (视图)
- 参数:Model
- 方法上通过@ExceptionHandler配置(处理的异常类型)