前端Ajax/JS/HTML+后端SpringMVC(二)

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)
    @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

原文地址:https://www.cnblogs.com/wood-life/p/10291162.html

时间: 2024-10-10 06:00:11

前端Ajax/JS/HTML+后端SpringMVC(二)的相关文章

前端Ajax/JS/HTML+后端SpringMVC(一)

1.JSON 1.1. 转发或重定向的不足 对于发出的请求,最终需要给出"成功/失败"的结果的话,转发的方式来处理,给用户的体验就非常不好!即使用户填错了一项数据不达标,都需要回退至此前的页面重新填写,而原本填写的其它数据可能需要再填写一次! 并且,当用户发出请求后,如果是转发或者重定向,一定会发生页面的跳转!无法在页面中局部来提示信息. 从服务端的角度出来,其实,还存在浪费流量的问题!如果只是为了表达"成功/失败",也许只需要1个"1/0"就可

前端AJAX传递数组给Springmvc接收处理

前端传递数组后端(Spring)来接收并处理: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>测试页面</title> <script type="text/javascript" src="http://www.ostools.net/js/jquery/jquery-1.7.2.js">

Django框架进阶6 多对多三种创建方式, Ajax, Content-Type前后端传输数据编码格式, Ajax发送文件数据, django内置的序列化功能, Ajax结合sweetalert实现删除二次确认, 批量插入数据, 自定义分页器, ajax结合sweetalert实现删除二次确认

多对多三种创建方式 1.全自动(较为常用) class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') # orm就会自动帮你创建第三张表 class Author(models.Model): name = models.CharField(max_length=32) ''' 好处:第三张表自己创建 不足之处:第三张表无法扩展额外

解决js(ajax)提交后端的“ _xsrf&#39; argument missing from POST” 的错误

首先先简述一下CSRF: CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情——这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持. 网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问 这个网站会带上这个cookie.如果这期间浏览器被人控制着请求了这个网站的url

前端ajax用post方式提交json数据给后端时,网络报错 415

项目框架:spring+springmvc+mybatis 问题描述:前端ajax用post方式提交json数据给后端时,网络报错 415 前端异常信息:Failed to load resource: the server responded with a status of 415 (Unsupported Media Type) 后端异常信息:无 报错原因:缺少jackson包 类似问题注意点: springmvc添加配置.注解: pom.xml添加jackson包引用: Ajax请求时没

Atitit &#160;&#160;发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化

Atitit   发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web server的bug应该.Resin4.0.221 大段内容务必要替换转义换行符号 C:\0workspace\AtiPlatf_cms\WebRoot\poster\gejy_pub.js cmd= cmd.replace(new RegExp("\r\n",'gm'),"\\r\\n

怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端?

今天在论坛上看到这样一个问题,有必要编辑搜集下. 问题描述:怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端 题主用jquery接收 <input name="c_pic" id="c_pic" type="file" class="file"> 用的方法是: var input = document.getElementById("c_pic"); inpu

Ajax+Node.js前后端交互最佳入门实践(01)

1.Node.js简介 1.0.前后台数据交互流程 在web开发中,我们经常听说前端和后台,他们分别是做什么具体工作的呢?他们怎样交互的呢?我们得把这些基础的问题都搞明白了,才有一个大致的学习方向,首先,我们来看一张生活中几乎每个人都经历过的一个场景,如下图: 当你去餐馆吃饭的时候,坐下后服务员会带着一个菜单过来,问你需要点什么菜,这个时候你浏览了菜单上的菜,把想吃的菜告诉服务员,服务员把你点的菜拿到后台,后台根据你点的菜名,逐一完成,菜做完后叫服务员给你上菜,就这么一个场景其实和我们web开发

Ajax+Node.js前后端交互最佳入门实践(07)

7.ajax函数封装 7.1.实例引入 需求: 每秒钟请求一次服务器 获取到数据 实现: 把ajax进行封装 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="ajax.js" type="text/javascript" charset="utf