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客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名).根据这个做个完整的安卓登录是没问题的.本例数据库服务器都采 ...
随机推荐
- CentOs7.X下配置FTP
https://blog.csdn.net/cc_want/article/details/85337241 CentOS7.x自带firewall防火墙,FTP使用需要开启20 21 22 3000 ...
- Ubuntu 18.04 + ROS Melodic + TurtleBot3仿真
1. 下载安装包 官网地址: http://wiki.ros.org/action/show/Robots/TurtleBot?action=show&redirect=TurtleBot 所 ...
- window 下配置wamp 环境
PHP下载 下载php压缩包,几点注意:这里我安装的事apache 所以在 php官方下载页时不是随便下载的,不然可能配置不了apache! 注意我以下图片标注
- 学习集合Collection_通用方法
Collection 常用接口 集合List和Set通用的方法 public boolean add(E e) 添加对象到集合 public boolean remove(E e) 删除指定元素 pu ...
- vnpy源码阅读学习(1):准备工作
vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...
- 解决elment 动态多选框组(el-checkbox-group)无法设置默认值问题
<el-checkbox-group v-model="form.showProperty"> <el-checkbox v-for="(item,id ...
- Android学习进度二
在最新的Android开发中,Google已经使用了新的开发技术,即使用Jectpack来开发App.所以今天我主要学习了这方面的知识. Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写 ...
- net 转 java
一,初衷 从事net 工作已经将近4年,net 很好,C#本身也是个优雅的语言,vs 编辑器功能也异常强大,光拖动断点这个功能java idea就无法实现.但是分布式,架构师的net 在国内岗位上比较 ...
- 想玩转JAVA高并发,这些概念你必须懂!
我们在找工作时,经常在招聘信息上看到有这么一条:有构建大型互联网服务及高并发等经验,你第一时间想到的是媒体常说的双十一吗?带着问题,我们一起思考技术…. 高并发高并发 它是互联网分布式系统架构设计中必 ...
- Jenkins-正则表达式提取Cookie
场景描述:用户登录查询数据:登录时响应头返回Cookie,将Cookie使用正则表达式提取出来,在下一个请求“查询数据”时,在请求头中使用此Cookie 1.添加“登录”http请求 2.在后置处理器 ...