Android与web后台进行数据交互的三种方式

来源:互联网 发布:kmeans算法优缺点 编辑:程序博客网 时间:2024/05/29 02:39

无论是用哪种方式使Android与web后台进行数据交互,都需要在eclipes中写一个完整的操作流程,在这里,我是写了一个登录。(没有从数据库进行判断,而是直接把用户名和密码定死了),下面就是我的后台web端。你可以根据你的不同需求在jsp界面用你所需要的提交方式来写

login,jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><!-- <form action="login.do" method="get">用户名:<input type="text" name="uname"/><br>密码:<input type="password" name="upass"/><br><input type="submit" value="登录"/></form> --><form action="login.do" method="post">用户名:<input type="text" name="uname"/><br>密码:<input type="password" name="upass"/><br><input type="submit" value="登录"/></form></body></html>

LoginServlet:
package com.lxj.servlet;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;public class Login extends HttpServlet{//@Override//protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//String uname=req.getParameter("uname");//String upass=req.getParameter("upass");////String a=null;//if("admin".equals(uname) && "123".equals(upass)){//a="succes";//System.out.println(a);//}else{//a="fail";//System.out.println(a);//}//PrintWriter pw=resp.getWriter();//pw.write(a);//pw.close();//}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String uname=req.getParameter("uname");String upass=req.getParameter("upass");String a=null;if("admin".equals(uname) && "123".equals(upass)){a="succes";System.out.println(a);}else{a="fail";System.out.println(a);}PrintWriter pw=resp.getWriter();pw.write(a);pw.close();}}


最后,还要记得在web.xml里面配置跳转路径
<servlet>      <servlet-name>login</servlet-name>      <servlet-class>com.lxj.servlet.Login</servlet-class>  </servlet>    <servlet-mapping>      <servlet-name>login</servlet-name>      <url-pattern>/login.do</url-pattern>  </servlet-mapping>



第一:GET提交方式:

    activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.android_getandpost.MainActivity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入用户名"        android:id="@+id/uname"        />    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入密码"        android:id="@+id/upass"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="登陆(Get)"        android:onClick="LoginGet"        /></LinearLayout>


MainActivity:

package com.example.android_getandpost;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.Toast;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class MainActivity extends AppCompatActivity {    private EditText uname;    private EditText upass;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取用户名的id        uname = (EditText) findViewById(R.id.uname);        //获取密码的id        upass = (EditText) findViewById(R.id.upass);    }    public void LoginGet(View view){        //获取用户名的值        String name=uname.getText().toString();        //获取密码的值        String pass=upass.getText().toString();        //获取网络上的servlet路径        String path="http://193.168.3.16:8080/Login/login.do";        //调用getTask,把获取到的用户名,密码与路径放入方法中        new getTask().execute(name,pass,path);    }    class getTask extends AsyncTask {        @Override        protected Object doInBackground(Object[] params) {            //依次获取用户名,密码与路径            String name = params[0].toString();            String pass = params[1].toString();            String path = params[2].toString();            try {                //获取网络上get方式提交的整个路径                URL url = new URL(path + "?uname=" + name + "&upass=" + pass);                //打开网络连接                HttpURLConnection conn = (HttpURLConnection) url.openConnection();                //设置提交方式                conn.setRequestMethod("GET");                //设置网络超时时间                conn.setConnectTimeout(5000);                //获取结果码                int code = conn.getResponseCode();                if (code == 200) {                    //用io流与web后台进行数据交互                    InputStream is = conn.getInputStream();                    //字节流转字符流                    BufferedReader br = new BufferedReader(new InputStreamReader(is));                    //读出每一行的数据                    String s = br.readLine();                    //返回读出的每一行的数据                    return s;                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }            return null;        }        @Override        protected void onPostExecute(Object o) {            super.onPostExecute(o);            //获取Android studio与web后台数据交互获得的值            String s= (String) o;            //吐司Android studio与web后台数据交互获得的值            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();        }    }}

第二:POST提交方式:

activity_main2.xml:

package com.example.android_getandpost;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.Toast;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class MainActivity extends AppCompatActivity {    private EditText uname;    private EditText upass;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取用户名的id        uname = (EditText) findViewById(R.id.uname);        //获取密码的id        upass = (EditText) findViewById(R.id.upass);    }    public void LoginGet(View view){        //获取用户名的值        String name=uname.getText().toString();        //获取密码的值        String pass=upass.getText().toString();        //获取网络上的servlet路径        String path="http://193.168.3.16:8080/Login/login.do";        //调用getTask,把获取到的用户名,密码与路径放入方法中        new getTask().execute(name,pass,path);    }    class getTask extends AsyncTask {        @Override        protected Object doInBackground(Object[] params) {            //依次获取用户名,密码与路径            String name = params[0].toString();            String pass = params[1].toString();            String path = params[2].toString();            try {                //获取网络上get方式提交的整个路径                URL url = new URL(path + "?uname=" + name + "&upass=" + pass);                //打开网络连接                HttpURLConnection conn = (HttpURLConnection) url.openConnection();                //设置提交方式                conn.setRequestMethod("GET");                //设置网络超时时间                conn.setConnectTimeout(5000);                //获取结果码                int code = conn.getResponseCode();                if (code == 200) {                    //用io流与web后台进行数据交互                    InputStream is = conn.getInputStream();                    //字节流转字符流                    BufferedReader br = new BufferedReader(new InputStreamReader(is));                    //读出每一行的数据                    String s = br.readLine();                    //返回读出的每一行的数据                    return s;                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }            return null;        }        @Override        protected void onPostExecute(Object o) {            super.onPostExecute(o);            //获取Android studio与web后台数据交互获得的值            String s= (String) o;            //吐司Android studio与web后台数据交互获得的值            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();        }    }}

Main2Activity:

package com.example.android_getandpost;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.Toast;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class Main2Activity extends AppCompatActivity {    private EditText upass;    private EditText uname;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        //获取用户名的id        uname = (EditText) findViewById(R.id.uname);        //获取密码的id        upass = (EditText) findViewById(R.id.upass);    }    public void LoginPost(View view){        //获取用户名的值        String name=uname.getText().toString();        //获取密码的值        String pass=upass.getText().toString();        //获取网络上的servlet路径        String path="http://193.168.3.16:8080/Login/login.do";        //调用postTask,把获取到的用户名,密码与路径放入方法中        new postTask().execute(name,pass,path);    }    class postTask extends AsyncTask{        @Override        protected Object doInBackground(Object[] params) {            //依次获取用户名,密码与路径            String name=params[0].toString();            String pass=params[1].toString();            String path=params[2].toString();            try {                //获取网络上get方式提交的整个路径                URL url=new URL(path);                //打开网络连接               HttpURLConnection conn= (HttpURLConnection) url.openConnection();                //设置提交方式                conn.setRequestMethod("POST");                //设置网络超时时间                conn.setConnectTimeout(5000);                //界面上所有的参数名加上他的值                String s="uname="+name+"&upass"+pass;                //获取请求头                conn.setRequestProperty("Content-Length",s.length()+"");//键是固定的                conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");//键和值是固定的                //设置允许对外输出数据                conn.setDoOutput(true);                //把界面上的所有数据写出去                OutputStream os=conn.getOutputStream();                os.write(s.getBytes());                if(conn.getResponseCode()==200){                    //用io流与web后台进行数据交互                    InputStream is=conn.getInputStream();                    //字节流转字符流                    BufferedReader br=new BufferedReader(new InputStreamReader(is));                    //读出每一行的数据                    String str=br.readLine();                    //返回读出的每一行的数据                    return str;                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }            return null;        }        @Override        protected void onPostExecute(Object o) {            super.onPostExecute(o);            //获取Android studio与web后台数据交互获得的值            String s= (String) o;            //吐司Android studio与web后台数据交互获得的值            Toast.makeText(Main2Activity.this, s, Toast.LENGTH_SHORT).show();        }    }}

第三:运用第三方(android-async-http-1.4.4.jar):

首先,在项目中把jar包导入libs,然后右击选择add as library解压,再在build.gradle中的

compileSdkVersion 25buildToolsVersion "25.0.2"上面加上这样一句代码:useLibrary 'org.apache.http.legacy',然后编译
以解决HttpClient导致不可以问题
activity_mian3.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.android_getandpost.Main3Activity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入用户名"        android:id="@+id/uname"        />    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入密码"        android:id="@+id/upass"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="登陆(AsyncHttpClient)"        android:onClick="LoginAsyncHttpClient"        /></LinearLayout>
Main3Activity:
package com.example.android_getandpost;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.RequestHandle;import com.loopj.android.http.RequestParams;import com.loopj.android.http.TextHttpResponseHandler;import org.apache.http.Header;public class Main3Activity extends AppCompatActivity {    private EditText upass;    private EditText uname;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main3);        //获取用户名的id        uname = (EditText) findViewById(R.id.uname);        //获取密码的id        upass = (EditText) findViewById(R.id.upass);    }    public void LoginAsyncHttpClient(View view){        //获取用户名的值        String name=uname.getText().toString();        //获取密码的值        String pass=upass.getText().toString();        //获取网络上的servlet路径        String path="http://193.168.3.16:8080/Login/login.do";        //使用第三方        AsyncHttpClient ahc=new AsyncHttpClient();        //请求参数        RequestParams params=new RequestParams();        //给请求参数设键和值(键的名字和web后台保持一致)        params.put("name",name);        params.put("pass",pass);        //设值提交方式        ahc.post(this,path,params,new TextHttpResponseHandler(){            @Override            public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {                super.onFailure(statusCode, headers, responseBody, error);            }            @Override            public void onSuccess(int statusCode, Header[] headers, String responseBody) {                super.onSuccess(statusCode, headers, responseBody);                //吐司Android studio与web后台数据交互获得的值                Toast.makeText(Main3Activity.this, responseBody, Toast.LENGTH_SHORT).show();            }        });//            @Override//            public void onSuccess(int statusCode, Header[] headers, String responseBody) {//                super.onSuccess(statusCode, headers, responseBody);//                Toast.makeText(MainActivity.this, responseBody, Toast.LENGTH_SHORT).show();//            }//        });    }}

我在运行的时候总是吐司不出东西,原因是因为我没有连局网