最近在学习如何实现安卓客户端与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 sendmap = new HashMap();
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 params = new ArrayList();
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和安卓客户端交互的最基本的情况,希望对读者有所帮助 !