Android客户端与服务器端(struts2)通信方法。
Android客户端向服务器端(struts2框架)发送get或post请求(http),服务器端以json格式返回数据,android客户端解析json数据。
一.服务器端
1. jar包
struts相关jar包以及:
json-lib-2.3-jdk15.jar
struts2-json-plugin-2.3.4.jar
2. struts配置文件
- extends=”json-default”
- <result name=”success”type=”json”>
- <param name=”includeProperties”> user/.userNo,user/.userName,user/.userKey,userlist/[/d+/]/.userNo,userlist/[/d+/]/.userKey </param>
user为Action类中定义的UserInfo类型对象,userNo、userName、userKey为UserInfo类型对象的属性,userList为List<UserInfo>类型的对象。在Action对应的类中应有user和userList的get和set方法。
<package name="android" extends="json-default" > <action name="logina" method="login_a"> <result name="success" type="json"> <param name="includeProperties"> user/.userNo,user/.userName,user/.userKey,userlist/[/d+/]/.userNo,userlist/[/d+/]/.userKey</param> </result> </action></package>
3. Action对应的类
继承自ActionSupport,提供与struts.xml对应的action方法,在该类中定义UserInfo user和List<UserInfo> userList,并为其生成相应的get和set方法。
public class LoginAction extends ActionSupport { private UserInfo user; private List<UserInfo> userlist; public List<UserInfo> getUserlist() { return userlist; } public void setUserlist(List<UserInfo> userlist) { this.userlist = userlist; } public UserInfo getUser() { return user; } public void setUser(UserInfo user) { this.user = user; } public String login_a() { HttpServletRequest request = ServletActionContext.getRequest(); String uno = request.getParameter("name"); String key = request.getParameter("key"); LoginService ls = new LoginService(); user = ls.getUser(uno); userlist = ls.getUserList(); if (user.getUserNo().equals(uno) && user.getUserKey().equals(key)) { return "success"; } else return "input"; }}
4. 参数接收
使用ServletActionContext.getRequest()获取HttpServletRequest;再使用HttpServletRequest的getParameter(“key”)方法获取参数。
5. 数据返回格式
{“user”:{“userKey”:”123″,”userName”:”张三”",”userNo”:”zhangsan”},
“userlist”:[{"userKey":"123","userNo":"zhangsan"},{"userKey":"123","userNo":"lisi"}]}
二.Android客户端
1. AndroidManifest.xml中配置网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
2. 网络访问不能在主线程中进行,需要新开一个线程,当网络访问结束后向Handler发送消息:
Handler定义:
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: //............ break; case 2: //............ break; } } };
消息发送:
Message msg = mHandler.obtainMessage(1);mHandler.sendMessage(msg);
3. 以get方式发出请求
HttpGet request = new HttpGet(path);HttpClient client = new DefaultHttpClient();HttpResponse response = client.execute(request);
4. 以post方式发出请求
HttpPost request = new HttpPost(path);HttpClient client = new DefaultHttpClient();HttpEntity entity = new UrlEncodedFormEntity(params,"UTF-8");request.setEntity(entity);HttpResponse response =client.execute(request);
params的构建:
List<NameValuePair> params = newArrayList<NameValuePair>();params.add(new BasicNameValuePair("userno", "zhangsan"));
5. JSON数据解析
HttpEntity entity1 = response.getEntity();String resource = EntityUtils.toString(entity1);JSONObject object = new JSONObject(resource);JSONObject ob = object.getJSONObject("user");//获取userob .getString("userName ");//获取userNameJSONArray array = object.getJSONArray("userlist ");//获取userlistarray.getJSONObject(i);//获取list中的JSONObject,i为int型