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和servlet通过json完成登录的更多相关文章

  1. Xamarin.Android再体验之简单的登录Demo

    一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...

  2. ajax请求、servlet返回json数据

    ajax请求.servlet返回json数据 1.方式一 response.setcontenttype("text/html;charset=utf-8"); response. ...

  3. Javaweb 使用Servlet技术改写用户登录 使用Filter技术解决中文乱码

    先把实验3的jsp页面复制过来: WebContent->WEB-INF->lib下面的jar包8.0版本也要记得复制: Java Resources->src下的 cn.edu.h ...

  4. 当使用servlet输出json时,浏览器端jquery的ajax遇到parse error的问题

    在使用jquery的ajax进行请求发送并由服务端的servlet返回json格式的数据内容时,假设输出内容没有正确设置,会遇到client浏览器报告parse error的问题.这个问题的解决仅仅须 ...

  5. servlet生成json数据返回至Ajax

    一.JSON JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符号标 ...

  6. 用easyui从servlet传递json数据到前端页面的两种方法

    用easyui从servlet传递json数据到前端页面的两种方法 两种方法获取的数据在servlet层传递的方法相同,下面为Servlet中代码,以查询表中所有信息为例. //重写doGet方法 p ...

  7. 用Servlet返回JSON文本动态创建DataGrid

    <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...

  8. android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法

    这里介绍微信和新浪登录.微信登录和新浪登录都需要申请第三方账号.可以参考官方文档http://dev.umeng.com/social/android/operation#2还是很清晰的. 新浪微博开 ...

  9. Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

    本例简单地实现Android客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名).根据这个做个完整的安卓登录是没问题的.本例数据库服务器都采 ...

随机推荐

  1. DEVOPS技术实践_19:Pipeline的多参数json调用

    在上一篇学习了把参数写进Json文件,然后通过去Json文件,调用参数的方法 1. 三元运算符介绍 调用的方法是通过一个三元运算符实现的 gender = prop.GENDER? prop.GEND ...

  2. 017 Ceph的集群管理_3

    一.验证OSD 1.1 osd状态 运行状态有:up,in,out,down 正常状态的OSD为up且in 当OSD故障时,守护进程offline,在5分钟内,集群仍会将其标记为up和in,这是为了防 ...

  3. kotlin + springboot整合mybatis操作mysql数据库及单元测试

    项目mybatis操作数据库参考: http://how2j.cn/k/springboot/springboot-mybatis/1649.html?p=78908 junit对controller ...

  4. 洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心

    正解:三分+贪心 解题报告: 传送门$QwQ$ 其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$ #include <b ...

  5. The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone错误的解决办法【已解决】

    ---恢复内容开始--- The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time ...

  6. 「Luogu」[JSOI2007]字符加密 解题报告

    题面 思路: 作为一个后缀数组的初学者,当然首先想到的是后缀数组 把\(s\)这个串首尾相接,扩展为原来的两倍,就能按后缀数组的方法处理 证明: 神仙一眼就看出这是后缀的裸题,我这个蒟蒻想了半天想不出 ...

  7. bootstrap:导航分页

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  8. 变量键盘读取、数组与宣告:read,array,declare

    1.read 2.declare/typeset 宣告变量的类型 3.数组(array)变量类型 4.与文件系统及程序的限制关系:ulimit 限制用户的某些系统资源,包括,可以开启的文件的数量,可以 ...

  9. Qt5学习(1)

    1. In Qt, if you want to apply styles to the main window  itself, you must apply it to  its central ...

  10. Sample Codes之Query features from a FeatureLayer

    除了地图基本的放大缩小等功能,在webgis上的二次开发中,查询功能 通常作为需求的一部分需要我们去实现,今天就给大家详细的分析实例代码中的查询功能:Query features from a Fea ...