android 仿微信demo——注冊(cè)功能實(shí)現(xiàn)(服務(wù)端)
通過web層完成客戶端和服務(wù)端的數(shù)據(jù)交互(接受數(shù)據(jù),發(fā)送數(shù)據(jù)),service層完成業(yè)務(wù)邏輯(注冊(cè),登錄),dao層操作數(shù)據(jù)庫(要借助工具類)
創(chuàng)建項(xiàng)目idea創(chuàng)建服務(wù)端項(xiàng)目
配置tomcat服務(wù)器
啟動(dòng)項(xiàng)目測(cè)試服務(wù)器
創(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ā)送過來內(nèi)容的類型,application/json;charset=UTF-8System.out.println(request.getRemoteAddr());// 得到客戶端的ip地址,BufferedReader br = new BufferedReader(new InputStreamReader(// 使用字符流讀取客戶端發(fā)過來的數(shù)據(jù)request.getInputStream()));String line = null;StringBuffer s = new StringBuffer();//StringBuffer String的區(qū)別,如果要對(duì)數(shù)據(jù)作頻繁的修改,?t用StringBuffer// 以一行的形式讀取數(shù)據(jù)while ((line = br.readLine()) != null) { s.append(line);}// 關(guān)閉io流br.close();System.out.println(s.toString());//JSON:這是json解析包,idea是沒有的,要我們自己導(dǎo)入U(xiǎn)ser user = JSON.parseObject(s.toString(), User.class);//是用了發(fā)射機(jī)制?磽瓿啥韻蟮姆獗//以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ù)庫完成用戶注冊(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é)果返回給客戶端,?⒔峁?菇ǔ?son數(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è)谕晟乒δ艿倪^程中會(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資源庫,把下載好的JSON包復(fù)制到lib目錄下,并把jar包添加到類庫
微信的除了注冊(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ù)庫
方法和創(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ù)庫的條數(shù):');return i; }}通過JDBC工具類訪問數(shù)據(jù)庫
先創(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語句 * @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); // 處理占位符問題 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語句 * @param obj 占位符 * @return */ public static int executeUpdate(String sql, Object... obj) {// 1.得到連接ct = getConnection();// 2.創(chuàng)鍵發(fā)送對(duì)象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; } /** * 描述:封裝一個(gè)關(guān)閉資源的方法 * * @param ct 連接對(duì)象 * @param ps 發(fā)送sql語句對(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 blocke.printStackTrace(); }}if (ps != null) { try {ps.close(); } catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace(); }}if (ct != null) { try {ct.close(); } catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace(); }} } // 給外部一個(gè)訪問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下,然后添加到類庫即可,方法和json包的添加一樣
可以通過navicat可視化工具創(chuàng)建數(shù)據(jù)庫和表(可以用自己的方法),下面給出我數(shù)據(jù)庫結(jié)構(gòu)
在服務(wù)端JDBCUtil.java工具類修改數(shù)據(jù)庫名和數(shù)據(jù)庫密碼為自己的
在客戶端中把注冊(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ù)
這篇關(guān)于微信demo的文章就到這里了,希望大家可以多多關(guān)注好吧啦網(wǎng)的更多精彩內(nèi)容!
相關(guān)文章:
1. 蘋果嗶哩嗶哩怎么關(guān)彈幕?嗶哩嗶哩App彈幕關(guān)閉方法詳解2. 蘋果微信掃一掃怎么添加到桌面3. 快手如何設(shè)置作品原聲?快手作品原聲設(shè)置方法4. 微信沒有密碼和驗(yàn)證碼怎么登錄5. 手機(jī)釘釘使用技巧:釘釘開啟語音自動(dòng)轉(zhuǎn)文字的方法6. 淘寶會(huì)員碼在哪找7. 樂心運(yùn)動(dòng)怎么綁定微信運(yùn)動(dòng)?一起來占領(lǐng)排行榜封面8. wps夜間模式在哪里切換9. 支付寶情侶一起存錢是什么功能 情侶攢錢功能在哪里共同賬戶怎么10. 網(wǎng)易云怎么設(shè)置定時(shí)關(guān)閉音樂