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. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  2. DEVOPS技术实践_18:Jenkins的Pinpeline对于参数的使用

    因为最近使用Pipeline声明式语法构建项目,但是最近项目的参数设置较多,特地的来学习一下关于参数的调用和测试,主要式从一个大神那里学习的,结尾回贴上大神的博客链接 1 构建一个pipeline项目 ...

  3. Android Drawable - Shape Drawable使用详解(附图)

    TIPS shape图形 –简单介绍 shape图形 –如何画? shape图形 –参数详细解析 shape图形 –如何用? shape图形 –实际开发应用场景 shape图形简单介绍 用xml实现一 ...

  4. CF1272E. Nearest Opposite Parity 题解 广度优先搜索

    题目链接:http://codeforces.com/contest/1272/problem/E 题目大意: 有一个长度为n的数组 \(a\) ,数组坐标从 \(1\) 到 \(n\) . 假设你现 ...

  5. 【一起学源码-微服务】Ribbon 源码三:Ribbon与Eureka整合原理分析

    前言 前情回顾 上一篇讲了Ribbon的初始化过程,从LoadBalancerAutoConfiguration 到RibbonAutoConfiguration 再到RibbonClientConf ...

  6. 更换EMC VNX系列存储故障硬盘的检查步骤

    更换EMC VNX系列存储故障硬盘的检查步骤 VNX1代(VNX5300,VNX5500,VNX5700,VNX7500和VNX2代(VNX5400,5600,5800和VNX7600,8000)有区 ...

  7. postman 的基础使用篇(一)

    简介 postman 是接口协作开发的优秀平台,可以用来进行接口设计.构建和调试,之前以chrome插件的形式,现在也有原生APP. 安装 Native app 通过链接 download page  ...

  8. js判断各种类型

    js的六种基本类型:Object,Boolean,Number,String,Undefined,Null; Object中又有:Function,Array,Date... 如何判断数据类型? Ob ...

  9. 小白学Java:老师!泛型我懂了!

    目录 小白学Java:老师!泛型我懂了! 泛型概述 定义泛型 泛型类的定义 泛型方法的定义 类型变量的限定 原生类型与向后兼容 通配泛型 非受限通配 受限通配 下限通配 泛型的擦除和限制 类型擦除 类 ...

  10. 一些触发XSS的姿势(未完待续)

    本文对一些能触发XSS的方式进行记录与学习. HTML5特性向量 通过formaction属性进行XSS - 需要用户进行交互 formaction 属性规定当表单提交时处理输入控件的文件的 URL. ...