zoukankan      html  css  js  c++  java
  • 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.服务端整个文件目录

  • 相关阅读:
    如何使用android模拟器截图
    android SD卡文件的读写
    res/raw下的资源文件读写
    window 运行指令(1)
    javax.swing.JOptionPane.showMessageDialog() 方法
    Eclipse快捷键
    EditPlus怎样自动换行
    java的HashCode方法
    eclipse汉化全程
    (转载)jdbc事务处理
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyibu/p/8592828.html
Copyright © 2011-2022 走看看