1. 程式人生 > >Android請求獲取Java後端資料,登入介面例子

Android請求獲取Java後端資料,登入介面例子

最近做了個Android請求獲取Java後端資料的例子,簡單實現了一下。

先上個登入介面圖:   

主要實現:

java後端的程式碼 + Android的程式碼

1、java後端

(1)、先創個User類

import net.sf.json.JSONObject;
public class User {
	private long userid;
	private String account;
    private String username;
    private String passwd;
    public User(long userid, String account, String username, String passwd) {
        this.userid = userid;
        this.account = account;
        this.username = username;
        this.passwd = passwd;
    }
    public static User json2novel (JSONObject json) {
        try {
            return new User(json.getLong("userid"),
                    json.getString("account"),
                    json.getString("username"),
                    json.getString("passwd")
            );
        }catch (Exception ex) {
        	ex.printStackTrace();
        }
        return null;
    }
    public long getUserid() {
		return userid;
	}
	public void setUserid(long userid) {
		this.userid = userid;
	}
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}    
}

(2)、建個LoginServlet(public class LoginServlet extends HttpServlet)
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
public class LoginServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		JSONObject json = new JSONObject();
		List<User> list = new ArrayList<>();
		User user = new User(1,"sa","sa","123");
		list.add(user);
		json.put("data", list);
		PrintWriter out = response.getWriter();
		out.write(json.toString());//返回json資料
	}
}

(3)、建個跨域過濾器CorsFilter(public class CorsFilter implements Filter)

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class CorsFilter implements Filter {
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletResponse res = (HttpServletResponse) response;
		res.setContentType("text/html;charset=UTF-8");
		res.setHeader("Access-Control-Allow-Origin", "*");//"*"所有域名可訪問
		res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
		res.setHeader("Access-Control-Max-Age", "0");
		res.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
		res.setHeader("Access-Control-Allow-Credentials", "true");
		res.setHeader("XDomainRequestAllowed", "1");
		chain.doFilter(request, response);
	}
	@Override
	public void init(FilterConfig config) throws ServletException {
	}
	@Override
	public void destroy() {
	}
}

(4)、配置一下web.xml
	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.gxzj.login.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/LoginServlet</url-pattern>
	</servlet-mapping>
  
    <!-- 設定跨域訪問過濾器 -->
	<filter>  
		<filter-name>cors</filter-name>  
		<filter-class>com.gxzj.login.CorsFilter</filter-class>  
	</filter>  
	<filter-mapping>  
		<filter-name>cors</filter-name>  
		<url-pattern>/*</url-pattern>  
	</filter-mapping>

2、Android程式碼

(1)、寫個登入介面xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e7e7e7"
    android:orientation="vertical"
    android:padding="10dp">

    <ImageView
        android:layout_width="132dp"
        android:layout_height="132dp"
        android:layout_gravity="center"
        android:layout_marginTop="45dp"
        android:src="@drawable/icon_avatar_login" />

    <LinearLayout
        android:id="@+id/login_linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginTop="8dp"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="160dp"
            android:background="@drawable/login_input"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/userId_LinearLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="45dp"
                android:gravity="right"
                android:orientation="horizontal">

                <!-- android:ems="10"表示EditText內最多隻顯示10個字元,超出不顯示 -->
                <!-- android:singleLine="true"表示不能全部顯示時,後面用“…”來表示 -->
                <EditText
                    android:id="@+id/login_edtId"
                    android:layout_width="0dp"
                    android:layout_height="44dp"
                    android:layout_weight="1"
                    android:background="@null"
                    android:ems="10"
                    android:hint="使用者名稱"
                    android:paddingLeft="15dp"
                    android:paddingRight="15dp"
                    android:singleLine="true"
                    android:textColorHint="#999999"
                    android:textSize="18sp">
                    <requestFocus />
                </EditText>

                <ImageView
                    android:id="@+id/login_more_user"
                    android:layout_width="wrap_content"
                    android:layout_height="44dp"
                    android:layout_marginRight="15dp"
                    android:layout_marginTop="5dp"
                    android:src="@drawable/login_more_up" />
            </LinearLayout>

            <!-- 橫線  -->
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#CACDD1" />

            <EditText
                android:id="@+id/login_edtPwd"
                android:layout_width="match_parent"
                android:layout_height="44dp"
                android:layout_marginTop="10dp"
                android:background="@null"
                android:hint="密碼"
                android:inputType="textPassword"
                android:paddingLeft="15dp"
                android:paddingRight="0dp"
                android:singleLine="true"
                android:textColorHint="#999999"
                android:textSize="18sp" />
        </LinearLayout>

        <Button
            android:id="@+id/btn_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn_bg"
            android:text="登 錄"
            android:textColor="#fff"
            android:textSize="22sp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/login_txtForgotPwd"
            android:layout_width="0dp"
            android:layout_weight="1.0"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dp"
            android:layout_marginLeft="22dp"
            android:text="忘記密碼?"
            android:textColor="#0079FF"
            android:textSize="18sp"/>

        <TextView
            android:id="@+id/btn_register"
            android:layout_width="0dp"
            android:layout_weight="1.0"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dp"
            android:layout_marginRight="22dp"
            android:text="註冊"
            android:textColor="#0079FF"
            android:textSize="18sp"
            android:layout_gravity="end"
            android:textAlignment="textEnd"/>

    </LinearLayout>

</LinearLayout>

(2)、再寫點LoginActivity程式碼

請求網路資料需要許可權,在manifest新增許可權:

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

這裡使用了 AsyncHttpClient 來請求 java後端 的資料

要在build裡新增:

compile 'com.loopj.android:android-async-http:1.4.9'
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import cz.msebera.android.httpclient.Header;
public class LoginActivity extends AppCompatActivity {
    AsyncHttpClient client;//非同步載入
    List<User> ls_user = null;
    Button btn_login;
    EditText login_edtId,login_edtPwd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        client = new AsyncHttpClient();//例項化AsyncHttpClient
        btn_login = (Button) findViewById(R.id.btn_login);
        login_edtId = (EditText) findViewById(R.id.login_edtId);
        login_edtPwd = (EditText) findViewById(R.id.login_edtPwd);
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String account = login_edtId.getText().toString().trim();
                String passwd = login_edtPwd.getText().toString().trim();
                if(account.equals("")){
                    Toast.makeText(LoginActivity.this, "請輸入使用者名稱", Toast.LENGTH_SHORT).show();
                }else if(passwd.equals("")){
                    Toast.makeText(LoginActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show();
                }else{
                    //這裡的IP(192.168.43.234:8080)要換成你自己的IP !!!
                    String url = "http://192.168.3.126:8080/Cors/LoginServlet?account=" + account + "&passwd=" + passwd;
                    ls_user = new ArrayList<>();//初始化
                    client.get(url, new AsyncHttpResponseHandler() {
                        @Override
                        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                            try {
                                JSONObject jsonObject = new JSONObject(new String(responseBody));
                                JSONArray jsonArray = jsonObject.getJSONArray("data");
                                for (int i=0; i<jsonArray.length(); ++i) {
                                    User user = User.json2novel(jsonArray.getJSONObject(i));
                                    if (user != null) {
                                        ls_user.add(user);
                                    }
                                }
                                if(ls_user.size() == 1){
                                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                    startActivity(intent);
                                }else{
                                    Toast.makeText(LoginActivity.this, "使用者名稱或密碼", Toast.LENGTH_SHORT).show();
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                Toast.makeText(LoginActivity.this, "登陸失敗!", Toast.LENGTH_SHORT).show();
                            }
                        }
                        @Override
                        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                            Toast.makeText(LoginActivity.this, "登陸錯誤!", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        });
    }
}

(3)、MainActivity就直接建立一個空Activity

(4)、建個User類
import org.json.JSONException;
import org.json.JSONObject;
public class User {
    private long userid;
    private String account;
    private String username;
    private String passwd;
    public User(long userid, String account, String username, String passwd) {
        this.userid = userid;
        this.account = account;
        this.username = username;
        this.passwd = passwd;
    }
    public static User json2novel (JSONObject json) {
        try {
            return new User(json.getLong("userid"),
                    json.getString("account"),
                    json.getString("username"),
                    json.getString("passwd")
            );
        }catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}

以前覺得一個專案訪問另外一個專案資源是需要跨域的,是沒弄懂跨域的概念,跨域:

程式碼大概就這個樣子了,菜鳥一個,請多多諒解,原始碼下載: