实例解析java + jQuery + json工作过程(登录)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

本文主要讲解在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格式的数据

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请求:

  1. 验证表单完整性
  2. 发送ajax请求到后台,值通过data键已JSON格式传送至后台
  3. 如果后台返回的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;
    }
}
这里有一点要说明,在获得输出流的时候有个小插曲,我在开发的时候使用的tomcat5.5.26版本,
当时的写法为:
response.getOutputStream().print(info);

后来源码开源后一个网友使用的tomcat6版本,说系统不能正常运行,后来他查到了原因,因为获得输出流时出了问题,
改成getWriter就没有问题了,集体也没有搞清除为什么会是这样……


基于java开发时会使用struts,struts需要返回一个ActionMapping对象,但是在ajax请求不需要返回特定页面,因为根本没有跳转页面的动作,解决办法很简单,直接return null就可以了

输出结果后jQuery的ajax的success方法就接收到了请求结果,然后就可以根据结果处理业务逻辑了O(∩_∩)O~

OK,到此整个请求结束,有不明白的请留言或者到“关于”中联系我

相关文章
|
3月前
|
SQL 存储 JSON
SQL,解析 json
SQL,解析 json
85 8
|
15天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
120 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
8天前
|
JSON JavaScript 前端开发
一次采集JSON解析错误的修复
两段采集来的JSON格式数据存在格式问题,直接使用PHP的`json_decode`会报错。解决思路包括:1) 手动格式化并逐行排查错误;2) 使用PHP-V8JS扩展在JavaScript环境中解析。具体方案一是通过正则表达式和字符串替换修复格式,方案二是利用V8Js引擎执行JS代码并返回JSON字符串,最终实现正确解析。 简介: 两段采集的JSON数据因掺杂JavaScript代码导致PHP解析失败。解决方案包括手动格式化修复和使用PHP-V8JS扩展在JavaScript环境中解析,确保JSON数据能被正确处理。
|
2月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
123 57
|
18天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
83 5
|
1月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
41 5
|
2月前
|
存储 机器学习/深度学习 编解码
阿里云服务器计算型c8i实例解析:实例规格性能及使用场景和最新价格参考
计算型c8i实例作为阿里云服务器家族中的重要成员,以其卓越的计算性能、稳定的算力输出、强劲的I/O引擎以及芯片级的安全加固,广泛适用于机器学习推理、数据分析、批量计算、视频编码、游戏服务器前端、高性能科学和工程应用以及Web前端服务器等多种场景。本文将全面介绍阿里云服务器计算型c8i实例,从规格族特性、适用场景、详细规格指标、性能优势、实际应用案例,到最新的活动价格,以供大家参考。
|
2月前
|
小程序 前端开发 算法
|
3月前
|
XML 数据格式
HTML 实例解析
本文介绍了HTML中常见元素的使用方法,包括`&lt;p&gt;`、`&lt;body&gt;`和`&lt;html&gt;`等。详细解析了这些元素的结构和作用,并强调了正确使用结束标签的重要性。此外,还提到了空元素的使用及大小写标签的规范。
|
3月前
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
38 1

推荐镜像

更多