Android客户端与服务器端(struts2)通信



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型