PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return

Similar documents
本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

"+handlermethod.getbean().getclass().getname()); public void aftercompletion(httpservletrequest req, HttpServletResponse resp, Object handler, Excepti

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

EJB-Programming-4-cn.doc

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

EJB-Programming-3.PDF

使用Cassandra和Spark 2.0实现Rest API服务

IoC容器和Dependency Injection模式.doc

Microsoft Word - 01.DOC

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

在Spring中使用Kafka:Producer篇

Microsoft Word - PHP7Ch01.docx

untitled

概述

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

RxJava

拦截器(Interceptor)的学习

Microsoft Word - Learn Objective-C.doc

1.2. Sql 映射配置 小风 Java 实战系列教程 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" "

Chapter 9: Objects and Classes

设计模式 Design Patterns

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Guava学习之Resources

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

untitled

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

D C 93 2

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

通过Hive将数据写入到ElasticSearch

2.4 Selenium Python Selenium Selenium Selenium Selenium pip install selenium Chrome WebDriver Google Chrome (Linux, Mac, Windows) Chrome WebDriv

untitled

untitled

Servlet

TopTest_Adminstrator.doc

Microsoft Word - json入门.doc

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

untitled

nb.PDF

《大话设计模式》第一章

第一章

投影片 1

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

電機工程系認可證照清單 /7/1

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt

基于ECO的UML模型驱动的数据库应用开发1.doc

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

基于CDIO一体化理念的课程教学大纲设计

使用MapReduce读取XML文件

设计模式 Design Patterns

PowerPoint 簡報

ex

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

Microsoft Word - ch04三校.doc

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

RUN_PC連載_10_.doc

1.5招募说明书(草案)

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

JBuilder Weblogic

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

OSWorkflow Documentation

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

Partition Key: 字 符 串 类 型, 表 示 当 前 Entity 的 分 区 信 息 这 个 Property 对 于 Table Service 自 动 纵 向 和 横 向 扩 展 至 关 重 要 Row Key: 字 符 串 类 型, 在 给 定 Partition Key 的

untitled

目 录 编 写 说 明 一 学 校 概 况 二 2015 届 毕 业 生 就 业 状 况 分 析 ( 一 ) 基 本 数 据 ( 二 ) 就 业 落 实 情 况 本 科 生 各 专 业 就 业 率 硕

Microsoft Word - 会议指南


HR之友电子期刊

Microsoft Word - 封面.doc

untitled

關於本書 Part 3 CSS XHTML Ajax Part 4 HTML 5 API JavaScript HTML 5 API Canvas API ( ) Video/Audio API ( ) Drag and Drop API ( ) Geolocation API ( ) Part 5

RUN_PC連載_8_.doc


BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

在 ongodb 中实现强事务

關於本書 l 3 PhoneGap Appcelerator Titanium Sencha Touch (wrapper framework) Native App PhoneGap Build Native App Hybrid App Java Objective-C Android SDK

J2EE MVC with Webwork2 Xwork, to J2EE MVC with Webwork2 Xwork

jdbc:hsqldb:hsql: jdbc:hsqldb:hsqls: jdbc:hsqldb:http: jdbc:hsqldb:https: //localhost // :9500 / /dbserver.somedomain.com /an_alias /enrollme

Struts2自定义类型转换.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

建立Android新專案

3.1 num = 3 ch = 'C' 2

Stateless Session Beans(无状态bean)的学习

Chapter 9: Objects and Classes

untitled

1.1 Filter 的特性 请求映射 filter-mapping 和 servlet-mapping 都是将对应的 filter 或 servlet 映射到某 个 url-pattern 上, 当客户发起某一请求时, 服务器先将此请求与 web.xml 中定 义的所有 url-pat

PowerPoint Presentation

untitled

Microsoft Word - 最新正文.doc

Transcription:

本章学习目标 小风 Java 实战系列教程 SpringMVC 异常处理 SpringMVC 文件上传 SpringMVC 处理 JSON 格式数据 SpringMVC 拦截器 SpringMVC 对 restful 风格的支持 1. SpringMVC 异常处理 1.1. @ExceptionHandler 注解处理异常 @ExceptionHandler 该注解使用在异常处理方法上面 1.1.1. 直接在 Controller 类里面使用 @Controller @RequestMapping("/exception") public class ExceptionController { /** * 异常处理方法 * value: 该异常方法可以处理的异常类型 * @return */ @ExceptionHandler(value={java.lang.NullPointerException.class) public ModelAndView exceptionhandler(exception ex){ ModelAndView mv = new ModelAndView(); StringWriter writer = new StringWriter();

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return mv; @RequestMapping("/test1") public String test1(){ System.out.println("ExceptionController 的 test1"); // 模拟异常 String name = null; //java.lang.nullpointerexception name.substring(0); return "success"; 1.1.2. 单独编写独立类使用 @ControllerAdvice public class MyExcptionHandler { /** * 异常处理方法 * value: 该异常方法可以处理的异常类型 * @return */ @ExceptionHandler(value={java.lang.NullPointerException.class)

public ModelAndView exceptionhandler(exception ex){ ModelAndView mv = new ModelAndView(); StringWriter writer = new StringWriter(); PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return mv; 1.2. SimpleMappingExceptionResolver 处理异常 好处 : 可以通过配置文件的方式处理不同的异常 1.2.1. 配置 spring-mvc.xml <!-- SimpleMappingExceptionResolver 配置 --> <bean class="org.springframework.web.servlet.handler.simplemappingexceptionre solver"> <!-- 支持异常列表 --> <property name="exceptionmappings"> <props> <prop key="java.lang.arithmeticexception">error</prop> </props> </property>

</bean> <!-- 默认就会把异常信息封装到 exception 名称属性 --> 1.3. HandlerExceptionResolver 处理异常 1.3.1. 需要编写一个自定义异常类 /** * 自定义异常类 * @author lenovo * */ public class MyHandlerExeptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveexception(httpservletrequest request, HttpServletResponse response, Object arg2, Exception ex) { // 取出异常栈信息 StringWriter writer = new StringWriter(); PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); ModelAndView mv = new ModelAndView(); mv.addobject("ex", writer.tostring()); mv.setviewname("error"); return mv;

1.3.2. 配置 spring-mvc.xml <bean class="cn.sm1234.exception.myhandlerexeptionresolver"/> 2. SpringMVC 文件上传 2.1. 导入文件上传的支持 jar 包 2.2. 页面 <form action="${pagecontext.request.contextpath /upload/test1.action" method="post" enctype="multipart/form-data"> 用户名 :<input type="text" name="username"/><br/> 密码 :<input type="password" name="userpass"/><br/> 头像 :<input type="file" name="headicon"/><br/> <input type="submit" value=" 保存 "/> </form> 2.3. Controller @Controller @RequestMapping("/uplad") public class UploadController {

@RequestMapping("test1") public String test1(httpservletrequest request,user user,multipartfile headicon) throws Exception{ System.out.println(user.getUserName()); System.out.println(user.getUserPass()); // 保存文件 String uploadpath = request.getservletcontext().getrealpath("/upload"); headicon.transferto(new File(uploadPath+"/"+headIcon.getOriginalFilename())); return "success"; 2.4. 配置 spring-mvc.xml <!-- 处理文件上传 --> <bean id="multipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresolv er"> </bean> 注意 :id 必须为 multipartresolver

3. SpringMVC 处理 json 数据 小风 Java 实战系列教程 3.1. 页面 <script type="text/javascript"> $(function(){ $("#putandgetjson").click(function(){ // 发出一个请求, 请头中携带 json 格式数据 $.ajax({ url:"json/test1.action", data:'{"username":"jack","userpass":"123456"', contenttype:"application/json", type:"post", success:function(data){ // data: 服务端返回的数据 alert(json.stringify(data));, datatype:"json" ); ); ); </script> 3.2. Controller @Controller @RequestMapping("/json")

public class JsonController { //@RequestBody: 代表接收页面的 json 数据 //@ResponseBody: 代表 Controller 返回 json 数据 @RequestMapping("/test1") @ResponseBody public User test1(@requestbody User user){ return user; 这时导入 jackson 的插件, 才可以 json 转换为 JavaBean( 或 JavaBean 转换为 json) 4. SpringMVC 拦截器 拦截器的作用? 拦截器可以实现在 Controller 的方法执行的之前和之后加入业务逻辑 ( 例如, 权限判断逻辑, 记录日志等 ) 4.1. 目标 Controller 方法 @Controller @RequestMapping("/interceptor") public class InterceptorController {

@RequestMapping("/test1") public String test1(){ System.out.println("InterceptorController 的 test1 方法 "); return "success"; 4.2. 编写一个 SpringMVC 拦截器 public class MyInterceptor1 implements HandlerInterceptor{ // 在 Controller 方法完成之后被执行 @Override public void aftercompletion(httpservletrequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println(" 执行 MyInterceptor1 的 aftercompletion"); // 在 Controller 方法执行之后被执行 @Override public void posthandle(httpservletrequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println(" 执行 MyInterceptor1 的 posthandle"); // 在 Controller 方法执行之前被执行 /**

* 该方法的返回值, 代表是否继续执行 Controller 方法 * true: 继续执行 * false: 不执行 */ @Override public boolean prehandle(httpservletrequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println(" 执行 MyInterceptor1 的 prehandle"); return true; 4.3. 配置 spring-mvc.xml <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截的路径 --> <mvc:mapping path="/interceptor/test1.action"/> <bean class="cn.sm1234.interceptor.myinterceptor1"></bean> </mvc:interceptor> </mvc:interceptors> 4.4. 执行效果 执行 MyInterceptor1 的 prehandle InterceptorController 的 test1 方法

执行 MyInterceptor1 的 posthandle 执行 MyInterceptor1 的 aftercompletion 4.5. 如果有多个拦截器, 配置如下 : <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截的路径注意 : path 路径必须是完整的路径 ( 包括后缀名称 ) --> <mvc:mapping path="/interceptor/test1.action"/> <bean class="cn.sm1234.interceptor.myinterceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/interceptor/test1.action"/> <bean class="cn.sm1234.interceptor.myinterceptor2"></bean> </mvc:interceptor> </mvc:interceptors> 那么多个拦截器和 Controller 执行顺序 : 执行 MyInterceptor1 的 prehandle 执行 MyInterceptor2 的 prehandle InterceptorController 的 test1 方法执行 MyInterceptor2 的 posthandle 执行 MyInterceptor1 的 posthandle 执行 MyInterceptor2 的 aftercompletion 执行 MyInterceptor1 的 aftercompletion

5. SpringMVC 对 restful 风格的支持 小风 Java 实战系列教程 5.1. 什么是 restful? Restful 风格的 API 是一种软件架构风格, 设计风格而不是标准, 只是提供了一组 设计原则和约束条件 它主要用于客户端和服务器交互类的软件 基于这个风格 设计的软件可以更简洁, 更有层次, 更易于实现缓存等机制 在 Restful 风格中, 用户请求的 url 使用同一个 url 而用请求方式 :get,post,delete, put... 等方式对请求的处理方法进行区分, 这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦, 形成一个统一的接口 在 Restful 风格中, 现有规定如下 : GET(SELECT): 从服务器查询, 可以在服务器通过请求的参数区分查询的方式 POST(CREATE): 在服务器新建一个资源, 调用 insert 操作 PUT(UPDATE): 在服务器更新资源, 调用 update 操作 DELETE(DELETE): 从服务器删除资源, 调用 delete 语句 了解这个风格定义以后, 我们举个例子 : 如果当前 url 是 http://localhost:8080/user 那么用户只要请求这样同一个 URL 就可以实现不同的增删改查操作, 例如 http://localhost:8080/user?_method=get&id=1001 这样就可以通过 get 请求获 取到数据库 user 表里面 id=1001 的用户信息 http://localhost:8080/user?_method=post&id=1001&name=zhangsan 这样可

以向数据库 user 表里面插入一条记录 小风 Java 实战系列教程 http://localhost:8080/user?_method=put&id=1001&name=lisi 这样可以将 user 表里面 id=1001 的用户名改为 lisi http://localhost:8080/user?_method=delete&id=1001 这样用于将数据库 user 表里面的 id=1001 的信息删除 这样定义的规范我们就可以称之为 restful 风格的 API 接口, 我们可以通过同一个 url 来实现各种操作 5.2. SpringMVC 对 restful 风格的支持 5.2.1. 配置 restful 风格支持过滤器 org.springframework.web.filter.hiddenhttpmethodfilter 在 web.xml 配置这个过滤器 : <!-- restful 风格支持的过滤器 : 把 POST 请求转为指定请求方式 (PUT,DELETE 等 ) --> <filter> <filter-name>hiddenhttpmethodfilter</filter-name> <filter-class>org.springframework.web.filter.hiddenhttpmethodfilter< /filter-class> </filter> <filter-mapping> <filter-name>hiddenhttpmethodfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

5.2.2. 页面 小风 Java 实战系列教程 <h3> 查询操作 </h3> <form action="${pagecontext.request.contextpath/restful.action" method="get"> <input type="submit" value=" 提交 "/> </form> <hr/> <h3> 新增操作 </h3> <form action="${pagecontext.request.contextpath/restful.action" method="post"> 用户名 :<input type="text" name="username"/><br/> 密码 :<input type="password" name="userpass"/><br/> <input type="submit" value=" 提交 "/> </form> <h3> 更新操作 </h3> <form action="${pagecontext.request.contextpath/restful.action" method="post"> <input type="hidden" name="_method" value="put"> <input type="hidden" name="userid" value="1"> 用户名 :<input type="text" name="username"/><br/> 密码 :<input type="password" name="userpass"/><br/> <input type="submit" value=" 提交 "/> </form> <h3> 删除操作 </h3>

<form action="${pagecontext.request.contextpath/restful/1.action" method="post"> <input type="hidden" name="_method" value="delete"> <input type="submit" value=" 提交 "/> </form> </body> 5.2.3. Controller @Controller @RequestMapping("/restful") public class RestfulController { /** * 查询操作 */ @RequestMapping(method=RequestMethod.GET) public String testget(){ System.out.println(" 执行 RestfulController 的 testget"); return "success"; /** * 新增操作 */ @RequestMapping(method=RequestMethod.POST) public String testpost(user user){ System.out.println(" 执行 RestfulController 的 testpost"); System.out.println(user);

return "success"; /** * 更新操作 */ @RequestMapping(method=RequestMethod.PUT) public String testput(user user){ System.out.println(" 执行 RestfulController 的 testput"); System.out.println(user); return "success"; /** * 删除操作 */ @RequestMapping(value="/{id",method=RequestMethod.DELETE) public String testdelete(@pathvariable("id")integer id){ System.out.println(" 执行 RestfulController 的 testdelete"); System.out.println(id); return "success";