Android請求獲取Java後端資料,登入介面例子
阿新 • • 發佈:2019-01-03
最近做了個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;
}
}
以前覺得一個專案訪問另外一個專案資源是需要跨域的,是沒弄懂跨域的概念,跨域:
程式碼大概就這個樣子了,菜鳥一個,請多多諒解,原始碼下載: