用json实现服务器servlet和安卓客户端的数据交互

最近在学习如何实现安卓客户端与Tomcat服务器的servlet的交互,比如用户验证账号和密码,然后服务器返回是否存在这个账户。考虑到服务器在收到客户端消息后可能返回不止一个有用信息,比如账号是否存在、用户昵称、用户性别等。本人在尝试中采用的是在servlet中使用 PrintWriter out = response.getWriter();out.print(str); 来给客户端发送反馈信息,所以可以将信息作为String类型依次导入到out中,然后再从客户端读取。显然,如果有多个信息时我们必须对得到的字符串进行分段提取,具体怎么分段每个人可能想法不同,比如我最初曾试想过用一些特殊的符号,比如"#"进行分段,但是这样一来必然会限制用户对账号和密码涉及符号的限制,所以不太实用。下面,我将介绍我所使用的json方法来实现多个数据的传递。具体的json是什么,有什么好处等,大家可以百度一下,我就讲讲具体的实现代码,方便大家参考,先给出我的登录界面:


首先服务器中,我使用的是Tomcat,要先下载json使用到的jar包,可以用如下网址进行下载:http://download.csdn.net/detail/fengyun8810/7697203 ;然后将解压后的jar包导入到创建的项目中,并放到Tomcat安装路径下的lib文件夹中,不然在运行时可能会出现“类无法找到”的异常,这个比较容易忽视。对于安卓客户端的项目本身就自带了json的解析包,添加这句话即可 import org.json.JSONObject; 。

下面先介绍一下json有主要的几种实现方法:

1.用List集合转换成json,比如:

    List list = newArrayList();
    list.add( "1" );
    list.add( "2" );
    JSONArray jsonarray =JSONArray.fromObject( list );
2.用Map集合转换成json,比如:
    Map map = newHashMap();
    map.put("name","hehe");
    map.put("psw","123456");
    JSONObject jsonobj =JSONObject.fromObject(map);
3.用数组转换成json,比如:

    boolean[] boolarray = newboolean[] { true, false, true };
    JSONArray jsonarray1 =JSONArray.fromObject(boolarray);
我将使用第二种方法来从服务器的servlet向安卓客户端传送数据。在servlet的函数doPost()中,首先得到客户端传来的账号和密码,然后查询数据库账号是否存在,存在则继续查找用户昵称,最后一起返回,也即返回两个有用信息。具体代码如下,其中SqlOperation是我自己写的函数接口,里面有一些查询数据库的函数:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("UTF-8");
        String userid = request.getParameter("userid");//用户登录账号
        String psw = request.getParameter("psw");//用户登录密码
        boolean isuserexist = SqlOperation.isUserExist(userid, psw);//查询账号是否存在
        //下面HashMap构造json进行传递数据
        HashMap<String, String> sendmap = new HashMap<String, String>();
        if(isuserexist){//账号存在,登录成功
            String nicheng = SqlOperation.queryNicheng(userid);//查询用户昵称
            sendmap.put("issuccess", "success");
            sendmap.put("nicheng", nicheng);		
        }
        else//账号不存在,登录失败
            sendmap.put("issuccess", "failed");
        JSONObject jsonobj = JSONObject.fromObject(sendmap);//构造json数据进行传递
        out.print(jsonobj.toString());
        out.flush();
        out.close();	
    }
客户端在用户点击登录时,会创建新线程来执行登录功能。首先使用使用HttpClient来向服务器传递账号和密码,然后如果验证成功则继续查询昵称,主要代码如下:

	
    class LoginThread implements Runnable{
        public void run() {
            boolean isconnect = false;//是否能够连接服务器
            //获取文本域的userid和psw
            userid = edittext_userid.getText().toString();//获取文本框中的账号
            psw = edittext_psw.getText().toString();//获取文本框中的密码
            //连接服务器,传递账号和密码获取返回值
            HttpPost request = new HttpPost(urlstr);
            ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("userid", userid));
            params.add(new BasicNameValuePair("psw", psw));
            //设置请求参数项
            try {
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                HttpClient client = getHttpClient();//这是自己写的函数,看下文
                HttpResponse response = client.execute(request);
                if(response.getStatusLine().getStatusCode()==200) {//表示能够成功连接服务器  
                    isconnect = true;//表示连接成功,接下来可能是账号错误或者成功登录
                    //获得响应信息,转换成json格式,方便解析
                    String temp = EntityUtils.toString(response.getEntity());//获取String格式的json
                    JSONObject jsonobj = new JSONObject(temp);//将其转换成json格式文件
                    responsemsg = jsonobj.getString("issuccess");/获取账号是否验证成功
                    nicheng = jsonobj.getString("nicheng");
                }	
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //剩余代码就不赘余了,根据个人实现功能的不同而不同...
        }
    }
上面的getHttpClient()函数用来初始化HttpClient,并设置超时,代码如下:

    
    public HttpClient getHttpClient() {  
        BasicHttpParams httpParams = new BasicHttpParams();  
        HttpConnectionParams.setConnectionTimeout(httpParams, 5000);  
        HttpConnectionParams.setSoTimeout(httpParams, 5000);  
        HttpClient client = new DefaultHttpClient(httpParams);  
        return client;  
    }
至此,本文就介绍了本人刚学习的使用json实现服务器servlet和安卓客户端交互的最基本的情况,希望对读者有所帮助 大笑






  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值