zoukankan      html  css  js  c++  java
  • android-async-http框架之与服务器进行数据交互

    一 服务器准备:

      本文使用Tomcat 6做服务器。

      本文搭建服务器端使用MyEclipse 10。

      首先准备好Tomcat 6与MyEclipse 10,并且将服务器配置到MyEclipse中,对于长期做JavaWeb的同学来说,当然知道了,在此不做赘述了。

      新建Web项目MyDemo,代码如下:

      然后在项目中新建一个Servlet,具体如下:

      Login.java:

     1 package cn.clear.demo;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 public class Login extends HttpServlet {
    11   
    12     public void doGet(HttpServletRequest request, HttpServletResponse response)
    13             throws ServletException, IOException {
    14         System.out.println("这是get请求");
    15         response.setContentType("text/html;charset=utf-8");
    16         String userName = request.getParameter("username");
    17         String userPass = request.getParameter("userpass");
    18         System.out.println(userName + " " + userPass);
    19         if (userName != null || userPass != null) {
    20             if (userName.equals("clear") && userPass.equals("123456")) {
    21                 response.getWriter().write("恭喜" + userName + "登陆成功!");
    22             } else {
    23                 response.getWriter().write("用户名或者密码错误!");
    24             }
    25         } else {
    26             response.getWriter().write("用户名或者密码为空!");
    27         }
    28 
    29     }
    30 
    31     public void doPost(HttpServletRequest request, HttpServletResponse response)
    32             throws ServletException, IOException {
    33         System.out.println("这是post请求");
    34         response.setContentType("text/html;charset=utf-8");
    35         String userName = request.getParameter("username");
    36         String userPass = request.getParameter("userpass");
    37         System.out.println(userName + " " + userPass);
    38         if (userName != null || userPass != null) {
    39             if (userName.equals("clear") && userPass.equals("123456")) {
    40                 response.getWriter().write("恭喜" + userName + "登陆成功!");
    41             } else {
    42                 response.getWriter().write("用户名或者密码错误!");
    43             }
    44         } else {
    45             response.getWriter().write("用户名或者密码为空!");
    46         }
    47 
    48     }
    49 
    50 }

      web.xml:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <display-name></display-name>
     8   <servlet>
     9     <servlet-name>Login</servlet-name>
    10     <servlet-class>cn.clear.demo.Login</servlet-class>
    11   </servlet>
    12 
    13   <servlet-mapping>
    14     <servlet-name>Login</servlet-name>
    15     <url-pattern>/login</url-pattern>
    16   </servlet-mapping>    
    17   <welcome-file-list>
    18     <welcome-file>index.jsp</welcome-file>
    19   </welcome-file-list>
    20 </web-app>

      启动服务器,使用http://10.0.1.72:8080/MyDemo/login访问,如果成功,此时MyEclipse的Console中将会显示:

      这是get请求

      null null

      浏览器将显示:用户名或者密码为空!

      这是因为我们没有使用传入任何参数。但是已经成功搭建并启动好一个简单的服务器。如果在浏览器地址栏中加入参数访问的话http://10.0.1.72:8080/MyDemo/login?username=clear&userpass=123456

      则Console中会打印:

      这是get请求

      clear 123456

      浏览器显示:恭喜clear登陆成功!

      表示我们的服务器接收参数和一系列交互是没有问题的。那么下面就可以搭建Android客户端代码了。

    二 客户端:

      准备好android开发环境,我这里使用的开发工具是android studio。

      Sdk版本如下:

      

      新建项目LoginDemo,让它自动生成MainActivity.java与activity_main.xml:

      加入android-async-http框架jar包(具体请去https://github.com/loopj/android-async-http下载):android-async-http-1.4.7.jar

      修改activity_main.xml中的代码,具体如下:

      

     1 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:stretchColumns="1">
     6 
     7     <TableRow>
     8         <TextView
     9             android:layout_width="wrap_content"
    10             android:layout_height="wrap_content"
    11             android:textSize="20dp"
    12             android:textColor="#ff7b09ff"
    13             android:text="用户名:"/>
    14         <EditText
    15             android:id="@+id/et_name"
    16             android:layout_width="0dp"
    17             android:layout_height="wrap_content"
    18             android:layout_weight="1"
    19             android:textColorHint="#ffabb3ff"
    20             android:hint="请输入您的用户名"/>
    21     </TableRow>
    22     <TableRow>
    23         <TextView
    24             android:layout_width="wrap_content"
    25             android:layout_height="wrap_content"
    26             android:textSize="20dp"
    27             android:textColor="#ff7b09ff"
    28             android:text="密    码:"/>
    29         <EditText
    30             android:id="@+id/et_pass"
    31             android:layout_width="0dp"
    32             android:layout_height="wrap_content"
    33             android:layout_weight="1"
    34             android:inputType="textPassword"
    35             android:textColorHint="#ffabb3ff"
    36             android:hint="请输入您的密码"/>
    37     </TableRow>
    38     <TableRow >
    39         <Button
    40             android:id="@+id/login"
    41             android:onClick="login"
    42             android:layout_height="wrap_content"
    43             android:layout_span="2"
    44             android:text="登陆"/>
    45     </TableRow>
    46     <TextView
    47         android:id="@+id/result"
    48         android:layout_width="match_parent"
    49         android:layout_height="wrap_content"
    50         android:gravity="center"
    51         android:text="内容显示区"/>
    52 
    53 </TableLayout>

      这样建立一个登陆界面:

      修改MainActivity.java的代码:

      1 package com.app.logindemo;
      2 
      3 import android.app.Activity;
      4 import android.os.Bundle;
      5 import android.text.TextUtils;
      6 import android.util.Log;
      7 import android.view.View;
      8 import android.view.Window;
      9 import android.widget.EditText;
     10 import android.widget.TextView;
     11 import android.widget.Toast;
     12 
     13 import com.loopj.android.http.AsyncHttpClient;
     14 import com.loopj.android.http.AsyncHttpResponseHandler;
     15 import com.loopj.android.http.RequestParams;
     16 
     17 import org.apache.http.Header;
     18 
     19 
     20 public class MainActivity extends Activity {
     21 
     22     private EditText et_name,et_pass;
     23     private TextView tv_result;
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27 
     28         super.onCreate(savedInstanceState);
     29         requestWindowFeature(Window.FEATURE_NO_TITLE);
     30         setContentView(R.layout.activity_main);
     31 
     32         //获取控件的对象
     33         et_name = (EditText) findViewById(R.id.et_name);
     34         et_pass = (EditText) findViewById(R.id.et_pass);
     35         tv_result = (TextView) findViewById(R.id.result);
     36 
     37     }
     38 
     39     //点击登陆按钮事件
     40     public void login(View v){
     41 
     42         int id = v.getId();
     43         switch (id){
     44             case R.id.login:
     45                 //获取用户名和密码
     46                 String userName = et_name.getText().toString();
     47                 String userPass = et_pass.getText().toString();
     48 
     49                 if (TextUtils.isEmpty(userName.trim()) || TextUtils.isEmpty(userPass.trim())){
     50                     Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_LONG).show();
     51                 }else{
     52                     //如果用户名和密码已经输入,则进入以下方法
     53                     loginByAsyncHttpClientPost(userName, userPass);
     54                     //loginByAsyncHttpClientGet(userName,userPass);
     55                 }
     56             break;
     57         }
     58     }
     59     //post请求
     60     private void loginByAsyncHttpClientPost(String userName, String userPass) {
     61         //创建异步请求对象
     62         AsyncHttpClient client = new AsyncHttpClient();
     63         //输入要请求的url
     64         String url = "http://10.0.1.72:8080/MyDemo/login?";
     65         //String url = "http://www.baidu.com";
     66         //请求的参数对象
     67         RequestParams params = new RequestParams();
     68         //将参数加入到参数对象中
     69         params.put("username",userName);
     70         params.put("userpass",userPass);
     71         //进行post请求
     72         client.post(url, params, new AsyncHttpResponseHandler() {
     73             //如果成功
     74             @Override
     75             public void onSuccess(int i, Header[] headers, byte[] bytes) {
     76                 //i代表状态码
     77                 if (i == 200){
     78                     tv_result.setText(new String(bytes));
     79                 }
     80             }
     81             //如果失败
     82             @Override
     83             public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
     84                 //打印异常信息
     85                 throwable.printStackTrace();
     86             }
     87         });
     88 
     89     }
     90     //get请求
     91     private void loginByAsyncHttpClientGet(String userName, String userPass) {
     92 
     93         AsyncHttpClient client = new AsyncHttpClient();
     94         //String url = "http://www.baidu.com";
     95         String url = "http://10.0.1.72:8080/MyDemo/login?";
     96 
     97         RequestParams params =  new RequestParams();
     98         params.put("username",userName);
     99         params.put("userpass",userPass);
    100 
    101         client.get(url, params, new AsyncHttpResponseHandler() {
    102             @Override
    103             public void onSuccess(int i, Header[] headers, byte[] bytes) {
    104 
    105                 Log.d("请求响应码",i+"");
    106                 for (int ii = 0; ii < headers.length;ii++){
    107                     Header header = headers[ii];
    108                     Log.d("values","header name:"+header.getName()+" value:"+header.getValue());
    109                 }
    110                 tv_result.setText(new String(bytes));
    111             }
    112 
    113             @Override
    114             public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
    115                 throwable.printStackTrace();
    116             }
    117         });
    118     }
    119 
    120 }

      上面代码53行和54行依次进行测试。

      在AndroidManifest.xml中要加入网络访问授权,具体代码如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.app.logindemo" >
     4     <!--网络授权-->
     5     <uses-permission android:name="android.permission.INTERNET"/>
     6 
     7     <application
     8         android:allowBackup="true"
     9         android:icon="@mipmap/ic_launcher"
    10         android:label="@string/app_name"
    11         android:theme="@style/AppTheme" >
    12         <activity
    13             android:name=".MainActivity"
    14             android:label="@string/app_name" >
    15             <intent-filter>
    16                 <action android:name="android.intent.action.MAIN" />
    17 
    18                 <category android:name="android.intent.category.LAUNCHER" />
    19             </intent-filter>
    20         </activity>
    21     </application>
    22 
    23 </manifest>

      所有代码都完成后启动模拟器会跳转到上图界面:

      不输入用户名和密码,则会提示“用户名或密码不能为空”

      随便输入一个用户名和密码,点击登陆会提示:

      同时在MyECLipse中Console会打印:

      这是post请求

      sdfdsf sdfdfs

      输入正确的用户名clear和密码123456,则界面会显示:

       

      这样就实现了android客户端与服务端的数据交互,是不是很开心。

      在此注意一定要进行网络授权,否则会报错且访问不了服务器。      

     

  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/clear5/p/4564072.html
Copyright © 2011-2022 走看看