基于JAVA的 Android客户端应用开发中的问题-------------服务器传值和客户端解析中的那些事儿
刚开始学习android开发,对于整个框架和android中的技术都还衰,所以在开发的时候各种问题;对于大多数的应用都会牵扯到后台服务器的交互问题--------服务器发送数据和客户端接收数据。本次开发虽然是4人合作完成,但是对于服务器端,我们则是每人都做了一份,后来使用了其中一人的代码。因为前期的服务端实属于一个web的B/S应用,我们在借用了那个服务端后,需要进行微小的修改才能使其与android客户端进行数据交互。而我在本次android的开发中,目前的工作则是主要负责客户端和服务器端得数据交互。
由于JAVA的水平太烂,所以我们写服务端的时候就单纯的使用了struts来做,对于android一样是没用什么技术,单纯使用json传送数据,不过我们借用了google的Gson jar包(因为确实好用多了)。这样以来,我们客户端和服务器的数据交互就显得有点繁琐。说了很多废话,下面说说实际的问题吧:
android客户端想服务器发送数据时,因为服务器使用struts,所以我们就和web上的数据发送一样,将客户端发送的数据以Map<String,String>的形式,只要确保Map的键很服务器端的数据名称一致就ok了。这样服务器就可以得到客户端的数据了,而服务器在对客户端的数据进行验证后还需要给客户端发送应答。这块本来是用struts可以直接将返回数据通过Json让客户端得到,但是这块没成功,所以就还是使用了原始的显式发送数据包的方式。而且单纯的JSON类好像不是很好用,测试几次都没成功,所以就放弃了。。。大神要是成功了求教呀!!
好了,代码如下:
服务器端:
Class UserInfo{
private String userName;
private Date birthday;
private int height;
//本来是想直接返回的,但是没成功代码就没改
private Map<String,Object> res=new HashMap<String,Object>();
各个属性的set和get方法;
public String Validate(){
String flag=ERROR;
result.clear();
在这里各个属性就是客户端发送的数据,可以直接进行验证。
if(成功) res.put("res","success");
else res.put("res","error");
//调用发送的工具类
SendMessage.sendMsg(res);
res.clear();
return flag;
}
public String getAll_Data(){
String flag=ERROR;
//将发送的所有UserInfo的数据存入userInfoList。
List<UserInfo> userInfoList=从数据库拿出数据;
List<Object> jsonList=new ArrayList<Object>();
Gson gson=new GsonBuilder().setDateFormat().create();
for(int i=0;i<userInfoList.size();i++)
jsonList.add(gson.toJson(userInfoList.get(i)));
res.put("res",jsonList);</span>
SendMessage.sendMsg(res);
res.clear();
flag=SUCCESS;
return flag;
}
}
class final SendMessage{
private final static void sendMsg(Object obj){
JSONObject json=JSONObject.fromObject(obj);
byte[] jsonMsg;
try {
jsonMsg = json.toString().getBytes("UTF-8");
response=ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
response.setContentType("json/text;charSet=UTF-8");
response.setContentLength(jsonMsg.length);
response.getOutputStream().write(jsonMsg);
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (UnsupportedEncodingException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<pre name="code" class="java">android客户端:
<span style="font-size:12px;">class MainActivity{
public void onCreate(){
前面的什么各种加载界面就不说了,现在界面上有三个交互的数据框,在提交按钮的监听事件里做如下代码;
<span style="color:#FF0000;">发送数据:</span>
Map<String,String> param =new HashMap<String,String>();
param.put("userName",第一个数据框的值);
param.put("birthday",第二个数据框的值);
</span><pre name="code" class="java"><span style="font-size:12px;"> param.put("height",第三个数据框的值);
//使用工具类发送数据给服务器并得到json
Gson gson=new GsonBuilder().setDateFormat().cretae();</span>
<span style="font-size:12px;">
</span><p><span style="font-size:12px;">String url1=HttpUtils.BASE_URL + 调用的服务端的strut中的action的name名字;</span></p><span style="font-size:12px;">
String json1=HttpUtil.postRequest(url1,param);
JSONObject js1=new JSONObject(new JSONObject(json1).getString("res"));
//客户端得到了服务器回发的验证信息
String url2=HttpUtils.BASE_URL + 调用的服务端的strut中的action的name名字;
<span style="color:#FF0000;">List<UserInfo> userList=new ArrayList<UserInfo>();
String json2=HttpUtil.getRequest(url2);
JSONObject js2=new JSONObject(json2);
JSONAraay jsonArray=js2.getJsonArray(“res”);
for(int i=0;i<jsonArray.length();i++){
UserInfo user=gson.fromJson(jsonArray.get(i).toString,UserInfo.class);
userList.add(user);
}</span>
//客户端就得到服务器发送的数据了
}
工具类:
public class HttpUtils {
//服务端的url
public static String BASE_URL = "http://127.0.0.1:8080/ProductManagmentSystem/";
public static HttpClient httpClient = new DefaultHttpClient();
public static String getRquest(String url) throws ClientProtocolException,
IOException {
HttpGet get = new HttpGet(url);
get.addHeader("Accept", "text/json");
HttpResponse httpResponse = httpClient.execute(get);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
String json = EntityUtils.toString(httpEntity, "UTF-8");
return json;
}
return null;
}
public static String postRequest(String url,Map<String, String> param) throws ClientProtocolException, IOException, URISyntaxException{
HttpPost post = new HttpPost(url);
post.addHeader("Accept", "text/json");
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (String nameValuePair : param.keySet()) {
params.add(new BasicNameValuePair(nameValuePair, param.get(nameValuePair)));
}
post.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
HttpResponse httpResponse = httpClient.execute(post);
if(httpResponse.getStatusLine().getStatusCode()==200){
HttpEntity httpEntity = httpResponse.getEntity();
String json = EntityUtils.toString(httpEntity, "UTF-8");
return json;
}
return null;
}
}</span>