1. jQuery AJAX

1.1. jQuery框架中的ajax()函数

在应用了jQuery框架后,调用ajax()函数即可发出AJAX请求,并获取响应结果,该函数的参数必须是JSON对象,通常,在JSON对象中封装的属性有:

  • url:处理请求的URL,也可以理解为将请求发送到哪个URL,取值可以是绝对路径,或相对路径,但是,不可以跨域

  • data:请求的数据,通常是username=xx&password=xx&phone=xx类似的格式,可以通过字符串拼接得到该值,也可以通过jQuery中的$("#form-id").serialize()函数将整个表单中所有控件的值都封装起来,使用这个函数时,是以控件的名称与控件中的值进行封装的,所以,需要注意各控件的名称

  • type:请求的类型,可以是getpost

  • dataType:响应的数据的类型,可以是textxmljson,主流做法多使用json,但是,具体使用哪一种,取决于服务器响应时给出的Response Headers中的Content-Type

  • beforeSend:发出请求之前如何处理,取值是函数,用于决于具体执行的代码,多用于例如:将发出请求的按钮禁用,以避免在没有响应之前却反复提交请求

  • success:成功响应后如何处理,取值是函数,success对应的函数只在正确的响应情况下被执行,如果服务端的响应码是302、4xx、5xx,并不会导致success对应的函数被执行!该处理函数可以添加参数,参数即是服务端响应的数据,如果dataType已经设置为json,则此处的函数参数类型就是JSON对象

  • error:响应出错如何处理,取值是函数,只要响应码是3xx、4xx、5xx,都会导致error对应的函数被执行!

2. 异常的处理

2.1. 设计案例

创建简单的案例,发出/test/null.do请求,服务端将产生NullPointerException,发出/test/array.do请求,服务端将产生ArrayIndexOutOfBoundsException

2.2. 创建并完成案例

创建Maven Project,Group Id使用com.company.spring,Artifact Id使用SPRINGMVC-04-EXCEPTION

检查spring-mvc.xml的配置,在组件扫描的包下创建TestController,使用@Controller@RequestMapping("/test")注解:

@Controller
@RequestMapping("/test")
public class TestController {
}

然后添加2个方法处理2个请求,并在处理过程中,使得程序出现对应的异常:

@RequestMapping("/null.do")
public String handleNull() {String str = null;str.length();return null;
}@RequestMapping("/array.do")
public String handleArray() {int[] arr = { 0 };System.out.println(arr[10]);return null;
}

2.3. 【不推荐】使用SimpleMappingExceptionResolver

如果没有对异常进行处理,默认的处理方式下,会把异常的跟踪信息显示在页面中,这种做法会导致较差的用户体验,并且可能对外泄露了当前的业务逻辑甚至是项目机密。但是,频繁的使用try...catch语法来处理异常,则很大程度上增加了编码的难度,也不易于统一规划和处理!

SpringMVC中提供了SimpleMappingExceptionResolver,可以配置异常与转发到的视图的对应关系,也就是说:只要出现了某种异常,就直接转发到某个视图,而不需要编写try...catch相关代码:

<!-- 处理异常 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 异常与转发到的视图的映射 --><property name="exceptionMappings"><props><prop key="java.lang.NullPointerException">error_null</prop><prop key="java.lang.ArrayIndexOutOfBoundsException">error_array</prop></props></property>
</bean>

使用这种做法最大的问题:无法针对某个问题进行详细的处理!也无法将具体的错误信息显示在页面中!

2.4. 【推荐】使用@ExceptionHandler

在控制器类中自定义某个方法,用于统一处理异常,这个方法需要使用@ExceptionHandler注解,并且,可以使用Exception作为方法的参数:

@ExceptionHandler
public String handleException(Exception e) {return null;
}

每当出现异常时,SpringMVC就会自动调用以上方法,并且将捕获的异常对象作为调用该方法的参数,则处理时:

@ExceptionHandler
public String handleException(Exception e, HttpServletRequest request) {String message = e.getMessage();if (e instanceof ArrayIndexOutOfBoundsException) {request.setAttribute("msg", message);return "err_array";}return null;
}

注意:尝试转发数据时,可以使用HttpServletRequest参数,也可以使用ModelAndView返回值,却不可以使用ModelMap参数。

2.5. Q&A

Q:使用@ExceptionHandler和配置SimpleMappingExceptionResolver这2个做法来处理异常会冲突吗?

A:两者同时使用,代码并不会出现错误,但是,对于同一个异常,注解方式优先。

Q:使用@ExceptionHandler这种方式处理异常时,可以不使用转发作为处理方式,而是直接响应JSON数据吗?

A:可以!在处理异常的方法之前添加@ResponseBody注解,并且将方法的返回值调整为ResponseResult即可(需要事先添加Jackson依赖,配置注解驱动)

Q:使用@ExceptionHandler这种方式处理异常时,处理异常的方法可以作用于其它控制器类中处理请求方法吗?

A:不可以!常规做法是定义BaseController类,在这个类中添加处理异常的方法,然后,项目中所有其它的控制器类都继承自这个类!例如:

public abstract class BaseController {@ExceptionHandler(ServiceException.class)@ResponseBodypublic ResponseResult handleException(ServiceException e) {// 准备返回值ResponseResult rr = new ResponseResult();// 向返回结果中封装错误信息rr.setMessage(e.getMessage());// 判断异常if (e instanceof UserNotFoundException) {rr.setState(401);} else if (e instanceof PasswordNotMatchException) {rr.setState(402);} else if (e instanceof UpdateException) {rr.setState(500);} else {rr.setState(600);}// 返回return rr;}}

2.6. 小结

在开发项目时,业务层会在出现各种业务错误的情况下抛出不同的业务异常,例如此前项目中的UserNotFoundExceptionPasswordNotMatchException……而控制器层调用业务层的方法时,就需要处理这些异常,而某些异常出现的次数可能较多,反复的使用try...catch不便于统一处理,代码也显得非常复杂!

SpringMVC提供的统一处理异常的方式有2种,分别是使用SimpleMappingExceptionResolver和使用@ExceptionHandler注解,前者在处理方面非常有局限性!一般对于业务异常的处理,推荐使用后者!

关于业务异常的处理,通常会在项目中创建BaseController,然后在这个类中编写处理异常的方法,项目中实际使用的其它控制器类都应该继承自BaseController

转载于:https://www.cnblogs.com/wood-life/p/10291162.html

前端Ajax/JS/HTML+后端SpringMVC(二)相关推荐

  1. Web前端-Vue.js必备框架(二)

    Web前端-Vue.js必备框架(二) vue调式工具vue-devtools 过滤器:vue.js允许你自定义过滤器,可被用作一些常见的文本格式化. mustache插值和v-bind表达式. vu ...

  2. ajax前端传数组后端接收,前端AJAX传递数组给Springmvc接收处理

    前端传递数组后端(Spring)来接收并处理: 测试页面 function ccc() { var btn = document.getElementById("btn"); $. ...

  3. 百万前端之js通过链接生成二维码可以保存下载复制

    在前端工作中,会遇到很多邀请好友的需求,这个时候就需要前端对需求进行实现了. 最终效果: 这个是做好以后的成品,根据链接生成二维码,提供保存二维码和复制链接功能,纯前端实现.话不多说直接上代码 htm ...

  4. thinkphp 前端页面js接收后端传过来的数据

    后端接口: 前端页面:

  5. ajax (阿贾克斯)----------- js 向后端索要数据的方式(技术)

    ajax  + js 向后端索要数据的方式(技术) 基本步骤 1. 创建ajax 对象 const xhr = new XMLHttpRequest() 2. 配置本次的请求信息 xhr.open(请 ...

  6. springmvc二十:数据绑定

    数据绑定思想和原理 javaBean要和页面提交的数据一一绑定. 页面提交的所有数据都是字符串. 牵扯到的问题: 1).数据绑定期间的数据类型转换?   比如 String-->Integer, ...

  7. 从前端Vue/Axios到后端交互--浅谈Vue生命周期、Ajax调用

    一.基本需求 介绍: 此项目实现了对数据库数据的增删查改,后端使用Spring+MyBatis+SpringMVC,前端使用了Vue+JavaScript+AJAX,前后端实现了异步交互,前端页面可以 ...

  8. 014-Axios Ajax:前后端分离概述,发送json类型的参数,前后端分离开发:在线接口文档,前端工程化、Element、nginx

    第一节 Ajax概述 1.概述 概念: Asynchronous JavaScript And XML,异步的JavaScript和XML. 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取 ...

  9. 使用layui在前端接收后端的图片流来显示二维码,在前端使用iframe接收后端流来预览pdf

    消息弹框的形式 因为我是在生成二维码之后,用zxing的工具类输出的流 所以这里介绍一下我用到的工具类的依赖 gradle // https://mvnrepository.com/artifact/ ...

最新文章

  1. linux7设置时间,CentOS 7 设置日期和时间
  2. CRC原理及其逆向分析方法
  3. html自定义radio样式,用纯CSS 自定义radio checkbox 样式
  4. Android零基础入门第20节:CheckBox和RadioButton使用大全
  5. GC的作用域,方法区和堆
  6. 【转】如何修改IIS的默认端口号
  7. UVa 10570 - Meeting with Aliens
  8. std::set, std::list, std::vector在erase的区别
  9. 源码安装MySQL5.5.20
  10. RestSharp解决Encoding乱码问题
  11. 2019年上半年英语四、六级成绩查询方式和时间
  12. Rust权威指南 全书笔记
  13. win7计算机搜索功能没有了,win7搜索功能不能用了怎么办|win7搜索功能不见了怎么解决? - 学无忧...
  14. KiCad 泪滴插件 teardrop plugin
  15. 如何将夜晚图片转化为白天图片 matlab,教你简单几步将白天图片转换成夜景图_资源库...
  16. C++中的TEXT函数
  17. 生产环境LVM卷ext4文件系统故障修复处理
  18. RPG游戏人物视角控制,相机跟随
  19. 电影魔术|改变世界?乔布斯可不仅仅用苹果
  20. 【音视频开发】音频相关概念 - 总结

热门文章

  1. HH SaaS电商系统的商品类目设计
  2. Properties常用方法
  3. android root权限函数,android 4.4下app永久获取root权限的方法
  4. 手机流量共享 linux,linux – 通过HTB共享带宽和优先处理实时流量,哪种方案更好?...
  5. python中可用于布尔测试的,如何在Python中使用布尔值?
  6. git.exe 启动 慢_四川成都surface电脑启动到一半黑屏维修服务地址电话
  7. python发送邮件outlook_通过Python发送Outlook电子邮件?
  8. 学习C ,常见的误解
  9. matplotlib的默认字体_浅谈matplotlib默认字体设置探索
  10. td 字典表_数据库怎么设计字典表