Android开发一客户端与服务器交互(登陆功能)

  1. <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">学习来源:网易云课堂《Android Client与Service的数据交互》</span>  

这两天在学习客户端与服务器的交互,简单做了登陆功能。

#准备工作:

1, 搭建JavaEE开发环境,下载对应eclipse

2, 安装Tomcat

3, 安装tomcat eclipse插件,http://www.eclipsetotale.com/tomcatPlugin/


#直接开始:

1, 新建dynamic web project, 一路默认吧

2, 根据课程指导,将tomcat-->lib文件夹下的三个文件放到工程目录(WebContent-->lib)中:

* el-api.jar; jsp-api.jar; servlet-api.jar

3, src文件夹下,新建包和类,类LoginServlet4Android扩展HttpServlet

新建以后就会有,两个主要的实现方法==========================


[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.     System.out.println("---get---");  
  3.     this.doPost(request, response);  
  4. }  
  5.   
  6. /** 
  7.  *  URL?para1=value1 2=value2&... 
  8.  */  
  9. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {      //   
  10.       
  11.     //  
  12.     request.setCharacterEncoding("UTF-8");  
  13.       
  14.     //  
  15.     String loginName = request.getParameter("LoginName");  
  16.     String loginPassWord = request.getParameter("LoginPassWord");  
  17.       
  18.     /** 
  19.      * text/html 
  20.      */  
  21.     response.setCharacterEncoding("UTF-8");  
  22.     response.setContentType("text/html; charset=UTF-8");   
  23.     PrintWriter out = null;  
  24.     /** 
  25.      * Login logical judge 
  26.      */  
  27.     DataOutputStream output = new DataOutputStream(response.getOutputStream());  
  28.     try{  
  29.         out = response.getWriter();  
  30.         if(loginName.equals("sun") && loginPassWord.equals("011"))  
  31.         {  
  32.             //right to client  response..  
  33.             output.writeUTF("server data: success!");  
  34.             output.writeInt(1);  
  35.         }  
  36.         else  
  37.         {  
  38.             //wrong  
  39.             output.writeUTF("server data: fail!");  
  40.             out.print("failed");  
  41.         }  
  42.     }  
  43.     finally  
  44.     {  
  45.         if(out != null)  
  46.             out.close();  
  47.         if(output != null)  
  48.             output.close();  
  49.     }  
  50.       
  51. }  

服务器端的代码比较简单,主要在doPost中接收数据,并验证。后期希望能有一个数据库存放相应的数据。

------------------------------------------------------------------------------------------------------------------------------------------------------

Android端的实现:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.example.service;  
  2.   
  3. import java.lang.ref.WeakReference;  
  4.   
  5. import com.example.mapsun.LoginActivity;  
  6.   
  7. import android.app.Activity;  
  8. import android.app.ProgressDialog;  
  9. import android.os.AsyncTask;  
  10.   
  11. public class LoginAsyncTask extends AsyncTask<Object, Object, Object> {  
  12.   
  13.     boolean result = true;  
  14.     String g_loginName, g_loginPassword;  
  15.     private final WeakReference<Activity> mActivity;  
  16.     private static ProgressDialog dialog;  
  17.       
  18.     public LoginAsyncTask(LoginActivity activity, String loginName, String loginPassword)  
  19.     {  
  20.         g_loginName = loginName;  
  21.         g_loginPassword = loginPassword;  
  22.         mActivity = new WeakReference<Activity>(activity);  
  23.     }  
  24.       
  25.     @Override    
  26.     protected void onPreExecute() {    
  27.         if(null == dialog){  
  28.             dialog = new ProgressDialog(mActivity.get());  
  29.         }  
  30.         dialog.setTitle("please wait");  
  31.         dialog.setMessage("Logining...");  
  32.         dialog.setCancelable(false);  
  33.         dialog.show();  
  34.     }    
  35.       
  36.   
  37.   
  38.   
  39.     @Override  
  40.     protected Object doInBackground(Object... arg0) {  
  41.         // TODO Auto-generated method stub  
  42.         UserService userServ  = new UserServiceImpl();  
  43.         try {  
  44.             result = userServ.userLogin(g_loginName, g_loginPassword);  
  45.         } catch (Exception e) {  
  46.             // TODO Auto-generated catch block  
  47.             e.printStackTrace();  
  48.         }  
  49.         return result;  
  50.     }  
  51.       
  52.     //  
  53.     protected void onPostExecute(Object result) {  
  54.           
  55.         //获得服务器返回信息成功后  
  56.         String strMsg;  
  57.         if(result.equals(true))  
  58.         {  
  59.             strMsg = "success";  
  60.         }  
  61.         else  
  62.             strMsg = "failed";  
  63.         ((LoginActivity)mActivity.get()).ShowTip(strMsg);  
  64.         //取消进度条  
  65.         dialog.cancel();  
  66.     }  
  67. }  

这里实现了一个继承AsyncTask的类, 异步去发送服务器的请求,在构造函数中传递界面的一些参数,从而实现界面的一些变化。

这个类我之前的博客中也用来实现过异步加载显示图片的操作。挺好用的,其实底层页封装了Handler的一些操作。


好了,今天就粗略的贴一下这两天的实现代码,虽然Android手机还是不能访问电脑上的服务器,昨天还可以的。。


=======================补充:UserService的userLogin功能实现=============2014-12-10=============================

主要是接收服务器端的数据操作,代码如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.example.service;  
  2.   
  3. public class UserServiceImpl implements UserService {  
  4.   
  5.     private static final String TAG = "UserServiceImplement";  
  6.       
  7.     @Override  
  8.     public boolean userLogin(String loginName, String loginPassword)  
  9.             throws Exception {  
  10.         // TODO Auto-generated method stub  
  11.           
  12.           
  13.         String result;  
  14.         HttpPost httpPost = new HttpPost(UriAPI.HTTPCustomer);  
  15.           
  16.         //create params  
  17.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  18.         params.add(new BasicNameValuePair("LoginName", loginName));  
  19.         params.add(new BasicNameValuePair("LoginPassWord", loginPassword));  
  20.           
  21.         try{  
  22.             //encode data  
  23.             httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));  
  24.             HttpResponse httpResp = new DefaultHttpClient().execute(httpPost);  
  25.             //get response   
  26.             if (httpResp.getStatusLine().getStatusCode()==200) {  
  27.                              byte[] data =new byte[2048];  
  28.                              data =EntityUtils.toByteArray((HttpEntity)httpResp.getEntity());  
  29.                              ByteArrayInputStream bais = new ByteArrayInputStream(data);  
  30.                              DataInputStream dis = new DataInputStream(bais);  
  31.                              result=new String(dis.readUTF());  
  32.                                   Log.i("service result:", result);  
  33.                              return true;  
  34.             }  
  35.               
  36.         }catch(ClientProtocolException e){    
  37.             e.printStackTrace();    
  38.         }catch(UnsupportedEncodingException e){    
  39.             e.printStackTrace();    
  40.         } catch (IOException e) {    
  41.             e.printStackTrace();    
  42.         }    
  43.         return false;  
  44.     }  
  45.       
  46.   
  47.   
  48.     public class UriAPI{  
  49.         //  
  50.         public static final String HTTPCustomer = "http://192.168.0.56:8080/firstweb/login.do";  
  51.     }  
  52. }  


总结:登陆功能主要熟悉了服务端的HttpServlet的操作,其中还学习了Java web相关的一些基础,和Android客户端HttpPost的实现,回顾了了AsyncTask类,以及一些Android基本的内容,算是这个项目的开始吧。

另外,上述代码中存在很多细节问题,先放一放,后面会专注在Android客户端上的功能实现,包括界面布局,拍照功能,GPS轨迹等。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值