Android客户端与服务端交互之登陆示例

15 篇文章 0 订阅

今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的

1.后台使用简单的servlet,支持GET或POST。这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功。

  servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径

 我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便android客户端访问

<servlet>
    <servlet-name>helloWorld</servlet-name>
    <servlet-class>com.zhongzhong.wap.action.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloWorld</servlet-name>
    <url-pattern>/queryOrder</url-pattern>
  </servlet-mapping>
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zhongzhong.wap.bean.UserBean;

public class HelloServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    doPost(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    
     resp.setContentType("text/html");  
          PrintWriter out = resp.getWriter();  
          Boolean flag = false;    
          String userName = req.getParameter("un");  
          String password = req.getParameter("pw");   
          if(userName.equals("htp")&&password.equals("123"))
          {
          	flag = true;
          }
          
          else flag = false;
          System.out.println("userName:"+userName+" password:"+password);
          out.print(flag);  
          out.flush();  
          out.close(); 
  }

}

2.然后我是在安卓的ADT上创建一个安卓项目,

建立两个Activity,分别作为登录界面和登录成功界面。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context=".MainActivity" >

  <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="HelloWorld登陆示例" />

  <EditText
    android:id="@+id/et_user"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="33dp"
    android:ems="10"
    android:hint="请输入账号" >

    <requestFocus />
  </EditText>

  <EditText
    android:id="@+id/et_psw"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/et_user"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:ems="10"
    android:hint="请输入密码"
    android:inputType="textPassword" />

  <Button
    android:id="@+id/btn_login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/et_psw"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="37dp"
    android:text="登陆" />

</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context=".NaviActivity" >

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="46dp"
    android:text="登陆成功" />

</RelativeLayout>

3. HTTP的访问公共类,用于处理GET和POST请求

package com.example.logindemo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.content.Entity;
import android.util.Log;

public class HttpUtil {
  // 创建HttpClient对象
  public static HttpClient httpClient = new DefaultHttpClient();
  public static final String BASE_URL = "http://192.168.3.14:8090/HelloWord/";

  /**
   * 
   * @param url
   *            发送请求的URL
   * @return 服务器响应字符串
   * @throws Exception
   */
  public static String getRequest(String url) throws Exception {
    // 创建HttpGet对象。
    HttpGet get = new HttpGet(url);
    // 发送GET请求
    HttpResponse httpResponse = httpClient.execute(get);
    // 如果服务器成功地返回响应
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
      // 获取服务器响应字符串
      String result = EntityUtils.toString(httpResponse.getEntity());
      return result;
    } else {
      Log.d("服务器响应代码", (new Integer(httpResponse.getStatusLine()
          .getStatusCode())).toString());
      return null;
    }
  }

  /**
   * 
   * @param url
   *            发送请求的URL
   * @param params
   *            请求参数
   * @return 服务器响应字符串
   * @throws Exception
   */
  public static String postRequest(String url, Map<String, String> rawParams)
      throws Exception {
    // 创建HttpPost对象。
    HttpPost post = new HttpPost(url);
    // 如果传递参数个数比较多的话可以对传递的参数进行封装
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    for (String key : rawParams.keySet()) {
      // 封装请求参数
      params.add(new BasicNameValuePair(key, rawParams.get(key)));
    }
    // 设置请求参数
    post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    // 发送POST请求
    HttpResponse httpResponse = httpClient.execute(post);
    // 如果服务器成功地返回响应
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
      // 获取服务器响应字符串
      String result = EntityUtils.toString(httpResponse.getEntity());
      return result;
    }
    return null;
  }
}

4.

IntentService服务,用于在后台以队列方式处理耗时操作。

package com.example.logindemo;

import java.util.HashMap;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class ConnectService extends IntentService {
  private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";

  public ConnectService() {
    super("TestIntentService");
    // TODO Auto-generated constructor stub
  }
  
  @Override
  protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    /** 
     * 经测试,IntentService里面是可以进行耗时的操作的  
     * IntentService使用队列的方式将请求的Intent加入队列, 
     * 然后开启一个worker thread(线程)来处理队列中的Intent   
     * 对于异步的startService请求,IntentService会处理完成一个之后再处理第二个   
     */  
    Boolean flag = false;  
    //通过intent获取主线程传来的用户名和密码字符串  
    String username = intent.getStringExtra("username");  
    String password = intent.getStringExtra("password");  
    flag = doLogin(username, password);  
    Log.d("登录结果", flag.toString());  
      
    Intent broadcastIntent = new Intent();  
    broadcastIntent.setAction(ACTION_RECV_MSG);	
    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);	
    broadcastIntent.putExtra("result", flag.toString());  
    sendBroadcast(broadcastIntent);  

  }
  
   // 定义发送请求的方法  
  private Boolean doLogin(String username, String password)  
  {  
    String strFlag = "";  
    // 使用Map封装请求参数  
    HashMap<String, String> map = new HashMap<String, String>();  
    map.put("un", username);  
    map.put("pw", password);  
    // 定义发送请求的URL  
    String url = HttpUtil.BASE_URL + "queryOrder?un=" + username + "&pw=" + password;  //GET方式  
     // String url = HttpUtil.BASE_URL + "LoginServlet"; //POST方式  
    Log.d("url", url);  
    Log.d("username", username);  
    Log.d("password", password);  
    try {  
      // 发送请求  
      strFlag = HttpUtil.postRequest(url, map);  //POST方式  
//		  strFlag = HttpUtil.getRequest(url);  //GET方式  
      Log.d("服务器返回值", strFlag);  
    } catch (Exception e) {  
      // TODO Auto-generated catch block  
      e.printStackTrace();  
    }  
      
    if(strFlag.trim().equals("true")){  
      return true;  
    }else{  
      return false;  
    }  
      
  }  
}

5。

在AndroidManifest.xml中注册IntentService。注意uses-permission节点,为程序开启访问网络的权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.logindemo"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

  <uses-permission android:name="android.permission.INTERNET" />

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.example.logindemo.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity
      android:name="com.example.logindemo.NaviActivity"
      android:label="@string/title_activity_navi" >
    </activity>

    <service android:name="com.example.logindemo.ConnectService" >
    </service>
  </application>

</manifest>

6.登陆界面处理,注意

  1. 按钮监听事件中,使用Intent将要传递的值传给service 。
  2. 接收广播类中,同样使用Intent将要传递的值传给下一个Activity。
  3. 在onCreate()中,动态注册接收广播类的实例receiver。
  4. 在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver()? 的异常。
package com.example.logindemo;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
   private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";
  private Button loginBtn;
  private EditText et_username;
  private EditText et_password;
  private String userName;
  private String passWord;
  private MessageReceiver receiver ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    //动态注册receiver    
  IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);    
  filter.addCategory(Intent.CATEGORY_DEFAULT);    
  receiver = new MessageReceiver();    
  registerReceiver(receiver, filter); 
  }
  
  private void initView() {
    // TODO Auto-generated method stub
    et_username = (EditText)findViewById(R.id.et_user);
    et_password =( EditText)findViewById(R.id.et_psw);
    loginBtn = (Button)findViewById(R.id.btn_login);
    loginBtn.setOnClickListener(new OnClickListener() {
      
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        if(matchLoginMsg())
        {
          // 如果校验成功  
        Intent msgIntent = new Intent(MainActivity.this, ConnectService.class);  
        msgIntent.putExtra("username", et_username.getText().toString().trim());  
        msgIntent.putExtra("password", et_password.getText().toString().trim());  
        startService(msgIntent); 
        }
        
      }
    });
  }
  
  protected boolean matchLoginMsg() {
    // TODO Auto-generated method stub
    userName = et_username.getText().toString().trim();
    passWord = et_password.getText().toString().trim();
    if(userName.equals(""))
    {
      Toast.makeText(MainActivity.this, "账号不能为空",Toast.LENGTH_SHORT).show();
      return false;
    }
    if(passWord.equals(""))
    {
      Toast.makeText(MainActivity.this, "密码不能为空",Toast.LENGTH_SHORT).show();
      return false;
    }
    return true;
  }
  //接收广播类    
    public class MessageReceiver extends BroadcastReceiver {    
  @Override    
  public void onReceive(Context context, Intent intent) {    
     String message = intent.getStringExtra("result");    
     Log.i("MessageReceiver", message);  
  // 如果登录成功  
      if (message.equals("true")){  
    // 启动Main Activity  
    Intent nextIntent = new Intent(MainActivity.this, NaviActivity.class);  
    startActivity(nextIntent);  
    // 结束该Activity  
    finish();  
    //注销广播接收器  
    context.unregisterReceiver(this);  
      }else{  
      	Toast.makeText(MainActivity.this, "用户名或密码错误,请重新输入!",Toast.LENGTH_SHORT).show(); 
      }  
        
  }    
    }    
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值