Spring MVC第二部分

Spring MVC第二部分回顾:任务目标一. controller向页面传递数据二. 控制器方法中使用原生API三. RESTful风格编码1. RESTful介绍2. Spring中实现RESTful风格3.具体实现3.1 web.xml添加HiddenHttpMethodFilter配置3.2 实现查,改,删 框架!3.3 使用RESTful风格 CRUD操作!四. 处理静态资源1. 修改Spring MVC对应配置文件,添加mvc命名空间和约束2. 添加处理标签五. Spring MVC的组件1. SpringMVC工作原理2. 组件回顾3. 配置HandlerAdapter 和 HandlerMapping六.返回JSON数据1. 导入对应的JSON包!2. 实现代码3. 回顾Spring MVC返回值类型七.Spring MVC异常处理1. Spring MVC异常处理介绍2. 异常处理方案2.1 DefaultHandlerExceptionResolver2.2 AnnotationMethodHandlerExceptionResolver2.3 全局异常处理八. Spring MVC拦截器实现1. 创建拦截器类2. SpringMVC 配置文件中配置拦截器九. Spring MVC处理文件上传1. 引入jar包!2. 配置MultipartResolver3. 编写控制器和文件上传表单课前默写作业面试题

回顾:

1. SpringMVC核心理论
2. SpringMVC基础配置
3. Spring常用注解
4. Spring的其他常用操作

任务

1. Controller中向页面传值的几种方式
2. Controller中使用Servlet API
3. RESTful风格编码
4. SpringMVC中处理静态资源
5. SpringMVC中的核心组件
6. SpringMVC中处理JSON
7. SpringMVC中异常处理
8. SpringMVC中拦截器
9. SpringMVC中的文件上传下载

目标

1. 掌握Controller中向页面传值的几种方式
2. 掌握Controller中使用Servlet API
3. 掌握RESTful风格编码
4. 掌握SpringMVC中处理静态资源
5. 掌握SpringMVC中的核心组件
6. 掌握SpringMVC中处理JSON
7. 掌握SpringMVC中异常处理
8. 掌握SpringMVC中拦截器
9. 掌握SpringMVC中的文件上传下载

一. controller向页面传递数据

实现方案三种:

第一种: ModelAndView

第二种: Map

第三种: Model

第一种:

java代码:

 

页面显示代码:

/WEB-INF/user/form.jsp

直接使用el表达式!

 

第二种

Java代码:

 

方法中添加 map参数, 往map中放置数据,就可以发送到jsp页面!

显示代码如上!

第三种

将map替换成model即可!

java代码:

 

总结: 使用以上三种情况可以将数据返回给页面,页面使用EL表达式即可获取!但是要注意!数据放入的是requestScope域!其他域获取不到!

验证代码:

 

如果需要将在sessionScope赋值一份!可以利用@SessionAttributes属性!

 

二. 控制器方法中使用原生API

如果我们需要使用Servlet内部常用类:

直接在Controller层的方法中传入对应参数即可!不分顺序!

注意:如果使用maven项目 需要导入 jsp jstl servlet api

 

Java代码示例:

 

三. RESTful风格编码

1. RESTful介绍

REST:即Representational State Transfer , (资源)表现层状态转化,是目前最流行的一种互联网软件架构。它结构清晰、符合标注、易于理解、方便扩展,所以越来越多的网站采用!

具体说,就是HTTP协议里面,四个表示操作方式的动词:

GET POST PUT DELETE

它们分别代表着四种基本操作:

示例:

2. Spring中实现RESTful风格

HiddenHttpMethodFilter:浏览器form表单只支持GET和POST,不支持DELETE和PUT请求,Spring添加了一个过滤器,可以将这些请求转换为标准的http方法,支持GET,POST,DELETE,PUT请求!

3.具体实现
3.1 web.xml添加HiddenHttpMethodFilter配置
 

3.2 实现查,改,删 框架!
 

Jsp代码:

 

需要注意: 由于doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须如下设置:

 

代表post请求,但是HiddenHttpMethodFilter将把本次请求转化成标准的put请求方式! name="_method"固定写法!

测试: 查看方法可以调通即可!

3.3 使用RESTful风格 CRUD操作!
  1. 添加Order Pojo类!
 

  1. 添加OrderDao
 

  1. 修改list.jsp
 

  1. 完善Controller

    因为练习省略了业务层!直接在Controller层进行调用

 

四. 处理静态资源

需要注意一种,DispatcherServlet拦截资源设置成了 / 避免了死循环,但是 / 不拦截jsp资源,但是它会拦截其他静态资源,例如 html , js , 图片等等, 那么我们在使用jsp内部添加 静态资源就无法成功,所以,我们需要单独处理下静态资源!

处理方案: 在springmvc的配置文件中添加mvc命名空间下的标签!

1. 修改Spring MVC对应配置文件,添加mvc命名空间和约束
 
2. 添加处理标签
 

配置解释: 将静态资源(图片,css,js,html)放入了webApp/static文件夹下! 直接访问DispatcherServlet会拦截出现404问题!

location元素表示webapp目录下的static包下的所有文件;

mapping元素表示将 location对应文件加下的资源对应到 /static路径下!

该配置的作用是:DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源

交由Servlet处理

五. Spring MVC的组件

1. SpringMVC工作原理

springmvc支持流程图

2. 组件回顾

注意:但是我们之前编写代码只添加了DispatcherServlet和ViewResolver,但是没有涉及到HandlerMapping和HandlerAdapter!因为DispatcherServlet默认已经配置了HandlerMapping和HandlerAdapter!所以,我们没有自己定义HandlerMapping和HandlerAdapter!当然我们也可以进行自定义,本章节主要讲解自定义ViewResolver,HandlerMapping和HandlerAdapter。

查看DispatcherServlet的默认配置

文件位置: org/springframework/web/servlet/DispatcherServlet.properties

 

3. 配置HandlerAdapter 和 HandlerMapping

配置 RequestMappingHandlerAdapter 和 RequestMappingHandlerMpping

文件上传,返回JSON需要依赖以上适配器和映射器!

配置

 

解释: 默认对应的处理类是 org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser ;

 

六.返回JSON数据

访问控制器返回Json类型数据!

1. 导入对应的JSON包!

支持:

jackson : jackson-databind/jackson-annotations/jack-core

gson: gson

注意: jackson需要三个jar包!如果使用maven引入jackson-databind会连带引入 core和annotations。

如果非maven项目,必须加入三个jar包!

 

或者:

 

2. 实现代码

主要使用@ResponseBody

 

3. 回顾Spring MVC返回值类型

七.Spring MVC异常处理

1. Spring MVC异常处理介绍

Spring MVC通过HandlerExceptionResolver处理程序的异常,包括处理映射,数据绑定及处理器执行时发生异常。HandlerExceptionResolver仅有一个接口方法:

ModelAndView resolveException(HttpServletRequest reqeust,HttpServletResponse response,Object handler,Exception ex);

当发生异常时,Spring MVC将调用 resolveException()方法,并转到ModelAndView对应视图中,作为一个异常报告页面,反馈给用户!

HandlerExceptionResolver拥有4个实现类:

2. 异常处理方案
2.1 DefaultHandlerExceptionResolver

​ Spring MVC默认装配了DefaultHandlerExceptionResolver,它会将Spring MVC框架的异常转换为相应的相应状态码!

异常和相应状态码对应表

异常类型响应状态码
ConversionNotSupportedException500(Web服务器内部错误)
HttpMediaTypeNotAcceptableException406(无和请求accept匹配的MIME类型)
HttpMediaTypeNotSupportedException415(不支持MIME类型)
HttpMessageNotReadableException400
HttpMessageNotWritableException500
HttpRequestMethodNotSupportedException405
MissingServletRequestParameterException400

在web.xml响应状态码配置一个对应页面

 

注意: 静态资源注意会被DispatcherServlet拦截!

2.2 AnnotationMethodHandlerExceptionResolver

Spring MVC 默认注册了 AnnotationMethodHandlerExceptionResolver,它允许通过@ExceptionHandler注解指定处理特定异常的方法!

 

通过@ExceptionHandler指定了当前类的一个错误处理方法!如果当前类中出现异常,会触发错误处理方法!

但是@ExceptionHandler的异常处理方法只能对同一处理类中的其他处理方法进行异常响应处理!!

2.3 全局异常处理
 

此处可以捕捉全局异常,但是不要忘了在spring配置的时候扫描该类!

八. Spring MVC拦截器实现

springmvc拦截器

Spring MVC 的拦截器类似于Servlet中的拦截器!需要先定义一个类实现HandlerInterceptor接口!

添加未实现的方法,在springmvc配置中配置!具体实现步骤如下:

1. 创建拦截器类
 
2. SpringMVC 配置文件中配置拦截器
 

九. Spring MVC处理文件上传

Spring MVC为文件上传提供了直接支持,这种支持是通过即插即用的MultipartResolver实现. Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。

在SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要先在上下文中配置MultipartResolver。

1. 引入jar包!

commons-fileupload.jar

commons-io.jar

maven项目pom.xml

 
2. 配置MultipartResolver

配置

 

3. 编写控制器和文件上传表单
 

 

​ SpringMVC会将上传文件绑定到MultipartFile对象上. MultipartFile提供了获取长传文件内容,文件名等方法,通过transferTo()方法还可将文件存储到磁盘中,具体方法如下:


方法名称方法解释
byte [] getBytes()获取文件数据
String getContentType()获取文件MIMETYPE类型,如image/jpeg,text/plain等
InputStream getInputStream()获取文件输入流
String getName()获取表单中文件组件的名称 name值!
String getOriginalFilename()获取文件上传的原名
long getSize()获取文件的字节大小,单位为byte
boolean isEmpty()是否有长传的文件
void transferTo(File dest)可以将上传的文件保存到指定的文件中

课前默写

1. SpringMVC基础配置
2. 使用SpringMVC框架进行基础的页面操作 

作业

1. 扩展作业的作业内容
2. 添加登录功能,并使用拦截器实现未登录拦截
3. 在员工表里添加员工照片(photo)字段,并实现其上传下载功能
4. 完成异常的处理

面试题

1. 简述Controller中向页面传值的几种方式
2. 简述SpringMVC中RESTful的应用
3. 简述SpringMVC中处理静态资源的方案
4. 简述SpringMVC中的HandlerMapping和HandlerAdapter的作用
5. 简述SpringMVC中JSON的处理方式
6. 简述SpringMVC中异常处理
7. 简述SpringMVC中拦截器的使用
8. 简述SpringMVC中如何进行文件上传下载