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



配置tomcat服務器


啟動項目測試服務器



創(chuàng)建web層和客戶端完成數據交互
創(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 {
/* 設置中文字符編碼,防止亂碼*/
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("UTF-8");
//以json數據完成操作
response.setContentType("application/json;charset=UTF-8");
System.out.println(request.getContentType());// 得到客戶端發(fā)送過來內容的類型,application/json;charset=UTF-8
System.out.println(request.getRemoteAddr());// 得到客戶端的ip地址,
BufferedReader br = new BufferedReader(new InputStreamReader(// 使用字符流讀取客戶端發(fā)過來的數據
request.getInputStream()));
String line = null;
StringBuffer s = new StringBuffer();//StringBuffer String的區(qū)別,如果要對數據作頻繁的修改,則用StringBuffer
// 以一行的形式讀取數據
while ((line = br.readLine()) != null) {
s.append(line);
}
// 關閉io流
br.close();
System.out.println(s.toString());
//JSON:這是json解析包,idea是沒有的,要我們自己導入
User user = JSON.parseObject(s.toString(), User.class);//是用了發(fā)射機制來完成對象的封閉
//以utf-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);
// 去數據庫完成用戶注冊功能
UserService us = new UserServiceImpl();
//調用注冊的方法
int i = us.reigisterUser(number, name, phone, password);
boolean rs = false;
//判斷是否注冊成功
if (i > 0) {
System.out.println("注冊成功");
rs = true;
}
//將結果返回給客戶端 ,將結果構建成json數據返回給客戶端
JSONObject rjson = new JSONObject();
rjson.put("json", rs);
response.getOutputStream().write(
rjson.toString().getBytes("UTF-8"));// 向客戶端發(fā)送一個帶有json對象內容的響應
}
}
上面代碼用到用戶實體類User和json(對數據進行封裝),后面我們會介紹如何創(chuàng)建和使用,其他的就不闡述了,代碼都有注釋
在創(chuàng)建實體類之前,先創(chuàng)建一個包單獨存放實體類,因為后面我們在完善功能的過程中會創(chuàng)建很多實體類,方便管理


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資源庫,把下載好的JSON包復制到lib目錄下,并把jar包添加到類庫




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


創(chuàng)建接口的實現類


在接口里寫個注冊的抽象方法

在實現類中重寫接口方法


在實現類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層操作數據庫
方法和創(chuàng)建service層一樣,文字就不敘述了,直接上圖







在實現類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如果操作成功,就是操作成功的條數
int i = JDBCUtil.executeUpdate(sql, number, name, phone, password, "1");
System.out.println("數據庫的條數:");
return i;
}
}
通過JDBC工具類訪問數據庫
先創(chuàng)建包單獨存放工具類,后再創(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.加載驅動,只需要加載一次,所以放到靜態(tài)代碼塊中
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 描述:封裝一個方法可以獲得連接,目的可以在其他地方之接調用
*/
public static Connection getConnection() {
try {
ct = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ct;
}
/**
* 描述:封裝一個方法可以完成查詢操作
*
* @param sql 要查詢的sql語句
* @param obj 占位符的具體內容
* @return ResultSet 將查詢到的結果返回
*/
public static ResultSet executeQuery(String sql, Object... obj) {
// 1.得到連接
ct = getConnection();
// 2.創(chuàng)鍵發(fā)送對象
try {
ps = ct.prepareStatement(sql);
// 處理占位符問題
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;
}
/**
* 描述:封裝一個方法可以完成DDL,DML操作
*
* @param sql 要操作的sql語句
* @param obj 占位符
* @return
*/
public static int executeUpdate(String sql, Object... obj) {
// 1.得到連接
ct = getConnection();
// 2.創(chuàng)鍵發(fā)送對象
try {
ps = ct.prepareStatement(sql);
// 處理占位符問題
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;
}
/**
* 描述:封裝一個關閉資源的方法
*
* @param ct 連接對象
* @param ps 發(fā)送sql語句對象
* @param rs 返回值對象
*/
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();
}
}
}
// 給外部一個訪問ct,和ps的方法
public static Connection getCt() {
return ct;
}
public static PreparedStatement getPs() {
return ps;
}
}
上面代碼會用到mysql驅動包,下面給出使用方法
在上面下載的jar包中有mysql的驅動包,把它復制到lib下,然后添加到類庫即可,方法和json包的添加一樣

mysql中創(chuàng)建數據庫和表
可以通過navicat可視化工具創(chuàng)建數據庫和表(可以用自己的方法),下面給出我數據庫結構


測試
在服務端JDBCUtil.java工具類修改數據庫名和數據庫密碼為自己的

在客戶端中把注冊activity的請求服務器的方法里面的URL的ip地址修改成自己的ip地址

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


啟動服務端和客戶端項目測試



此時mysql已成功寫入數據

總結
這篇關于微信demo的文章就到這里了,希望大家可以多多關注腳本之家的更多精彩內容!
相關文章
Android 自定義 HorizontalScrollView 打造多圖片OOM 的橫向滑動效果(實例代碼)
這篇文章主要介紹了Android 自定義 HorizontalScrollView 打造多圖片OOM 的橫向滑動效果(實例代碼),需要的朋友可以參考下2017-10-10
Ubuntu中為Android系統(tǒng)上實現內置C可執(zhí)行程序測試Linux內核驅動程序
本文主要介紹在Ubuntu上為Android系統(tǒng)內置C可執(zhí)行程序測試Linux內核驅動程序,這里對測試Linux 內核驅動程序做了詳細介紹,并附有代碼示例,有興趣的小伙伴可以參考下2016-08-08
Android貝塞爾曲線初步學習第二課 仿QQ未讀消息氣泡拖拽黏連效果
這篇文章主要為大家詳細介紹了Android貝塞爾曲線初步學習的第二課,仿QQ未讀消息氣泡拖拽黏連效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Android Studio 3.6安裝全過程及AVD安裝運行步驟詳解
這篇文章主要介紹了Android Studio 3.6安裝全過程及AVD安裝運行步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
Android開發(fā) -- setTag的妙用和The key must be an application-specif
本文主要介紹Android開發(fā)setTag的妙用,小編覺得挺實用的,給大家一個參考,希望對大家學習有所幫助。2016-06-06

