前端Ajax/JS/HTML+后端SpringMVC(一)
1.JSON1.1. 转发或重定向的不足对于发出的请求,最终需要给出“成功/失败”的结果的话,转发的方式来处理,给用户的体验就非常不好!即使用户填错了一项数据不达标,都需要回退至此前的页面重新填写,而原本填写的其它数据可能需要再填写一次! 并且,当用户发出请求后,如果是转发或者重定向,一定会发生页面的跳转!无法在页面中局部来提示信息。 从服务端的角度出来,其实,还存在浪费流量的问题!如果只是为了表达“成功/失败”,也许只需要1个“1/0”就可以了,根本就不需要使用整个网页来表达! 所以,当服务器需要向客户端响应某些数据,而不是响应整个页面时,可以使用JSON来组织数据! 1.2. JSON简介早期,会使用XML来组织服务器响应的数据,例如: <result> <state>-1</state> <message>修改密码失败!原密码错误!</message> </result> 不过,这种做法导致的问题就是:解析比较麻烦,传输的数据量略大!后来,改用了JSON格式: { "state": -1,"message":"修改密码失败!原密码错误!" } JSON是一种组织数据的格式,JavaScript天生就支持解析JSON数据,并且,这种格式相对于XML更加简洁,在传输过程中产生的流量将更小! 1.3. 语法格式JSON是在JavaScript中的一种对象型数据,其数据的组成方式大致是:使用大括号框住所有内容,每项数据的名称都是字符串,需要使用引号(单/双均可)框住数据的名称,然后使用冒号与值分隔,值可以是各种数据类型,例如:数值型的值可以直接写,而字符串型的值需要引号,各个数据之间使用逗号进行分隔: <script type="text/javascript"> var obj = { "state": -1,"message": "error" }; </script> 在JavaScript中,可以直接访问JSON对象中的任意数据,语法为: var state = obj.state; JSON中的数组 在JSON中的数据的值也可以是数组,例如: var obj = { "state": -1,"message": "error","skill": ["Java","MySQL","AJAX"] }; 即使用 则通过 JSON中的对象 在JSON中的某个数据的值也可以是对象型的,例如: var obj = { "state": -1,"AJAX"],"user": { "username": "Jack","age": 18 } }; 则使用 其实,在JSON中,可以无限的嵌套下去,即:JSON对象中包括某个子级对象,子级对象中还可以继续包含另一个子级对象,一直包含下去…… JSON对象与JSON字符串 在实际应用中,JSON对象往往并不是直接编写出来的,而是通过服务器端返回的!而服务器端返回的一定是字符串,而不会是一个JSON对象!即服务端返回的会是: ‘{ "state": -1,"message": "error" }‘ 即:内容本身是JSON语法所组织的,但是,数据类型却是字符串,而不是JSON对象! 在JavaScript中,可以通过 1.4. 小结JSON是一种组织数据结构的对象,支持在对象中存放若干个属性,属性的类型可以是各种类型,包括常用数据类型、数组和其它对象。 学习JSON重点掌握如何通过JSON组织数据。 JavaScript天生支持直接解析JSON对象,获取其中的数据。 当获取到的是JSON格式的字符串时,可以通过 2. 服务器向客户端响应数据当服务器向客户端响应的需要是某些数据,而不是转发或者重定向时,需要在处理请求的方法之前添加 <mvc:annotation-driven /> 例如处理请求时: @RequestMapping("/login.do") @ResponseBody public String showLogin() { return "hello,login"; // /WEB-INF/login.jsp } 则在浏览器中得到的将是 注意:在没有进一步的配置之前,返回的内容中并不支持中文! 以“处理登录”为例,可以为处理请求的方法添加 @RequestMapping(value="/handle_login.do",method=RequestMethod.POST) @ResponseBody public String handleLogin( @RequestParam("username") String username,@RequestParam("password") String password,HttpSession session) { try { User user = userService.login(username,password); session.setAttribute("uid",user.getId()); session.setAttribute("username",user.getUsername()); return "{ "state": 1 }"; } catch (UserNotFoundException e) { return "{ "state": -1,"message": "" + e.getMessage() + "" }"; } catch (PasswordNotMatchException e) { return "{ "state": -2,"message": "" + e.getMessage() +"" }"; } } 3. Jackson框架使用Jackson框架,可以解决响应的数据可能乱码的问题(本质上是设置了响应头中的响应字符编码),并且,当响应某个对象时,会自动装响应头中的响应类型设置为json类型。 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.7</version> </dependency> 除此以外,Jackson框架还可以将响应的对象自动转换为JSON字符串格式!通常,可以在项目中添加 public class ResponseResult { private Integer state; private String message; public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } SpringMVC框架对Jackson框架的支持性非常好,添加了Jackson依赖后,无须添加任何配置,也不需要在项目的任何位置显式的使用它。 4. AJAX4.1. 简介AJAX是一种异步提交请求并处理响应结果的做法,它本身是基于JavaScript实现的! 通常使用基于jQuery的AJAX处理方式,可以解决不同浏览器的版本兼容问题,并且使得代码的可读性变得更高,所以,通常需要: <script type="text/javascript" src="${pageContext.request.contextPath }/jquery-3.3.1.min.js"></script> 然后调用jQuery中的ajax()函数来处理AJAX。 在ajax()函数的参数中,至少配置5个属性:
4.2. 小结使用这种模式开发时,关于控制器端,应该: 1 处理请求的方法需要添加 2 处理请求的方法的返回值应该是 3 在处理请求的方法内部,无论是成功还是失败,当决定执行响应时,都应该在 关于前端,应该: 1 由于需要使用jQuery,所以,必须引入jQuery框架; 2 前端页面不强制需要 3 自定义JavaScript函数,且函数名与以上步骤中点击事件对应一致: <script type="text/javascript"> function doReg() { } </script> 4 然后编写函数体,主要任务是调用jQuery框架中的ajax()函数来实现提交请求并获取响应结果: function doReg() { // 获取用户输入的数据 var u = $("#username").val(); var p = $("#password").val(); // 处理请求的URL var url = "handle_reg.do"; // 提交到服务端的参数 var data = "username=" + u + "&password=" + p; // 发出请求,并获取响应结果 $.ajax({ "url": url,"data": data,"type": "post","dataType": "json","success": function(json) { // 由于服务端使用了Jackson // 所以响应头中由Jackson自动设置了响应正文是json // 所以dataType的值就是"json" // 且当前成功时的处理函数的参数就是服务端响应的json对象 if (json.state == 1) { alert("注册成功!"); } else { alert("注册失败!" + json.message); } } }); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Binary XML file line : Error inflating class <unknown
- ruby-on-rails – 使用memoization,Rails.cache.fetch的表现
- vb.net配置文件的使用
- c – 在几百次打开后,fopen()是否有效?
- reactjs – React-native animated.event自定义onScroll侦听
- c# – 在SELECT IN中使用Oracle参数的问题
- COCOS-开发环境配置
- C#校验Email(电子邮件)地址是否合法
- c# – 创建一个从用户机密获取连接字符串的DbContextFactor
- SQLite 入门教程(一)基本控制台(终端)命令