1. 响应数据和结果视图
1.1 返回值分类
1.1.1 void
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
默认会跳转到@RequestMapping(value=”/testVoid”) testVoid的页面。
可以使用请求转发或者重定向跳转到指定的页面
1 | /** |
1.1.2 字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
1 | /** |
1.1.3 ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
该对象中有两个方法:
示例代码:
1 | /** |
JSP:
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> |
1.2 转发和重定向
1.2.1 forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
1 | /** |
需要注意的是,如果用了 formward :则路径必须写成实际视图 url,不能写逻辑视图。
它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
1.2.2 Redirect 重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用redirect:
1 | /** |
它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
1.3 @ResponseBody 响应 json 数据
1.3.1 <mvc:resources/>
DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置
1 | <!--前端控制器,哪些静态资源不拦截 |
1.3.2 @RequestBody获取请求体数据
JSP:
1 | <head> |
控制器:
1 | /** |
1.3.3 json 字符串转换成JavaBean 对象
1 | /** |
1.3.4 @ResponseBody响应JSON数据
1 | /** |
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包:
1 | <dependency> |
2. SpringMVC实现文件上传
2.1 文件上传的回顾
2.1.1 文件上传的必要前提
1 | form 表单的 enctype 取值必须是:multipart/form-data |
2.1.2 文件上传的原理分析
1 | 当 form 表单的 enctype 取值不是默认值后,request.getParameter()将失效。 |
2.1.3 文件上传
2.1.3.1 导jar包
1 | <dependency> |
2.1.3.2 编写文件上传的JSP页面
1 | <h3>传统文件上传</h3> |
2.1.3.3 Controller控制器
1 | /** |
2.2 SpringMVC文件上传
SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的 name属性名称相同。
2.2.1 导jar包
1 | <dependency> |
2.2.2 编写文件上传的JSP页面
1 | <h3>Springmvc文件上传</h3> |
2.2.3 Controller控制器
1 | /** |
2.2.4 配置文件解析器对象
1 | <!--配置文件解析器对象--> |
2.3 SpringMVC跨服务器方式文件上传
2.3.1 分服务器的目的
1 | 在实际开发中,我们会有很多处理不同功能的服务器。例如: |
(注意:此处说的不是服务器集群)
分服务器处理的目的是让服务器各司其职,从而提高我们项目
2.3.2 搭建图片服务器
配置端口不同的Tomcat项目
2.3.3 实现SpringMVC跨服务器方式文件上传
2.3.3.1 导jar包
1 | <dependency> |
2.3.3.2 编写文件上传的JSP页面
1 | <h3>跨服务器文件上传</h3> |
2.3.3.3 Controller控制器
1 | /** |
2.3.3.4 配置文件解析器对象
1 | <!--配置文件解析器对象--> |
3. SpringMVC的异常处理
3.1 异常处理思路
系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理,如下图:
3.2 SpringMVC的异常处理
3.2.1 自定义异常类
1 | /** |
3.2.2 控制器
1 | /** |
3.2.3 自定义异常处理器
1 | /** |
3.2.4 配置异常处理器
1 | <!--配置异常处理器--> |
4. SpringMVC框架中的拦截器
4.1 拦截器的概述
SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
拦截器和过滤器的功能比较类似,有区别
- 过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。
- 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
- 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
- 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。
拦截器也是AOP思想的一种实现方式。
想要自定义拦截器,需要实现HandlerInterceptor接口。
4.2 自定义拦截器步骤
4.2.1 实现HandlerInterceptor接口
1 | /** |
4.2.2 配置拦截器
1 | <!--配置拦截器--> |
4.2.3 运行结果
4.3 拦截器的细节
4.3.1 HandlerInterceptor接口中的方法
preHandle方法是controller方法执行前拦截的方法
- 可以使用request或者response跳转到指定的页面
- return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
- return false不放行,不会执行controller中的方法。
postHandle是controller方法执行后执行的方法,在JSP视图执行前。
- 可以使用request或者response跳转到指定的页面
- 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
postHandle方法是在JSP执行后执行
- request或者response不能再跳转页面了
4.3.2 多个拦截器的执行顺序
多个拦截器是按照配置的顺序决定的。先进后出
1 | <!--配置拦截器--> |
-------------本文结束感谢您的阅读-------------
本文标题: SpringMVC(二)
本文链接: https://wgy1993.gitee.io/archives/ea517149.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
