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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java lambda函数_番石榴函数和Java 8 Lambdas

java lambda函数我最近阅读了Brian Goetz的《 Lambda的状况》 &#xff0c;在阅读了该文章之后&#xff0c;我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类&#xff0c;其中ActionListener是规…

c++组合 聚合 关联

组合和聚合区别(不能脱离整体 能脱离整体) 组合&#xff1a;&#xff08;表示两个对象之间是整体和部分的强关系&#xff0c;部分的生命周期不能超越整体。如人和脑袋&#xff09; 比如A类中包含B类的一个引用b&#xff0c;当A类的一个对象消亡时&#xff0c;b这个引用所指向的…

python内建时间模块 time和datetime

时间模块 UTC&#xff08;Coordinated Universal Time&#xff0c;世界协调时&#xff09;亦即格林威治天文时间&#xff0c;世界标准时间。在中国为UTC8。DST&#xff08;Daylight Saving Time&#xff09;即夏令时。 在Python中,通常有这几种方式来表示时间&#xff1a;1&…

java tomcat自动安装教程_Tomcat:基础安装和使用教程

背景此文记录了 Tomcat 的基本使用方法&#xff0c;主要为了强化记忆。安装步骤第一步&#xff1a;下载和安装 Java安装并设置JAVA_HOME环境变量&#xff1a;第二步&#xff1a;下载和解压 Tomcat第三步&#xff1a;修改端口号.NET 我使用的是 80xx&#xff0c;Php 我使用的是 …

C++ 智能指针五

/* 代码分析:这是标准库的源码&#xff0c;我们看到在enable_shared_from_this内部保存了一个weak_ptr。shared_from_this函数就是通过这个weak_ptr得到了。 但是另外一点&#xff0c;我们可以看到在enable_shared_from_this的构造函数中并没有对这个weak_ptr进行初始化。 这就…

多线程之间共享的资源有哪些

搜集了一下资料&#xff0c;网上的说法众说纷纭&#xff1b;曾经以为进程、线程的问题搞得很清楚&#xff0c;现在感觉似乎有些复杂&#xff1a; 课本的说法&#xff1a;进程是资源分配的基本单位&#xff1b;线程是系统调度的基本单位。平时我们写的程序都是作为线程运行的&am…

mybatis一级缓存导致sql查询出现问题

如下代码&#xff1a; PubPsndoc pubdoc pubPsndocDAOService.selectByPrimaryKey(in.id);pubdoc.setPkCorp(newpkcorp);pubdoc.setPkDept(newpkdept);pubPsndocDAOService.update(pubdoc); PubPsndoc personPubdoc pubPsndocDAOService.selectByPrimaryKey(in.id); 在上述代…

使用JavaParser从源文件中提取JavaDoc文档

很多人正在使用JavaParser实现最不同的目标。 其中之一是提取文档。 在这篇简短的文章中&#xff0c;我们将看到如何打印与类或接口关联的所有JavaDoc注释。 可以在GitHub上找到代码&#xff1a; https : //github.com/ftomassetti/javadoc-extractor 获取类的所有Javadoc注释…

三个打印函数printf()/sprintf()/snprintf()区别

先贴上其函数原型 printf( const char *format, ...) 格式化输出字符串&#xff0c;默认输出到终端-----stdout sprintf(char *dest, const char *format,...) 格式化输出字符串到指定的缓冲区 snprintf(char *dest, size_t size,const char *format,...) 按指定的S…

JAVA客户端数据传输_java模拟TCP通信实现客户端上传文件到服务器端

java模拟TCP通信实现客户端上传文件到服务器端&#xff0c;供大家参考&#xff0c;具体内容如下客户端package com.zr;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import jav…

js闭包简单演示

function f1() { var age 20; var height 170; function f2() { console.log("aaa:"(age) "--bbb:"height); } return f2; } var ff f1(); var fa f1(); fa(); fa(); ff(); ff(); 这里有两个闭包&#xff0c;fa和ff分别保存的信息独立&#xff0c;age…

C++ 类成员引用变量的使用

出来工作后&#xff0c;才发现原来C的类成员变量可以是引用变量。下面通过一个例子来说明&#xff08;虽然没多大意义&#xff09;&#xff1a; #include <iostream> using namespace std; class A { public: A(int i3):m_i(i){} void print() { c…

java 课程设计表达式求值_NYOJ-35-表达式求值

NYOJ-35-表达式求值很好的一题&#xff0c;利用栈来计算表达式的值四则运算的规则&#xff1a;1.先乘除,后加减&#xff1b;2.从左算到右&#xff1b;3.先括号内,后括号外注意把字符串转换成浮点数可以使用atof函数#include#include#includeint map[7][7] //算符间的优先关系,1…

打破冷漠僵局文章_研究僵局–第3部分

打破冷漠僵局文章在本系列的前两个博客&#xff08; 第1部分和第2部分&#xff09;中 &#xff0c;我演示了如何创建一段会死锁的错误代码&#xff0c;然后使用该代码演示进行线程转储的三种方式。 在此博客中&#xff0c;我将分析线程转储以找出错误的原因。 下面的讨论同时涉…

springboot 静态资源访问,和文件上传 ,以及路径问题

springboot 静态资源访问: 这是springboot 默认的静态资源访问路径 访问顺序依次从前到后&#xff08;http://localhost:8080/bb.jpg&#xff09; spring.resources.static-locations classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/p…

mysql jdbc链接配置文件_Java JDBC使用配置文件连接数据库

Java JDBC使用配置文件连接数据库&#xff1a;创建后缀名为&#xff1a;.properties的文件&#xff0c;文件内容包括&#xff0c;数据库驱动、连接的数据库地址、用户名、密码……以Mysql为例创建config.properties配置文件其内容如下&#xff1a;DRIVER_CLASScom.mysql.jdbc.D…

单例模式(饿汉式和懒汉式)

以前学习单例的时候&#xff0c;只理解了简单部分。这次看DRP&#xff0c;对单例的饿汉式和懒汉式有了一些认识和对比。 在实际的开发中&#xff0c;有些地方需要一个类只有一个实例。比如&#xff1a;网站在线人数的计数器&#xff0c;再比如IDE中的工具箱之类的等等。当需要这…

关于前端设置cookie

cookie既可以后端设置也可以在前端设置&#xff0c;例如登陆/注册功能&#xff0c;每次都要向服务器请求用户数据&#xff0c;这种就可以把cookie放到前端储存起来。 当网页要发http请求时&#xff0c;浏览器会先检查是否有相应的cookie&#xff0c;有则自动添加在request head…

使用React,Spring Boot和用户身份验证构建CRUD应用程序

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; React是用于创建Web应用程序前端的最…

java基本数据类型所占长度_java基本数据类型长度详解

java基本数据类型基础知识机器数和真值机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号, 正数为0, 负数为1例如:dec 3 bit 00000011dec -3 bit 10000011真值将带符号位的机器数对应的真正数值称为机…