欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

android-async-http框架之与服务器进行数据交互,,  本文搭建服务器端使用

来源: 开发者 投稿于  被查看 26716 次 评论:234

android-async-http框架之与服务器进行数据交互,,  本文搭建服务器端使用


一 服务器准备:

  本文使用Tomcat 6做服务器。

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

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

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

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

  Login.java:

package cn.clear.demo;

import java.io.IOException;

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

public class Login extends HttpServlet {
  
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("这是get请求");
        response.setContentType("text/html;charset=utf-8");
        String userName = request.getParameter("username");
        String userPass = request.getParameter("userpass");
        System.out.println(userName + " " + userPass);
        if (userName != null || userPass != null) {
            if (userName.equals("clear") && userPass.equals("123456")) {
                response.getWriter().write("恭喜" + userName + "登陆成功!");
            } else {
                response.getWriter().write("用户名或者密码错误!");
            }
        } else {
            response.getWriter().write("用户名或者密码为空!");
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("这是post请求");
        response.setContentType("text/html;charset=utf-8");
        String userName = request.getParameter("username");
        String userPass = request.getParameter("userpass");
        System.out.println(userName + " " + userPass);
        if (userName != null || userPass != null) {
            if (userName.equals("clear") && userPass.equals("123456")) {
                response.getWriter().write("恭喜" + userName + "登陆成功!");
            } else {
                response.getWriter().write("用户名或者密码错误!");
            }
        } else {
            response.getWriter().write("用户名或者密码为空!");
        }

    }

}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>cn.clear.demo.Login</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</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版本如下:

  091649224574366 (1).png

  新建项目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中的代码,具体如下:

<TableLayout 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:stretchColumns="1">

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:textColor="#ff7b09ff"
            android:text="用户名:"/>
        <EditText
            android:id="@+id/et_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textColorHint="#ffabb3ff"
            android:hint="请输入您的用户名"/>
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:textColor="#ff7b09ff"
            android:text="密    码:"/>
        <EditText
            android:id="@+id/et_pass"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:inputType="textPassword"
            android:textColorHint="#ffabb3ff"
            android:hint="请输入您的密码"/>
    </TableRow>
    <TableRow >
        <Button
            android:id="@+id/login"
            android:onClick="login"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="登陆"/>
    </TableRow>
    <TextView
        android:id="@+id/result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="内容显示区"/>

</TableLayout>

这样建立一个登陆界面:

091649224574366 (1).png

  修改MainActivity.java的代码:

package com.app.logindemo;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import org.apache.http.Header;


public class MainActivity extends Activity {

    private EditText et_name,et_pass;
    private TextView tv_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        //获取控件的对象
        et_name = (EditText) findViewById(R.id.et_name);
        et_pass = (EditText) findViewById(R.id.et_pass);
        tv_result = (TextView) findViewById(R.id.result);

    }

    //点击登陆按钮事件
    public void login(View v){

        int id = v.getId();
        switch (id){
            case R.id.login:
                //获取用户名和密码
                String userName = et_name.getText().toString();
                String userPass = et_pass.getText().toString();

                if (TextUtils.isEmpty(userName.trim()) || TextUtils.isEmpty(userPass.trim())){
                    Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_LONG).show();
                }else{
                    //如果用户名和密码已经输入,则进入以下方法
                    loginByAsyncHttpClientPost(userName, userPass);
                    //loginByAsyncHttpClientGet(userName,userPass);
                }
            break;
        }
    }
    //post请求
    private void loginByAsyncHttpClientPost(String userName, String userPass) {
        //创建异步请求对象
        AsyncHttpClient client = new AsyncHttpClient();
        //输入要请求的url
        String url = "http://10.0.1.72:8080/MyDemo/login?";
        //String url = "http://www.baidu.com";
        //请求的参数对象
        RequestParams params = new RequestParams();
        //将参数加入到参数对象中
        params.put("username",userName);
        params.put("userpass",userPass);
        //进行post请求
        client.post(url, params, new AsyncHttpResponseHandler() {
            //如果成功
            @Override
            public void onSuccess(int i, Header[] headers, byte[] bytes) {
                //i代表状态码
                if (i == 200){
                    tv_result.setText(new String(bytes));
                }
            }
            //如果失败
            @Override
            public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
                //打印异常信息
                throwable.printStackTrace();
            }
        });

    }
    //get请求
    private void loginByAsyncHttpClientGet(String userName, String userPass) {

        AsyncHttpClient client = new AsyncHttpClient();
        //String url = "http://www.baidu.com";
        String url = "http://10.0.1.72:8080/MyDemo/login?";

        RequestParams params =  new RequestParams();
        params.put("username",userName);
        params.put("userpass",userPass);

        client.get(url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int i, Header[] headers, byte[] bytes) {

                Log.d("请求响应码",i+"");
                for (int ii = 0; ii < headers.length;ii++){
                    Header header = headers[ii];
                    Log.d("values","header name:"+header.getName()+" value:"+header.getValue());
                }
                tv_result.setText(new String(bytes));
            }

            @Override
            public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
                throwable.printStackTrace();
            }
        });
    }

}

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

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app.logindemo" >
    <!--网络授权-->
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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>
    </application>

</manifest>

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

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

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

091649224574366 (1).png

  同时在MyECLipse中Console会打印:

  这是post请求

  sdfdsf sdfdfs

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

  091649224574366 (1).png 

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

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


用户评论