用Android搭建客戶端 手機(jī)和服務(wù)器交互開發(fā)實(shí)例
筆者以前是學(xué)的Java EE,由于項(xiàng)目需要要開發(fā)Android,所以臨時(shí)補(bǔ)了一個(gè)多星期,主要是手機(jī)端和服務(wù)器端交互,雙向開發(fā)的。
首先在服務(wù)器端,我采用的是SSH框架,struts 2集合了JSON插件,服務(wù)器和客戶端的信息交互采用的JSON來傳輸,由于在服務(wù)器端用了Struts 2,所以我就用裝了一個(gè)JSON插件。這樣,很輕易的就把服務(wù)器端的信息用JSON的形式發(fā)送到了手機(jī)端。以下是代碼:
首先,在服務(wù)器端搭建好SSH框架,具體細(xì)節(jié)就不在陳述。struts.xml配置如下:
- <packagename="login"extends="json-default">
- <actionname="login"class="com.jclick.test.LoginAction"method="login">
- <resulttype="json"><paramname="includeProperties">result</param></result>
- </action>
- </package>
- <packagename="login"extends="json-default">
- <actionname="login"class="com.jclick.test.LoginAction"method="login">
- <resulttype="json"><paramname="includeProperties">result</param></result>
- </action>
- </package>
手機(jī)端的代碼如下:
首先,手機(jī)端有一個(gè)緩存類,主要用于緩存一些手機(jī)端需要訪問的數(shù)據(jù),這樣的好處是可以達(dá)達(dá)節(jié)省手機(jī)和服務(wù)器的交互,用單例實(shí)現(xiàn)的:
- packagecom.jclick.cache;
- importcom.jclick.bean.User;
- publicclassCache{
- privateUserUser;
- privateCache(){
- }
- /**構(gòu)造單例*/
- privatestaticclassCacheHolder{
- privatestaticfinalCacheINSTANCE=newCache();
- }
- publicCachegetInstance(){
- returnCacheHolder.INSTANCE;
- }
- publicUsergetUser(){
- returnUser;
- }
- publicvoidsetUser(UserUser){
- this.User=User;
- }
- }
- packagecom.jclick.cache;
- importcom.jclick.bean.User;
- publicclassCache{
- privateUserUser;
- privateCache(){
- }
- /**構(gòu)造單例*/
- privatestaticclassCacheHolder{
- privatestaticfinalCacheINSTANCE=newCache();
- }
- publicCachegetInstance(){
- returnCacheHolder.INSTANCE;
- }
- publicUsergetUser(){
- returnUser;
- }
- publicvoidsetUser(UserUser){
- this.User=User;
- }
- }
接著開始書寫手機(jī)端的協(xié)議,用戶向服務(wù)器發(fā)送請求,同時(shí)服務(wù)器反饋給手機(jī)端信息的:
- packagecom.jclick.protocol;
- importjava.io.BufferedReader;
- importjava.io.InputStreamReader;
- importjava.util.ArrayList;
- importjava.util.List;
- importorg.apache.http.HttpResponse;
- importorg.apache.http.NameValuePair;
- importorg.apache.http.client.HttpClient;
- importorg.apache.http.client.entity.UrlEncodedFormEntity;
- importorg.apache.http.client.methods.HttpPost;
- importorg.apache.http.impl.client.DefaultHttpClient;
- importorg.apache.http.message.BasicNameValuePair;
- importorg.json.JSONException;
- importorg.json.JSONObject;
- publicclassBaseProtocol{
- privateStringBuildersb=newStringBuilder();
- privateHttpClienthttpClient;
- privateHttpPosthttpRequest;
- privateHttpResponseresponse;
- privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();
- BaseProtocol(){
- httpClient=newDefaultHttpClient();
- }
- /**
- *向服務(wù)器端發(fā)送請求
- *
- *@paramurl
- *@throwsException
- */
- protectedvoidpack(Stringurl)throwsException{
- httpClient=newDefaultHttpClient();
- httpRequest=newHttpPost(url);
- httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));
- response=httpClient.execute(httpRequest);
- }
- /**
- *得到返回?cái)?shù)據(jù)
- *
- *@paramurl
- *@return
- *@throwsException
- */
- protectedvoidparse()throwsException{
- //TODO狀態(tài)處理500200
- if(response.getStatusLine().getStatusCode()==200){
- BufferedReaderbufferedReader2=newBufferedReader(
- newInputStreamReader(response.getEntity().getContent()));
- for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2
- .readLine()){
- sb.append(s);
- }
- }
- }
- /**
- *向服務(wù)器發(fā)送信息
- *
- *@paramkey
- *@paramvalue
- */
- publicvoidaddNameValuePair(Stringkey,Stringvalue){
- nameValuePair.add(newBasicNameValuePair(key,value));
- }
- /**
- *返回JSONObject對象數(shù)據(jù)模型
- *
- *@return
- *@throwsJSONException
- */
- publicJSONObjectgetJSON()throwsJSONException{
- returnnewJSONObject(sb.toString());
- }
- }
- packagecom.jclick.protocol;
- importjava.io.BufferedReader;
- importjava.io.InputStreamReader;
- importjava.util.ArrayList;
- importjava.util.List;
- importorg.apache.http.HttpResponse;
- importorg.apache.http.NameValuePair;
- importorg.apache.http.client.HttpClient;
- importorg.apache.http.client.entity.UrlEncodedFormEntity;
- importorg.apache.http.client.methods.HttpPost;
- importorg.apache.http.impl.client.DefaultHttpClient;
- importorg.apache.http.message.BasicNameValuePair;
- importorg.json.JSONException;
- importorg.json.JSONObject;
- publicclassBaseProtocol{
- privateStringBuildersb=newStringBuilder();
- privateHttpClienthttpClient;
- privateHttpPosthttpRequest;
- privateHttpResponseresponse;
- privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();
- BaseProtocol(){
- httpClient=newDefaultHttpClient();
- }
- /**
- *向服務(wù)器端發(fā)送請求
- *
- *@paramurl
- *@throwsException
- */
- protectedvoidpack(Stringurl)throwsException{
- httpClient=newDefaultHttpClient();
- httpRequest=newHttpPost(url);
- httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));
- response=httpClient.execute(httpRequest);
- }
- /**
- *得到返回?cái)?shù)據(jù)
- *
- *@paramurl
- *@return
- *@throwsException
- */
- protectedvoidparse()throwsException{
- //TODO狀態(tài)處理500200
- if(response.getStatusLine().getStatusCode()==200){
- BufferedReaderbufferedReader2=newBufferedReader(
- newInputStreamReader(response.getEntity().getContent()));
- for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2
- .readLine()){
- sb.append(s);
- }
- }
- }
- /**
- *向服務(wù)器發(fā)送信息
- *
- *@paramkey
- *@paramvalue
- */
- publicvoidaddNameValuePair(Stringkey,Stringvalue){
- nameValuePair.add(newBasicNameValuePair(key,value));
- }
- /**
- *返回JSONObject對象數(shù)據(jù)模型
- *
- *@return
- *@throwsJSONException
- */
- publicJSONObjectgetJSON()throwsJSONException{
- returnnewJSONObject(sb.toString());
- }
- }
接著是登陸協(xié)議,在這里我只是模擬登陸使用的一個(gè)類,僅供大家參考:
- packagecom.jclick.protocol;
- importorg.json.JSONObject;
- importcom.jclick.bean.User;
- publicclassLoginProtocolextendsBaseProtocol{
- privatefinalstaticStringURL="http://localhost:8080/test/login";
- publicbooleancheckLogin(Userusr){
- try{
- pack(URL);
- parse();
- JSONObjectobj=this.getJSON();
- if(obj.getString("result").equals("failed")){
- returnfalse;
- }else{
- returntrue;
- }
- }catch(Exceptione){
- e.printStackTrace();
- returnfalse;
- }
- }
- }
- packagecom.jclick.protocol;
- importorg.json.JSONObject;
- importcom.jclick.bean.User;
- publicclassLoginProtocolextendsBaseProtocol{
- privatefinalstaticStringURL="http://localhost:8080/test/login";
- publicbooleancheckLogin(Userusr){
- try{
- pack(URL);
- parse();
- JSONObjectobj=this.getJSON();
- if(obj.getString("result").equals("failed")){
- returnfalse;
- }else{
- returntrue;
- }
- }catch(Exceptione){
- e.printStackTrace();
- returnfalse;
- }
- }
- }
然后是User實(shí)體類,主要用于保存用戶信息:
- packagecom.jclick.bean;
- publicclassUser{
- privateStringusername;
- privateStringpassword;
- publicStringgetUsername(){
- returnusername;
- }
- publicvoidsetUsername(Stringusername){
- this.username=username;
- }
- publicStringgetPassword(){
- returnpassword;
- }
- publicvoidsetPassword(Stringpassword){
- this.password=password;
- }
- }
- packagecom.jclick.bean;
- publicclassUser{
- privateStringusername;
- privateStringpassword;
- publicStringgetUsername(){
- returnusername;
- }
- publicvoidsetUsername(Stringusername){
- this.username=username;
- }
- publicStringgetPassword(){
- returnpassword;
- }
- publicvoidsetPassword(Stringpassword){
- this.password=password;
- }
- }
最后就是LoginActivity里邊判斷登陸的代碼了,詳細(xì)代碼不再貼出來了,僅貼一個(gè)判斷登陸的代碼:
- privatevoidcheckedData(){
- username=((EditText)findViewById(R.id.username)).getText().toString();
- password=((EditText)findViewById(R.id.password)).getText().toString();
- Useruser=newUser();
- user.setUsername(username);
- user.setPassword(password);
- LoginProtocollogin=newLoginProtocol();
- booleanresult=login.checkLogin(user);
- if(result){SpiderCache.getInstance().setUserSession(user);
- Toast.makeText(getApplicationContext(),"登錄成功",1000).show();
- Intentintent=newIntent();
- intent.setClass(LoginActivity.this,WelcomeActivity.class);
- startActivity(intent);
- }else{Toast.makeText(LoginActivity.this,"密碼或用戶名不匹配,請重新輸入!",1000).show();
- }
- }
- privatevoidcheckedData(){
- username=((EditText)findViewById(R.id.username)).getText().toString();
- password=((EditText)findViewById(R.id.password)).getText().toString();
- Useruser=newUser();
- user.setUsername(username);
- user.setPassword(password);
- LoginProtocollogin=newLoginProtocol();
- booleanresult=login.checkLogin(user);
- if(result){ SpiderCache.getInstance().setUserSession(user);
- Toast.makeText(getApplicationContext(),"登錄成功",1000).show();
- Intentintent=newIntent();
- intent.setClass(LoginActivity.this,WelcomeActivity.class);
- startActivity(intent);
- }else{ Toast.makeText(LoginActivity.this,"密碼或用戶名不匹配,請重新輸入!",1000).show();
- }
- }
以上代碼為了跟大家分享一下,感覺手機(jī)端和服務(wù)器雙向開發(fā)非常過癮。同時(shí)對Android的興趣大大提升,它也沒有我們想象中的那么難。
【編輯推薦】