jQuery ajax 流程全解析
实例解析java + jQuery + json工作过程(登录)
本文主要讲解在java环境下使用jQuery进行JSON数据传送的交互过程
参考根据作者的账务管理系统(个人版) 源码下载 讲解
一、相关技术、工具简介
1、简单介绍一下JSON,JSON是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。已键值对形式表示数据,和java中的Map的数据存储形式相似,具体细节请参考http://www.json.org/json-zh.html。
2、对应后台JSON的数据处理工具json-lib,包含各种格式数据的工具类,比如:JavaBean、数组、集合(Collection)等,参考API文档。
3、jQuery框架中的数据表现形式,如果你熟悉jQuery的话就会发现jQuery的使用的数据传输都是JSON格式,比如我们经常使用的$.ajax方法:
- $.ajax({
- url : url,
- data : {
- id : chkValue
- },
- cache : false,
- dataType : "json",
- success : function(result){
- alert(result);
- }
- );
其中 {…} 表示的就是JSON格式的数据
二、前台工作方式
为了能够容易理解以系统登录讲解,最后会以一个实例的方式讲解
1、登录页面
代码请参见 http://code.google.com/p/finance-p/source/browse/trunk/login.jsp
- 用户名:
- <input id="loginName" name="loginName" size="20" type="text" />
- 密码:
- <input id="password" name="password" size="20" type="password" />
2、登录javascript文件 login.js
- /**
- * 设置表单验证规则
- */
- function regFormValidator() {
- $.formValidator.initConfig({formid:"loginForm"});
- $("#loginName").formValidator({
- onshow : "请输入用户名",
- onfocus : "用户名至少2个字,最多4个字"
- }).inputValidator({
- min : 1,
- onerror : "你输入的用户名非法,请确认"
- });
- $("#password").formValidator({
- onshow : "请输入密码"
- }).inputValidator({
- min : 6,
- onerror : "密码在6位以上,请确认"
- });
- }
- $(function() {
- // 注册表单验证插件
- regFormValidator();
- $('#submit').click(function(){
- // 验证输入的用户名、密码是否正确
- var valid = jQuery.formValidator.pageIsValid('1');
- if (valid) {
- $(this).attr('value', '正在登录……').attr('disabled', true);
- } else {
- return;
- }
- // 发送请求
- $.ajax({
- url : 'login.do',
- data : { loginName:$('#loginName').val(), password: $('#password').val() },
- success : function(result){
- // 根据result返回信息判断是否登录成功
- if(result && result == 'success') {
- window.location.href = 'index.jsp';
- } else {
- alert('登录失败,用户名或密码错误,请重试!');
- }
- }
- });
- });
- });
这样当点击“登录”按钮的时候触发ajax请求:
- 验证表单完整性
- 发送ajax请求到后台,值通过data键已JSON格式传送至后台
- 如果后台返回的result为success时表示登录成功,页面跳转至首页index.jsp
三、后台工作方式
后台要比前台操作复杂一些,以为涉及到数据库、编码或者一些业务逻辑
1、获得请求参数
有两种方式:
- 通过request.getParameter(”key”)的方式
- 通过json-lib工具包获取
这我们主要讲解怎么通过json-lib获取参数
首先我们来写一个公共的方法,可以返回一个net.sf.json.JSONObject对象,具体代码如下:
- /**
- * 读取请求参数转换JSONObject对象
- *
- * @param request HttpServletRequest 对象
- * @return json格式的String对象
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- protected JSONObject readJson(HttpServletRequest request) throws Exception {
- JSONObject jsonObject = new JSONObject();
- try {
- Map parameterMap = request.getParameterMap();
- // 通过循环遍历的方式获得key和value并set到JSONObject中
- Iterator paIter = parameterMap.keySet().iterator();
- while (paIter.hasNext()) {
- String key = paIter.next().toString();
- String[] values = (String[])parameterMap.get(key);
- jsonObject.accumulate(key, values[0]);
- }
- log.debug("从客户端获得json=" + jsonObject.toString());
- } catch (Exception e) {
- log.error("获取json数据出错,错误信息如下:nt" + e.getMessage());
- e.printStackTrace();
- throw e;
- }
- return jsonObject;
- }
通过这个方法我们可以获得一个JSONObject对象,然后就可以通过key获得对应的value;
2、登录处理Action
- public ActionForward login(ActionMapping mapping, ActionForm actionForm,
- HttpServletRequest request,HttpServletResponse response) throws Exception {
- JSONObject jsonObject = readJson(request);
- String name = jsonObject.getString("loginName");
- String pass = jsonObject.getString("password");
- try {
- int loginFlag = userManager.validLogin(name, pass);
- if (loginFlag == UserManager.LOGIN_SUCCESS) {
- User user = userManager.getUserByNameAndPass(name, pass);
- UserUtil.saveUser2Session(user, request);
- log.info("用户<" + user.getUserName()
- + ",ip=" + request.getRemoteAddr() + ">登录系统");
- print(response, RESBONSE_SUCCESS);
- } else if (loginFlag == UserManager.LOGIN_FAIL) {
- print(response, RESBONSE_ERROR);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
解释:
在34行我们通过刚刚准备好的readJson方法获得一个JSONObject对象,接下来通过key获得用户名和密码,接下来就是业务逻辑的验证工作了,通过后我们向前台返回请求结果。
我们还需要一个小方法向前台写结果,如上面44、46行
- protected void print(HttpServletResponse response, String info) throws IOException {
- try {
- response.getWriter().print(info);
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- }
- }
/**
* 输出字符流
*
* @param reps
* 输出的参数对象
* @param str
* 输出的内容
*/
public static void outPutStream(HttpServletResponse reps, String str) throws IOException
{
// getResponse().setCharacterEncoding("UTF-8");
// getResponse().setContentType("text/html;charset=UTF-8");
reps.getOutputStream().write(str.toString().getBytes("UTF-8"));
}
outPutStream(response, "{\"code\":\"-12\",\"msg\":\"用户无效,请重新登录!\"}");
这里有一点要说明,在获得输出流的时候有个小插曲,我在开发的时候使用的tomcat5.5.26版本,
当时的写法为:
- response.getOutputStream().print(info);
- 后来源码开源后一个网友使用的tomcat6版本,说系统不能正常运行,后来他查到了原因,因为获得输出流时出了问题,
- 改成getWriter就没有问题了,集体也没有搞清楚为什么会是这样……
基于java开发时会使用struts,struts需要返回一个ActionMapping对象,但是在ajax请求不需要返回特定页面,因为根本没有跳转页面的动作,解决办法很简单,直接return null就可以了
输出结果后jQuery的ajax的success方法就接收到了请求结果,然后就可以根据结果处理业务逻辑了O(∩_∩)O~
jQuery ajax 流程全解析的更多相关文章
- ajax请求原理及jquery $.ajax封装全解析
.ajax原理: Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得 ...
- 转:jQuery Ajax 实例 全解析
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...
- 【JavaScript】jQuery Ajax 实例 全解析
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...
- jQuery Ajax 实例 全解析
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是 ...
- jQuery Ajax 实例 全解析(转)
1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...
- jquery ajax获取和解析数据
最近项目中用到了ajax技术,之前虽然写过一点点,但是没有系统的总结过.趁着刚刚用过,手热就记录一下,方便以后查阅. $.ajax中的参数 $.ajax的函数格式: $.ajax({ type: 'P ...
- 最佳实践 | 数据库迁云解决方案选型 & 流程全解析
Oracle是非常强大的综合数据库,但同时也存在一些劣势,比如由于采用集中式架构,无法很好地实现横向扩展,并且其稳定性依赖于硬件.出于架构升级.降低成本和云化等需求,越来越多的企业需要“去Oracle ...
- Google Summer of Code谷歌编程之夏活动流程全解析(上)
本期由尔等同学来对话Casbin罗杨老师,为大家介绍开源及GSoC活动流程. > 罗杨:GSoC 2013.2015学生.GSoC期间在Nmap开源社区作为主力开发了Windows平台网络抓包工 ...
- jQuery Ajax 实例 全解析
jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...
随机推荐
- acdream 1735 输油管道 贪心
输油管道 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1735 Description ...
- tortoise git常用功能
1.打tag TortoiseGit -> show log -> 选中版本 -> create tag at this version... TortoiseGit -> p ...
- Centos 6/ 7下通过yum安装php7环境
本文转自:云溪社区 2015年12月初PHP7正式版发布,迎来自2004年以来最大的版本更新.PHP7最显著的变化就是性能的极大提升,已接近Facebook开发的PHP执行引擎HHVM.在WordPr ...
- Spring JdbcTemplate batchUpdate() 实例
在某些情况下,可能需要将一批记录插入到数据库中.如果你对每条记录调用一个插件的方法,SQL语句将被重复编译,造成系统缓慢进行. 在上述情况下,你可以使用 JdbcTemplate BATCHUPDAT ...
- JAVA包管理
package cn.java.mybole; class test6 { public static void main(String[] args) { System.out.println(&q ...
- Raspberry pi,一个好玩的派:第八季 Raspbmc(下)
上一季安装好Raspbmc就等着这一季好好玩耍呢. 我们要在这一季中完毕例如以下任务:调整分辨率.连接wifi并在无线路由器中设置固定IP.手机遥控Raspbmc.改变语言为中文.远程訪问Raspbe ...
- 理解JavaScript中的事件流
原文地址:http://my.oschina.net/sevenhdu/blog/332014 目录[-] 事件冒泡 事件捕获 DOM事件流 当浏览器发展到第四代时(IE4和Netscape Comm ...
- Silverlight:《Pro Silverlight5》读书笔记 之 Dependency Properties And Routed Event
Dependency Properties And Routed Event Dependency Properties Dynamic Value Resolution As you’ve alre ...
- 关于Mantis变更日志(Changelog)和路线图(Roadmap)的说明
变更日志(Changelog):是已经修改好了问题的日志,需要给项目添加版本号,并且在添加/解决问题时都指定了相应的版本号,才会显示. 路线图(Roadmap):是计划在某个版本修改某些问题的日志,需 ...
- [android] Activity 的生命周期 以及横屏竖屏切换时 Activity 的状态变化
生命周期Android 系统在Activity 生命周期中加入一些钩子,我们可以在这些系统预留的钩子中做一些事情.例举了 7 个常用的钩子:protected void onCreate(Bundle ...