用android搭建客户端+手机和服务器交互开发实例

xtp1211 贡献于2013-10-15

作者 tomtree  创建于2012-04-11 15:43:00   修改者栋栋仔  修改于2012-04-12 02:31:00字数8208

文档摘要:首先在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以我就用装了一个JSON插件 。这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端 。
关键词:

栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔   首先在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以我就用装了一个JSON插件 。这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端 。以下是代码:   首先,在服务器端搭建好SSH框架,具体细节就不在陈述 。struts.xml配置如下: 1 name="login"extends="json-default"> 2 "login"class="com.jclick.test.LoginAction"method="login"> 3 < span>"json">< span>"includeProperties">result 4 package> 5 o < span>"login"extends="json-default"> "login"class="com.jclick.test.LoginAction"method="login"> § < span>"json">< span>"includeProperties">result o o package> 6   手机端的代码如下:   首先,手机端有一个缓存类,主要用于缓存一些手机端需要访问的数据,这样的好处是可以达达节省手机和服务器的交互,用单例实现的: 7 packagecom.jclick.cache; 8 9 importcom.jclick.bean.User; 10 11 publicclassCache{ 12 13 privateUserUser; 14 15 privateCache(){ 16 17 } 18 /**构造单例*/ 19 privatestaticclassCacheHolder{ 20 privatestaticfinalCacheINSTANCE=newCache(); 21 } 22 publicCachegetInstance(){ 23 returnCacheHolder.INSTANCE; 24 } 25 publicUsergetUser(){ 26 returnUser; 27 } 28 publicvoidsetUser(UserUser){ –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 29 this.User=User; 30 } 31 32 } 33 34 packagecom.jclick.cache; 35 36 importcom.jclick.bean.User; 37 38 publicclassCache{ 39 40 privateUserUser; 41 42 privateCache(){ 43 44 } 45 /**构造单例*/ 46 privatestaticclassCacheHolder{ 47 privatestaticfinalCacheINSTANCE=newCache(); 48 } 49 publicCachegetInstance(){ 50 returnCacheHolder.INSTANCE; 51 } 52 publicUsergetUser(){ 53 returnUser; 54 } 55 publicvoidsetUser(UserUser){ 56 this.User=User; 57 } 58 59 }   接着开始书写手机端的协议,用户向服务器发送请求,同时服务器反馈给手机端信息的: 60 packagecom.jclick.protocol; 61 62 importjava.io.BufferedReader; 63 importjava.io.InputStreamReader; 64 importjava.util.ArrayList; 65 importjava.util.List; 66 67 importorg.apache.http.HttpResponse; 68 importorg.apache.http.NameValuePair; –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 69 importorg.apache.http.client.HttpClient; 70 importorg.apache.http.client.entity.UrlEncodedFormEntity; 71 importorg.apache.http.client.methods.HttpPost; 72 importorg.apache.http.impl.client.DefaultHttpClient; 73 importorg.apache.http.message.BasicNameValuePair; 74 importorg.json.JSONException; 75 importorg.json.JSONObject; 76 77 publicclassBaseProtocol{ 78 privateStringBuildersb=newStringBuilder(); 79 80 privateHttpClienthttpClient; 81 privateHttpPosthttpRequest; 82 privateHttpResponseresponse; 83 84 privateListnameValuePair=newArrayList(); 85 86 BaseProtocol(){ 87 httpClient=newDefaultHttpClient(); 88 } 89 90 /** 91 *向服务器端发送请求 92 * 93 *@paramurl 94 *@throwsException 95 */ 96 protectedvoidpack(Stringurl)throwsException{ 97 httpClient=newDefaultHttpClient(); 98 httpRequest=newHttpPost(url); 99 100 httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair)); 101 response=httpClient.execute(httpRequest); 102 } 103 104 /** 105 *得到返回数据 106 * 107 *@paramurl 108 *@return 109 *@throwsException –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 110 */ 111 protectedvoidparse()throwsException{ 112 //TODO状态处理500200 113 if(response.getStatusLine().getStatusCode()==200){ 114 115 BufferedReaderbufferedReader2=newBufferedReader( 116 newInputStreamReader(response.getEntity().getContent())); 117 for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2 118 .readLine()){ 119 sb.append(s); 120 } 121 } 122 } 123 124 /** 125 *向服务器发送信息 126 * 127 *@paramkey 128 *@paramvalue 129 */ 130 publicvoidaddNameValuePair(Stringkey,Stringvalue){ 131 nameValuePair.add(newBasicNameValuePair(key,value)); 132 } 133 134 /** 135 *返回JSONObject对象数据模型 136 * 137 *@return 138 *@throwsJSONException 139 */ 140 publicJSONObjectgetJSON()throwsJSONException{ 141 returnnewJSONObject(sb.toString()); 142 } 143 144 } 145 146 packagecom.jclick.protocol; 147 148 importjava.io.BufferedReader; 149 importjava.io.InputStreamReader; 150 importjava.util.ArrayList; –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 151 importjava.util.List; 152 153 importorg.apache.http.HttpResponse; 154 importorg.apache.http.NameValuePair; 155 importorg.apache.http.client.HttpClient; 156 importorg.apache.http.client.entity.UrlEncodedFormEntity; 157 importorg.apache.http.client.methods.HttpPost; 158 importorg.apache.http.impl.client.DefaultHttpClient; 159 importorg.apache.http.message.BasicNameValuePair; 160 importorg.json.JSONException; 161 importorg.json.JSONObject; 162 163 publicclassBaseProtocol{ 164 privateStringBuildersb=newStringBuilder(); 165 166 privateHttpClienthttpClient; 167 privateHttpPosthttpRequest; 168 privateHttpResponseresponse; 169 170 privateListnameValuePair=newArrayList(); 171 172 BaseProtocol(){ 173 httpClient=newDefaultHttpClient(); 174 } 175 176 /** 177 *向服务器端发送请求 178 * 179 *@paramurl 180 *@throwsException 181 */ 182 protectedvoidpack(Stringurl)throwsException{ 183 httpClient=newDefaultHttpClient(); 184 httpRequest=newHttpPost(url); 185 186 httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair)); 187 response=httpClient.execute(httpRequest); 188 } 189 190 /** 191 *得到返回数据 –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 192 * 193 *@paramurl 194 *@return 195 *@throwsException 196 */ 197 protectedvoidparse()throwsException{ 198 //TODO状态处理500200 199 if(response.getStatusLine().getStatusCode()==200){ 200 201 BufferedReaderbufferedReader2=newBufferedReader( 202 newInputStreamReader(response.getEntity().getContent())); 203 for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2 204 .readLine()){ 205 sb.append(s); 206 } 207 } 208 } 209 210 /** 211 *向服务器发送信息 212 * 213 *@paramkey 214 *@paramvalue 215 */ 216 publicvoidaddNameValuePair(Stringkey,Stringvalue){ 217 nameValuePair.add(newBasicNameValuePair(key,value)); 218 } 219 220 /** 221 *返回JSONObject对象数据模型 222 * 223 *@return 224 *@throwsJSONException 225 */ 226 publicJSONObjectgetJSON()throwsJSONException{ 227 returnnewJSONObject(sb.toString()); 228 } 229 230 }   接着是登陆协议,在这里我只是模拟登陆使用的一个类,仅供大家参考: 231 packagecom.jclick.protocol; –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 232 233 importorg.json.JSONObject; 234 235 importcom.jclick.bean.User; 236 237 publicclassLoginProtocolextendsBaseProtocol{ 238 239 privatefinalstaticStringURL="http://localhost:8080/test/login"; 240 241 publicbooleancheckLogin(Userusr){ 242 try{ 243 pack(URL); 244 parse(); 245 JSONObjectobj=this.getJSON(); 246 if(obj.getString("result").equals("failed")){ 247 returnfalse; 248 }else{ 249 returntrue; 250 } 251 }catch(Exceptione){ 252 e.printStackTrace(); 253 returnfalse; 254 } 255 } 256 257 } 258 259 packagecom.jclick.protocol; 260 261 importorg.json.JSONObject; 262 263 importcom.jclick.bean.User; 264 265 publicclassLoginProtocolextendsBaseProtocol{ 266 267 privatefinalstaticStringURL="http://localhost:8080/test/login"; 268 269 publicbooleancheckLogin(Userusr){ 270 try{ 271 pack(URL); 272 parse(); –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 273 JSONObjectobj=this.getJSON(); 274 if(obj.getString("result").equals("failed")){ 275 returnfalse; 276 }else{ 277 returntrue; 278 } 279 }catch(Exceptione){ 280 e.printStackTrace(); 281 returnfalse; 282 } 283 } 284 285 }   然后是User实体类,主要用于保存用户信息: 286 packagecom.jclick.bean; 287 288 publicclassUser{ 289 privateStringusername; 290 privateStringpassword; 291 publicStringgetUsername(){ 292 returnusername; 293 } 294 publicvoidsetUsername(Stringusername){ 295 this.username=username; 296 } 297 publicStringgetPassword(){ 298 returnpassword; 299 } 300 publicvoidsetPassword(Stringpassword){ 301 this.password=password; 302 } 303 304 } 305 306 packagecom.jclick.bean; 307 308 publicclassUser{ 309 privateStringusername; 310 privateStringpassword; 311 publicStringgetUsername(){ 312 returnusername; –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 313 } 314 publicvoidsetUsername(Stringusername){ 315 this.username=username; 316 } 317 publicStringgetPassword(){ 318 returnpassword; 319 } 320 publicvoidsetPassword(Stringpassword){ 321 this.password=password; 322 } 323 324 }   最后就是LoginActivity里边判断登陆的代码了,详细代码不再贴出来了,仅贴一个判断登陆的代码: 325 privatevoidcheckedData(){ 326 username=((EditText)findViewById(R.id.username)).getText().toString(); 327 password=((EditText)findViewById(R.id.password)).getText().toString(); 328 329 Useruser=newUser(); 330 user.setUsername(username); 331 user.setPassword(password); 332 LoginProtocollogin=newLoginProtocol(); 333 booleanresult=login.checkLogin(user); 334 335 if(result){SpiderCache.getInstance().setUserSession(user); 336 Toast.makeText(getApplicationContext(),"登录成功",1000).show(); 337 Intentintent=newIntent(); 338 intent.setClass(LoginActivity.this,WelcomeActivity.class); 339 startActivity(intent); 340 }else{Toast.makeText(LoginActivity.this,"密码或用户名不匹配,请重新输入!",1000).show(); 341 } 342 } 343 344 privatevoidcheckedData(){ 345 username=((EditText)findViewById(R.id.username)).getText().toString(); 346 password=((EditText)findViewById(R.id.password)).getText().toString(); 347 348 Useruser=newUser(); 349 user.setUsername(username); 350 user.setPassword(password); –– 栋栋仔Android学习宝典 苔花如米小 也学牡丹开 栋栋仔 351 LoginProtocollogin=newLoginProtocol(); 352 booleanresult=login.checkLogin(user); 353 354 if(result){ SpiderCache.getInstance().setUserSession(user); 355 Toast.makeText(getApplicationContext(),"登录成功",1000).show(); 356 Intentintent=newIntent(); 357 intent.setClass(LoginActivity.this,WelcomeActivity.class); 358 startActivity(intent); 359 }else{ Toast.makeText(LoginActivity.this,"密码或用户名不匹配,请重新输入!",1000).show(); 360 } 361 }   以上代码为了跟大家分享一下,感觉手机端和服务器双向开发非常过瘾 。同时对Android的兴趣大大提升,它也没有我们想象中的那么难 。 ––

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档