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和servlet通过json完成登录的更多相关文章
- Xamarin.Android再体验之简单的登录Demo
一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...
- ajax请求、servlet返回json数据
ajax请求.servlet返回json数据 1.方式一 response.setcontenttype("text/html;charset=utf-8"); response. ...
- Javaweb 使用Servlet技术改写用户登录 使用Filter技术解决中文乱码
先把实验3的jsp页面复制过来: WebContent->WEB-INF->lib下面的jar包8.0版本也要记得复制: Java Resources->src下的 cn.edu.h ...
- 当使用servlet输出json时,浏览器端jquery的ajax遇到parse error的问题
在使用jquery的ajax进行请求发送并由服务端的servlet返回json格式的数据内容时,假设输出内容没有正确设置,会遇到client浏览器报告parse error的问题.这个问题的解决仅仅须 ...
- servlet生成json数据返回至Ajax
一.JSON JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符号标 ...
- 用easyui从servlet传递json数据到前端页面的两种方法
用easyui从servlet传递json数据到前端页面的两种方法 两种方法获取的数据在servlet层传递的方法相同,下面为Servlet中代码,以查询表中所有信息为例. //重写doGet方法 p ...
- 用Servlet返回JSON文本动态创建DataGrid
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...
- android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法
这里介绍微信和新浪登录.微信登录和新浪登录都需要申请第三方账号.可以参考官方文档http://dev.umeng.com/social/android/operation#2还是很清晰的. 新浪微博开 ...
- Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构
本例简单地实现Android客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名).根据这个做个完整的安卓登录是没问题的.本例数据库服务器都采 ...
随机推荐
- C# 将PDF转为Word、Html、XPS、SVG、PCL、PS——基于Spire.Cloud.PDF
Spire.Cloud.PDF提供了接口PdfConvertApi可用于将PDF文档转换为其他格式文档,如Word(docx/doc).Html.XPS.SVG.PCL.PS.Png以及XPS转成PD ...
- 跟我一起学QT_QT标准对话框_颜色选择框
标准对话框 QT的标准对话框分为以下几种 颜色对话框 文件对话框 字体对话框 输入对话框 消息对话框 进度对话框 错误信息对话框 向导对话框 颜色对话框 首先学习的是颜色对话框颜色对话框类QColor ...
- 洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分
正解:网络流+二分 解题报告: 传送门$QwQ$ 和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$ 首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流 ...
- 机器学习之路--Python
常用数据结构 1.list 列表 有序集合 classmates = ['Michael', 'Bob', 'Tracy'] len(classmates) classmates[0] len(cla ...
- win7技巧
win7技巧 快捷键 一.Windows键 + 空格键“Space” [作用]:透明化所有窗口,快速查看桌面(并不切换) [快捷键]:win+空格 [小结]:当你打开了很多程序窗口的时候,这招非常有用 ...
- 关于Mach-O类型文件那点事
Mach-O文件简介 Mach-O是一种文件格式,是Mach Object文件格式的缩写. 它通常应用于可执行文件,目标代码,动态库,内核转储等中. Mach-O作为大部分基于Mach核心的操 ...
- 详细解析Java虚拟机的栈帧结构
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. 什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看 ...
- Could not find iPhone 6 simulator
最近原来的老项目有点问题需要处理一下,运行启动命令,就报了如下错误,提示找不到iPhone 6 模拟器. react-native run-ios Owaiss-Mac:pdm owaisahmed$ ...
- Java小白集合源码的学习系列:Vector
目录 Vector源码学习 Vector继承体系 Vector核心源码 基本属性 构造器 扩容机制 Enumeration 概述 源码描述 具体操作 Vector总结 Vector源码学习 前文传送门 ...
- 一个命令解决linux重启nginx就丢失pid文件问题
sudo nginx -c /etc/nginx/nginx.conf