Android和servlet通過json完成登錄


1.主要過程:Android端發送json數據,servlet接收后解析json數據,通過連接數據庫比較並返回json數據到Android端。整個效果:

2.Android端網絡連接使用OKHttp開源庫,json與對象格式之間的轉換使用GSON開源庫。在app文件夾下的build.gradle文件中添加開源庫的依賴。

3.新建一個網絡請求類HttpConnection,並定義sendOkHttpRequest()方法使用OKHttp進行網絡連接。

HttpConnection.java

package com.example.lenovo.servertest;

import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

/**
 * Created by lenovo on 2018/3/16.
 */

public class HttpConnection {

    /*address為請求servlet的地址address="http://192.168.43.87:8080/ServerTest/LoginServlet"
    192.168.43.87為測試服務器的IP user為請求實體類 okhttp3.Callback callback是OkHttp庫中自帶的回調接口,OkHttp在enqueue()方法內部開了子線程, 在子線程中進行Http請求,並將返回結果回調到okhttp3.Callback當中。 *
*/ public static void sendOkHttpRequest(String address, User user, okhttp3.Callback callback){ OkHttpClient client = new OkHttpClient(); //使用Ggon將user對象轉為json String params = new Gson().toJson(user); MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(JSON, params); Request request = new Request.Builder().url(address).post(requestBody).build(); client.newCall(request).enqueue(callback); } }

 

4. 新建User類,將id和password賦值,調用HTTPConnection中的sendOkHttpRequest方法,調用后必須重寫okhttp3.Callback()接口中的兩個方法,onFailure()和onResponse()。

5.解析json

MainActivity.java

package com.example.lenovo.servertest;

import android.app.Dialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    private Button button_request;
    private EditText editText_id, editText_password;
    private MyHandler myhandler = new MyHandler(this);
    public static final String TAG="MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InitView();
    }

    //弱引用,防止內存泄露
    private static class MyHandler extends Handler {
        private final WeakReference<MainActivity> mActivity;

        public MyHandler(MainActivity activity) {
            mActivity = new WeakReference<MainActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            System.out.println(msg);
            if (mActivity.get() == null) {
                return;
            }
            mActivity.get().updateUIThread(msg);
        }
    }

    //配合子線程更新UI線程
    private void updateUIThread(Message msg){
        Bundle bundle = msg.getData();
        String result = bundle.getString("result");
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
    }

    void InitView(){
        button_request = (Button) findViewById(R.id.button_request);
        editText_id = (EditText) findViewById(R.id.editText_id);
        editText_password = (EditText) findViewById(R.id.editText_password);

        button_request.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isConnectingToInternet()){
                    if (editText_id.toString().isEmpty()||editText_password.toString().isEmpty()) {                      
                        System.out.println("學號或密碼不能為空");
                    }
                    else{
                        //開啟訪問數據庫線程
                        new Thread(new Runnable() {
                            @Override
                            public void run() {                            

                                User user = new User();
                                user.setId(editText_id.getText().toString());
                                user.setPassword(editText_password.getText().toString());

                                String address = "http://192.168.43.87:8080/ServerTest/LoginServlet";
                                HttpConnection.sendOkHttpRequest(address, user, new okhttp3.Callback(){
                                    @Override
                                    public void onFailure(Call call, IOException e) {
                                        Log.d(MainActivity.TAG,"連接失敗");
                                    }
                                    @Override
                                    public void onResponse(Call call, Response response) throws IOException {
                                        String responseData = response.body().string();
                                        System.out.println("響應信息: " + responseData);
                                        parseJSONWithGSON(responseData);
                                        Looper.prepare();
                                        Toast.makeText(MainActivity.this, "succeed", Toast.LENGTH_SHORT).show();
                                        Looper.loop();
                                    }
                                });

                            }
                        }).start();
                    }
                }else{    
                    System.out.println("網絡未連接");
                }

            }
        });
    }

    //解析返回的JSON數據
    public void parseJSONWithGSON(String jsonData){
        Gson gson = new Gson();
        User user = gson.fromJson(jsonData, User.class);
        Log.d(MainActivity.TAG,"no = " + user.getNo());
        Log.d(MainActivity.TAG,"id = " + user.getId());
        Log.d(MainActivity.TAG,"password = " + user.getPassword());
    }

    // 檢測網絡狀態
    public boolean isConnectingToInternet() {
        ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED)
                    {
                        return true;
                    }
        }
        return false;
    }

}

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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lenovo.servertest.MainActivity">

    <EditText
        android:id="@+id/editText_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/editText_password"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button_request"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="request"
        />

</LinearLayout>

 

6.服務端:新建User類

package bean;

public class User {
    private int no;
    private String id;
    private String password;
    
    public int getNo() {
        return no;
    }
    
    public void setNo(int no) {
        this.no = no;
    }
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
}

7.將Gson使用的jar包放在WEB-INF下的lib文件夾下,放其他處會出錯。

8.MySQL連接所使用的jar包放在了Tomcat安裝目錄的lib文件夾下,加入Tomcat自動添加mysql-connector-java-5.1.30-bin.jar

9.新建數據庫連接類DBConn.java

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/*數據庫連接*/
public class DBConn {
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://127.0.0.1:3306/computer_base";
    private static final String user = "root";
    private static final String password = "123";
    
    private static Boolean connectSQL = true;
    
    public static Connection getConnection(){
        Connection conn = null;
        
        try {
            //1 加載驅動程序
            Class.forName(driver);
            System.out.println("加載驅動程序成功");

            conn = DriverManager.getConnection(url, user, password);
            System.out.println("數據庫連接成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("加載驅動程序失敗");
        }catch (SQLException e) {
            e.printStackTrace();
            connectSQL = false;
            System.out.println("數據庫連接失敗異常");
        }
        
        return conn;
    }
    
    //返回連接狀態
    public Boolean getConnectSQL(){
        return connectSQL;
    }
    
}

10.json和對象User之間的轉換JSONToUser.java

package util;

import com.google.gson.Gson;

import bean.User;

public class JSONToUser {

    //json轉為對象
    public User GsonToObject(String stringGson){
        Gson gson = new Gson();
        User user = gson.fromJson(stringGson, User.class);
        
        return user;
    }
    //對象轉為json
    public String ObjectToGson(User user){
        Gson gson = new Gson();
        String str = gson.toJson(user);
        
        return str;    
    }
}

11.登錄LoginService.java

package service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import bean.User;
import db.DBConn;

public class LoginService {
    static PreparedStatement preparedStatement = null;
    static ResultSet resultSet = null;
    static int login_failed = 0;
    static int login_succeed = 1;
    static User user = new User();
    
    public static User login(String id, String password){
      
        String sql = "select * from user where u_id ='" + id + "'";
        
        try{
            Connection conn = DBConn.getConnection();
            preparedStatement = conn.prepareStatement(sql);
            
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                if(resultSet.getString(3).equals(password)){
                
                    System.out.println("id:" +   
                             resultSet.getString(2)  
                            + " --login");
                    
                    user.setNo(resultSet.getInt(1));
                    user.setId(resultSet.getString(2));
                    user.setPassword(resultSet.getString(3));
                    
                }
            }
            
            preparedStatement.close();
            conn.close();
            
        }catch(Exception e){
            e.printStackTrace();
        }     
        
        return user;
    }
}

12.登錄LoginServlet.java

package servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

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

import bean.User;
import net.sf.json.JSONObject;
import service.LoginService;
import util.JSONToUser;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    static User user = new User();
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request, response);
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        /*doGet(request, response);*/
        
        //定義StringBuffer變量,StringBuffer比String更加靈活
        StringBuffer stringBuffer = new StringBuffer();
        //line保存讀取請求信息的當前一行,responseMessage為響應信息,返回信息
        String line = null, responseMessage = null;
        
        //讀取信息時會發生IO異常
        try{
            //BufferedReader為緩沖讀取流
            BufferedReader bufferedReader = request.getReader();
            while((line = bufferedReader.readLine()) != null){
                stringBuffer.append(line);
            }
            
            System.out.println(stringBuffer);
            //使用新建類的方法將json數據轉為對象
            user = new JSONToUser().GsonToObject(stringBuffer.toString());
            
        }catch(IOException e){
            e.printStackTrace();
        }
        
        //輸出流
        PrintWriter out = response.getWriter();
        //設置返回數據格式和編碼
        response.setContentType("application/json;charset=utf-8");
        
        //調用LoginService類中login方法訪問數據庫,並返回查詢結果
        user = LoginService.login(user.getId(), user.getPassword());
        
        if(user != null){
            //將查詢到的結果對象轉為json數據格式
            responseMessage = new JSONToUser().ObjectToGson(user);
            System.out.println("login servlet responseMsg: succeed");
        }
        
        System.out.println("對象轉為json " + responseMessage);
        //輸出流將信息返回
        out.print(responseMessage);
        
    }

}

13.服務端整個文件目錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM