前端AjaxJSHTML+后端SpringMVC(二)

前端AjaxJSHTML+后端SpringMVC(二),第1张

概述1. jQuery AJAX 1.1. jQuery框架中的ajax()函数 在应用了jQuery框架后,调用ajax()函数即可发出AJAX请求,并获取响应结果,该函数的参数必须是JSON对象,通常,在JSON对象中封装的属性有: url:处理请求的URL,也可以理解为将请求发送到哪个URL,取值可以是绝对路径,或相对路径,但是,不可以跨域 data:请求的数据,通常是username=xx&p 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 >    <!-- 异常与转发到的视图的映射 -->    <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作为方法的参数:

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

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

@ExceptionHandlerpublic 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)    @ResponseBody    public 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

总结

以上是内存溢出为你收集整理的前端Ajax/JS/HTML+后端SpringMVC(二)全部内容,希望文章能够帮你解决前端Ajax/JS/HTML+后端SpringMVC(二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存