android 仿微信demo——注冊(cè)功能實(shí)現(xiàn)(服務(wù)端)
服務(wù)端注冊(cè)功能實(shí)現(xiàn)
通過(guò)web層完成客戶端和服務(wù)端的數(shù)據(jù)交互(接受數(shù)據(jù),發(fā)送數(shù)據(jù)),service層完成業(yè)務(wù)邏輯(注冊(cè),登錄),dao層操作數(shù)據(jù)庫(kù)(要借助工具類)
創(chuàng)建項(xiàng)目
idea創(chuàng)建服務(wù)端項(xiàng)目



配置tomcat服務(wù)器


啟動(dòng)項(xiàng)目測(cè)試服務(wù)器



創(chuàng)建web層和客戶端完成數(shù)據(jù)交互
創(chuàng)建Servlet Reigister.java


Reigister.java
package com.example.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.pojo.User;
import com.example.service.UserService;
import com.example.service.UserServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLDecoder;
@WebServlet(name = "Reiister", value = "/Reigister")
public class Reigister extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* 設(shè)置中文字符編碼,防止亂碼*/
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("UTF-8");
//以json數(shù)據(jù)完成操作
response.setContentType("application/json;charset=UTF-8");
System.out.println(request.getContentType());// 得到客戶端發(fā)送過(guò)來(lái)內(nèi)容的類型,application/json;charset=UTF-8
System.out.println(request.getRemoteAddr());// 得到客戶端的ip地址,
BufferedReader br = new BufferedReader(new InputStreamReader(// 使用字符流讀取客戶端發(fā)過(guò)來(lái)的數(shù)據(jù)
request.getInputStream()));
String line = null;
StringBuffer s = new StringBuffer();//StringBuffer String的區(qū)別,如果要對(duì)數(shù)據(jù)作頻繁的修改,則用StringBuffer
// 以一行的形式讀取數(shù)據(jù)
while ((line = br.readLine()) != null) {
s.append(line);
}
// 關(guān)閉io流
br.close();
System.out.println(s.toString());
//JSON:這是json解析包,idea是沒(méi)有的,要我們自己導(dǎo)入
User user = JSON.parseObject(s.toString(), User.class);//是用了發(fā)射機(jī)制來(lái)完成對(duì)象的封閉
//以u(píng)tf-8解碼操作
String number = URLDecoder.decode(user.getNumber(), "utf-8");
String name = URLDecoder.decode(user.getName(), "utf-8");
String phone = URLDecoder.decode(user.getPhone(), "utf-8");
String password = URLDecoder.decode(user.getPassword(), "utf-8");
System.out.println("用戶名是:" + name + ", 密碼;" + password);
System.out.println(user);
// 去數(shù)據(jù)庫(kù)完成用戶注冊(cè)功能
UserService us = new UserServiceImpl();
//調(diào)用注冊(cè)的方法
int i = us.reigisterUser(number, name, phone, password);
boolean rs = false;
//判斷是否注冊(cè)成功
if (i > 0) {
System.out.println("注冊(cè)成功");
rs = true;
}
//將結(jié)果返回給客戶端 ,將結(jié)果構(gòu)建成json數(shù)據(jù)返回給客戶端
JSONObject rjson = new JSONObject();
rjson.put("json", rs);
response.getOutputStream().write(
rjson.toString().getBytes("UTF-8"));// 向客戶端發(fā)送一個(gè)帶有json對(duì)象內(nèi)容的響應(yīng)
}
}
上面代碼用到用戶實(shí)體類User和json(對(duì)數(shù)據(jù)進(jìn)行封裝),后面我們會(huì)介紹如何創(chuàng)建和使用,其他的就不闡述了,代碼都有注釋
在創(chuàng)建實(shí)體類之前,先創(chuàng)建一個(gè)包單獨(dú)存放實(shí)體類,因?yàn)楹竺嫖覀冊(cè)谕晟乒δ艿倪^(guò)程中會(huì)創(chuàng)建很多實(shí)體類,方便管理


User.java
package com.example.pojo;
public class User {
private int id;
private String number;
private String name;
private String password;
private String phone;
private String remark;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", number='" + number + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", remark='" + remark + '\'' +
'}';
}
}
在WEB-INF目錄下創(chuàng)建lib資源庫(kù),把下載好的JSON包復(fù)制到lib目錄下,并把jar包添加到類庫(kù)




創(chuàng)建service層處理業(yè)務(wù)邏輯功能
微信的除了注冊(cè)業(yè)務(wù)邏輯處理功能,還有后面的要完善的登錄,以及微信消息,通訊錄,聊天信息等等,所以我們要用到一種編程思想,面向接口編程思想。創(chuàng)建一個(gè)接口,然后可以在里面添加我們需要業(yè)務(wù)處理的抽象方法(目前只有登錄),之后在接口的實(shí)現(xiàn)類重寫接口方法執(zhí)行具體的操作即可
在上面創(chuàng)建Servlet Reigister.java文件中報(bào)紅的地方按alt+enter鍵創(chuàng)建接口,并放到單獨(dú)的包里


創(chuàng)建接口的實(shí)現(xiàn)類


在接口里寫個(gè)注冊(cè)的抽象方法

在實(shí)現(xiàn)類中重寫接口方法


在實(shí)現(xiàn)類UserServiceImpl.java中修改代碼
UserServiceImpl.java
package com.example.service;
public class UserServiceImpl implements UserService {
UserDao ud = new UserDaoImpl();
@Override
public int reigisterUser(String number, String name, String phone, String password) {
int i = ud.insertUser(number, name, phone, password);
return i;
}
}
創(chuàng)建dao層操作數(shù)據(jù)庫(kù)
方法和創(chuàng)建service層一樣,文字就不敘述了,直接上圖







在實(shí)現(xiàn)類UserDaoImpl.java中修改代碼
UserDaoImpl.java
package com.example.dao;
public class UserDaoImpl implements UserDao {
@Override
public int insertUser(String number, String name, String phone, String password) {
String sql = "insert into user (number, name, phone, password, remark) values(?,?,?,?,?);";
//i如果操作成功,就是操作成功的條數(shù)
int i = JDBCUtil.executeUpdate(sql, number, name, phone, password, "1");
System.out.println("數(shù)據(jù)庫(kù)的條數(shù):");
return i;
}
}
通過(guò)JDBC工具類訪問(wèn)數(shù)據(jù)庫(kù)
先創(chuàng)建包單獨(dú)存放工具類,后再創(chuàng)建工具類JDBCUtil.java

JDBCUtil.java
package com.example.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCUtil {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/androiddb1?useUnicode=true&characterEncoding=utf-8";
private static final String USER = "root";
private static final String PASSWORD = "jin1687062650";
private static Connection ct;
private static PreparedStatement ps;
private static ResultSet rs;
static {
// 1.加載驅(qū)動(dòng),只需要加載一次,所以放到靜態(tài)代碼塊中
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 描述:封裝一個(gè)方法可以獲得連接,目的可以在其他地方之接調(diào)用
*/
public static Connection getConnection() {
try {
ct = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ct;
}
/**
* 描述:封裝一個(gè)方法可以完成查詢操作
*
* @param sql 要查詢的sql語(yǔ)句
* @param obj 占位符的具體內(nèi)容
* @return ResultSet 將查詢到的結(jié)果返回
*/
public static ResultSet executeQuery(String sql, Object... obj) {
// 1.得到連接
ct = getConnection();
// 2.創(chuàng)鍵發(fā)送對(duì)象
try {
ps = ct.prepareStatement(sql);
// 處理占位符問(wèn)題
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
}
rs = ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
/**
* 描述:封裝一個(gè)方法可以完成DDL,DML操作
*
* @param sql 要操作的sql語(yǔ)句
* @param obj 占位符
* @return
*/
public static int executeUpdate(String sql, Object... obj) {
// 1.得到連接
ct = getConnection();
// 2.創(chuàng)鍵發(fā)送對(duì)象
try {
ps = ct.prepareStatement(sql);
// 處理占位符問(wèn)題
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
}
int in = ps.executeUpdate();
close(ct, ps, null);
return in;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
/**
* 描述:封裝一個(gè)關(guān)閉資源的方法
*
* @param ct 連接對(duì)象
* @param ps 發(fā)送sql語(yǔ)句對(duì)象
* @param rs 返回值對(duì)象
*/
public static void close(Connection ct, PreparedStatement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ct != null) {
try {
ct.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 給外部一個(gè)訪問(wèn)ct,和ps的方法
public static Connection getCt() {
return ct;
}
public static PreparedStatement getPs() {
return ps;
}
}
上面代碼會(huì)用到mysql驅(qū)動(dòng)包,下面給出使用方法
在上面下載的jar包中有mysql的驅(qū)動(dòng)包,把它復(fù)制到lib下,然后添加到類庫(kù)即可,方法和json包的添加一樣

mysql中創(chuàng)建數(shù)據(jù)庫(kù)和表
可以通過(guò)navicat可視化工具創(chuàng)建數(shù)據(jù)庫(kù)和表(可以用自己的方法),下面給出我數(shù)據(jù)庫(kù)結(jié)構(gòu)


測(cè)試
在服務(wù)端JDBCUtil.java工具類修改數(shù)據(jù)庫(kù)名和數(shù)據(jù)庫(kù)密碼為自己的

在客戶端中把注冊(cè)activity的請(qǐng)求服務(wù)器的方法里面的URL的ip地址修改成自己的ip地址

查看ip地址的方法
win+R,輸入cmd進(jìn)入命令行,然后輸入ipconfig


啟動(dòng)服務(wù)端和客戶端項(xiàng)目測(cè)試



此時(shí)mysql已成功寫入數(shù)據(jù)

總結(jié)
這篇關(guān)于微信demo的文章就到這里了,希望大家可以多多關(guān)注腳本之家的更多精彩內(nèi)容!
相關(guān)文章
Android 自定義 HorizontalScrollView 打造多圖片OOM 的橫向滑動(dòng)效果(實(shí)例代碼)
這篇文章主要介紹了Android 自定義 HorizontalScrollView 打造多圖片OOM 的橫向滑動(dòng)效果(實(shí)例代碼),需要的朋友可以參考下2017-10-10
Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限
這篇文章主要介紹了Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Ubuntu中為Android系統(tǒng)上實(shí)現(xiàn)內(nèi)置C可執(zhí)行程序測(cè)試Linux內(nèi)核驅(qū)動(dòng)程序
本文主要介紹在Ubuntu上為Android系統(tǒng)內(nèi)置C可執(zhí)行程序測(cè)試Linux內(nèi)核驅(qū)動(dòng)程序,這里對(duì)測(cè)試Linux 內(nèi)核驅(qū)動(dòng)程序做了詳細(xì)介紹,并附有代碼示例,有興趣的小伙伴可以參考下2016-08-08
Android編程實(shí)現(xiàn)向桌面添加快捷方式的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)向桌面添加快捷方式的方法,結(jié)合實(shí)例形式詳細(xì)分析了Android添加桌面快捷方式的操作技巧,需要的朋友可以參考下2016-11-11
Android貝塞爾曲線初步學(xué)習(xí)第二課 仿QQ未讀消息氣泡拖拽黏連效果
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線初步學(xué)習(xí)的第二課,仿QQ未讀消息氣泡拖拽黏連效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android Studio 3.6安裝全過(guò)程及AVD安裝運(yùn)行步驟詳解
這篇文章主要介紹了Android Studio 3.6安裝全過(guò)程及AVD安裝運(yùn)行步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Android實(shí)現(xiàn)可滑動(dòng)的自定義日歷控件
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可滑動(dòng)的自定義日歷控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android開(kāi)發(fā) -- setTag的妙用和The key must be an application-specif
本文主要介紹Android開(kāi)發(fā)setTag的妙用,小編覺(jué)得挺實(shí)用的,給大家一個(gè)參考,希望對(duì)大家學(xué)習(xí)有所幫助。2016-06-06

