在前面的博客中介绍了在android中使用Get方式提交数据,这篇博客将介绍在android中使用Post方式提交数据到服务器,其中服务器端的代码的实现方式可以参考我的博客使用Post方式提交数据到Tomcat服务器

首先使用Android Studio创建一个android工程

第一步:修改activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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="com.fyt.postdemo.MainActivity"    android:orientation="vertical">    <EditText        android:id="@+id/et_username"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入您的用户名"/>    <EditText        android:id="@+id/et_password"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:inputType="numberPassword"        android:hint="请输入您的密码"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="登录"        android:onClick="login"/></LinearLayout>


第二步:新建一个Util类,并且在Util类中添加下面的代码

package com.fyt.postdemo;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;//创建一个通用类public class Util {    //从流中获得文本    public static String getTextFromStream(InputStream is){        //创建字节数组        byte[] b = new byte[1024];        //创建整型变量len,用于记录文本的长度        int len = 0;        //创建字节数组输出流        ByteArrayOutputStream bos = new ByteArrayOutputStream();        try {            //将读取到的数据写入字节数组输出流中            while((len = is.read(b)) != -1)            {                bos.write(b, 0, len);            }            //把字节数组输出流里的数据转换成字符串            String text = new String(bos.toByteArray());            //返回字符串            return text;        } catch (IOException e) {            e.printStackTrace();        }        //当读取出现异常,则返回null        return null;    }}

第三步:修改MainActivity.java中的代码

package com.fyt.postdemo;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.View;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    //创建消息处理器对象,用于在主线程中处理由子线程发送过来的消息    Handler handler = new Handler() {        //在主线程中处理从子线程发送过来的消息        public void handleMessage(Message msg) {            //获得消息中携带的数据            String data = (String) msg.obj;            //使用吐司对话框提示用户登录成功还是登录失败            Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();        }    };    //登录    public void login(View v)    {        //获得布局上的用户名输入框和密码输入框        EditText et_username = (EditText) findViewById(R.id.et_username);        EditText et_passworld = (EditText) findViewById(R.id.et_password);        //获得用户输入的用户名和密码        final String username = et_username.getText().toString();        final String password = et_passworld.getText().toString();        //创建子线程        Thread t = new Thread() {            //运行子线程            @Override            public void run() {                //不检查过时的方法                @SuppressWarnings("deprecation")                //设置网址                String path = "http://192.168.0.101:8080/WebProject/servlet/LoginServlet";                try {                    //将地址封装成Url对象                    URL url = new URL(path);                    //创建连接对象,此时未建立连接                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();                    //设置请求方式为Post请求                    conn.setRequestMethod("POST");                    //设置连接超时                    conn.setConnectTimeout(5000);                    //设置读取超时                    conn.setReadTimeout(5000);                    //拼接出要提交的数据的字符串                    String data = "username=" + URLEncoder.encode(username) + "&password=" + password;                    //添加post请求的两行属性                    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");                    conn.setRequestProperty("Content-Length", data.length() + "");                    //设置打开输出流                    conn.setDoOutput(true);                    //拿到输出流                    OutputStream os = conn.getOutputStream();                    //使用输出流往服务器提交数据                    os.write(data.getBytes());                    //如果请求发送成功                    if(conn.getResponseCode() == 200) {                        //获得连接对象中的输入流                        InputStream is = conn.getInputStream();                        //获得输入流中的字符串                        String text = Util.getTextFromStream(is);                        //创建一个消息对象                        Message msg = handler.obtainMessage();                        //设置消息对象携带的数据                        msg.obj = text;                        //将消息发送到主线程的消息队列                        handler.sendMessage(msg);                    }                } catch (Exception e) {                    e.printStackTrace();                }            }        };        //启动子线程        t.start();    }}

最后一步:修改配置文件

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

更多相关文章

  1. Android消息推送完美解决方案全析
  2. Android与服务器端数据交互
  3. [android 多线程]一些帖子与文章ProgressDialog, AsyncTask, Thr
  4. Android 数据库批量查询数据的操作
  5. Android中ListView分页加载数据

随机推荐

  1. Vectors(2): 绘制优美的路径动画
  2. android sqlite批量插入数据速度解决方案
  3. Android(安卓)TV开发总结【适配】
  4. Android(安卓)解析包出错问题
  5. Android(安卓)OTA功能的实现和修改
  6. Android开源组件
  7. Android(安卓)之旅:Google 发布 Android(
  8. Android中的Task和启动模式
  9. Android开发中如何监听指定URL地址的标签
  10. Android的致命问题——性能优化