Jsp+Servlet+MYSQL注冊登錄案例(界面難看,ε=(′ο`*)))唉)

  注冊登錄界面尤為常見,我的界面尤為難看,勉為其難的寫吧,前端不熟就是這樣。。。

這個案例運用到了:

1.Jsp動態頁面--->動態頁面

?2.Servlet邏輯判斷后臺---->實現界面與數據庫/業務的連接,簡而言之,起承轉合。PS:后臺響應Ajax后往前端回數據時,需按照前端規定的數據類型進行Write(),才可以在success中獲取,data.xxxx。

?3.MYSQL數據庫----->持久化數據

?4.JDBC----->Java DataBase Connectivity,Java數據庫連接

?5.C3P0數據源連接池------>開源的JDBC連接池

?6.JQuery------>輕量級 JavaScript 庫

?7.DButils工具類----->簡化數據庫CRUD操作

?8.網易云信------>第三方驗證碼發送平臺,由于我操作太頻繁被限制了......,內有Java接入示例(http://dev.netease.im/docs/product/%E7%9F%AD%E4%BF%A1/%E7%9F%AD%E4%BF%A1%E6%8E%A5%E5%85%A5%E7%A4%BA%E4%BE%8B),有二十條免費的可以測試Java程序發送手機驗證碼(用完就沒了),需要注意的是添加依賴后,還可能報錯,需再添加commons.logging.jar

9.javax.mail.jar---->簡單郵件發送依賴jar,發送郵件首先需要有一個郵箱賬號和密碼,以網易163郵箱為例,郵箱賬號必須要開啟 SMTP 服務,在瀏覽器網頁登錄郵箱后一般在郵箱的“設置”選項中可以開啟,并記下郵箱的 SMTP 服務器地址

  看起來有點麻煩,畫個注冊部分的邏輯:

    

?

?頁面的CSS是真的沒想象力去寫,ε=(′ο`*)))界面難看。。。。。。。。。

?

?

  工程MVC(model、view、control)結構:

    個人感覺就是將原來什么都混在一起,像疊衣服一樣,衣服是衣服,褲子是褲子的放起來,這樣找起來比較方便,那么相應的格局開始就要布置好,會稍微麻煩點,但整體寫法不會因為這個改變。

    

    依賴:

    

?

注冊部分代碼(CSS就不上了,這么渣的樣式...感覺要被鄙視了0.0.):

  Register,jsp---------->頁面顯示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>注冊</title><link rel="stylesheet" href="css/Register.css"><script src="jquery/jquery-1.11.1.js"></script><script>$(function () {//用戶注冊和用戶登錄切換
            $("#li_register").click(function () {$("#register").show();$("#login").hide();})$("#li_login").click(function () {$("#login").show();$("#register").hide();})//給發送按鈕綁定點擊事件:獲取電話號碼檢驗是否為電話號碼,ajax到后臺
            $("#bt_send").click(function () {var phone=$("#r_telephone").val();var pattern=/^1(3|4|5|7|8)\d{9}$/;if(!(pattern.test(phone))){alert("請輸入正確的電話號碼");return;}//進行ajax數據交互,此處切記button可能會導致Ajax請求失敗,改為input即可,大坑啊....
               $.ajax({url:"SendPhoneVerifyCode",type:"get",data:{phone:phone},dataType:"json",success:function (data) {alert(data.message);},error:function (err) {alert("發送失敗")console.log(err);}});})})</script>
</head><body><div id="content"><div id="tip"><ul><li id="li_register">用戶注冊</li><p>/</p><li id="li_login">用戶登錄</li></ul></div><div id="register"><form action="UserRegisterServlet" method="post">用戶名:  <input type="text" name="r_username" id="r_username"><br>&nbsp;碼:  <input type="password" name="r_password" id="r_password"><br>電話號碼:<input type="text" name="r_telephone" id="r_telephone"><br>驗證碼:<input type="text" name="phoneVerifyCode" id="phoneVerifyCode"><input type="button" id="bt_send" value="點擊發送"><br><input type="submit" value="點擊注冊,貪玩藍月"><br><span id="r_messageShow">${sessionScope.messageShow}</span></form></div>//登錄還沒寫.........<div id="login"><form action="">用戶名: <input type="text" name="l_username" id="l_username"><br>&nbsp;碼:<input type="password" name="l_password" id="l_password"><br><input type="submit" value="點擊登錄,渣渣輝"><br><span id="l_messageShow"></span></form></div></div>
</body>
</html>

?

?

?SendPhoneVerifyCode----->ajax發送數據的后端servlet,接收前端發來的電話號碼,并執行發送驗證碼的動作

public class SendPhoneVerifyCode extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//獲取電話號碼String phone = request.getParameter("phone");//給當前號碼發送驗證碼,返回驗證碼存在session里,就是這里把我限制了,云信都登不上了,不過不影響使用String code = new PhoneVerifyCode(phone).sendCode();request.getSession().setAttribute("phoneCode",code);//session是存在于服務器上滴,cookie是在客戶端滴//將json數據返回前端,提示用戶response.getWriter().write("{\"message\":\"信息已發送\"}");}
}

?

PhoneVerifyCode--->網易云信的提示中有代碼,記得在copy一下它的CheckSumBuilder類,會用到,還要添加兩個JAR包httpcore-4.4.3.jar和httpclient-4.5.1.jar,如果報錯中有logging等字眼,再添加com.springsource.org.apache.commons.logging-1.1.1.jar

public class PhoneVerifyCode {//發送驗證碼的請求路徑URLprivate static final StringSERVER_URL="https://api.netease.im/sms/sendcode.action";//網易云信分配的賬號,請替換你在管理后臺應用下申請的Appkeyprivate static final StringAPP_KEY="d39afb7b5b9ece021935351e74f75d98";//網易云信分配的密鑰,請替換你在管理后臺應用下申請的appSecretprivate static final String APP_SECRET="543d6e574be7";//隨機數private static final String NONCE="123456";//短信模板IDprivate static final String TEMPLATEID="4062279";//手機號private static  String MOBILE="";//驗證碼長度,范圍4~10,默認為4private static final String CODELEN="6";public PhoneVerifyCode(String MOBILE){this.MOBILE=MOBILE;}public String sendCode(){DefaultHttpClient httpClient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(SERVER_URL);String curTime = String.valueOf((new Date()).getTime() / 1000L);/** 參考計算CheckSum的java代碼,在上述文檔的參數列表中,有CheckSum的計算文檔示例*/String checkSum = CheckSumBuilder.getCheckSum(APP_SECRET, NONCE, curTime);// 設置請求的headerhttpPost.addHeader("AppKey", APP_KEY);httpPost.addHeader("Nonce", NONCE);httpPost.addHeader("CurTime", curTime);httpPost.addHeader("CheckSum", checkSum);httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");// 設置請求的的參數,requestBody參數List<NameValuePair> nvps = new ArrayList<NameValuePair>();/** 1.如果是模板短信,請注意參數mobile是有s的,詳細參數配置請參考“發送模板短信文檔”* 2.參數格式是jsonArray的格式,例如 "['13888888888','13666666666']"* 3.params是根據你模板里面有幾個參數,那里面的參數也是jsonArray格式*/nvps.add(new BasicNameValuePair("templateid", TEMPLATEID));nvps.add(new BasicNameValuePair("mobile", MOBILE));nvps.add(new BasicNameValuePair("codeLen", CODELEN));try {httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 執行請求HttpResponse response = null;try {response = httpClient.execute(httpPost);} catch (IOException e) {e.printStackTrace();}/** 1.打印執行結果,打印結果一般會200、315、403、404、413、414、500* 2.具體的code有問題的可以參考官網的Code狀態表*/String respJSON= null;try {respJSON = EntityUtils.toString(response.getEntity(), "utf-8");System.out.println(respJSON);} catch (IOException e) {e.printStackTrace();}Gson gson=new Gson();CodeEntity entity = gson.fromJson(respJSON, CodeEntity.class);String ss=entity.getObj();//因為把我限制了,導致給我的驗證碼格式不對,截取前面的即是驗證碼,正常用戶直接getobj()即是驗證碼,沒辦法被限制了...System.out.println(ss.substring(0,7));return ss.substring(0,7);}
}

?

UserRegisterServlet---->用戶注冊判斷用戶填寫的數據是否可以注冊的servlet

public class UserRegisterServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("r_username");String password = request.getParameter("r_password");String telephone = request.getParameter("r_telephone");String phoneVerifyCode = request.getParameter("phoneVerifyCode");User user=new User(username, MD5Util.md5(password),telephone);//開始注冊業務UserRegister userRegister=new Dao.UserRegister();if(userRegister.isRepeatUsername(username)){request.getSession().setAttribute("messageShow","用戶名重復");response.sendRedirect("Register.jsp");return;}if(!userRegister.isRightCode(phoneVerifyCode, (String) request.getSession().getAttribute("phoneCode"))){request.getSession().setAttribute("messageShow","驗證碼錯誤");response.sendRedirect("Register.jsp");return;}userRegister.insertUser(user);request.getSession().setAttribute("username",username);request.getRequestDispatcher("RegisterSuccess.jsp").forward(request,response);}
}

?

UserRegister--->實現業務層的接口,對數據庫進行CRUD操作的類

public class UserRegister implements Service.UserRegister{private DataSource dataSource=new ComboPooledDataSource();private QueryRunner qr=new QueryRunner(dataSource);@Overridepublic boolean isRightCode(String code, String rightCode) {return code.equalsIgnoreCase(rightCode);}@Overridepublic boolean isRepeatUsername(String username) {User user=null;try {user = qr.query("select * from user where username=?", new BeanHandler<>(User.class), username);} catch (SQLException e) {e.printStackTrace();}return user!=null;}@Overridepublic void insertUser(User user) {try {qr.update("insert into user(username,password,telephone) values (?,?,?)",user.getUsername(),user.getPassword(),user.getTelephone());} catch (SQLException e) {e.printStackTrace();}}
}

?



    以上為注冊模塊主要的代碼,剩下的要么是實體類(User類用來封裝用戶輸入的信息、CodeEntity類用來將手機驗證碼返回的jsonArray轉為該對象),要么是工具類(MD5加密密碼),要么就是業務層定義的接口(用戶注冊的功能設定)。

差不多就這樣了,就不放上來了,這么多也不一定看的完..........代碼臃腫,得治。。。注冊短信驗證碼到這里就實現了,剩下郵件驗證激活和登錄......先放著。

?

收到的短信可以自己設置模板,但是要審核,不要刷的太頻繁,不然o( ̄ヘ ̄o#)---------->{"code":416,"msg":"mobile limit","obj":"4322605||+86-xxxxxxxxx"},mobile limit,電話號碼就xxxxx了。

  注冊成功后進入,郵箱激活界面,用戶名可在注冊的Sevlet中存session,在這個頁面通過el獲取-----.>

        2018.02.02 記


?

轉載于:https://www.cnblogs.com/Alice-Thinker/p/8406325.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250989.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ES6-15 map與set

Promise、Proxy、Map、Set這些ES6新增的api無法用babel實現語法降級&#xff0c;需要使用到polyfill Set 成員是唯一的&#xff0c;不能重復有iterator接口&#xff0c;可迭代具有iterator接口的所有類型&#xff0c;都能作為new Set()的參數&#xff0c;如類數組、數組 con…

jquery --- DOM操作、表單元素的初始化

1.獲取ul里第2個li節點: var $li_two $("ul li:eq(1)"); // 獲取該節點的內容 var $li_two_txt $li_two.text();2.獲取p元素節點的title屬性: var $para $("p"); var p_title $para.attr("title");3.創建2個li節點,并添加道ul中: var $li…

Jquery中post與get之間的區別詳細介紹

1:GET訪問瀏覽器認為是等冪的 GET訪問瀏覽器認為是等冪的&#xff0c;就是一個相同的URL只有一個結果&#xff0c;相同是指整個URL字符串完全匹配。所以&#xff0c;第二次訪問的時候&#xff0c;如果URL字符串沒變化 瀏覽器是直接拿出了第一次訪問的結果&#xff1b; POST則認…

LeetCode 424. Longest Repeating Character Replacement

原題鏈接在這里&#xff1a;https://leetcode.com/problems/longest-repeating-character-replacement/description/ 題目&#xff1a; Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at mo…

ES6-16 WeakMap與WeakSet、proxy與reflect

WeakMap/WeakSet 原型上不存在遍歷方法(沒有部署iterator接口)成員只能是對象垃圾回收機制不考慮對成員對象的應用 WeakSet/WeakMap 中的對象都是弱引用&#xff0c;即垃圾回收機制不考慮 WeakSet 對該對象的引用&#xff0c;也就是說&#xff0c;如果其他對象都不再引用該對象…

jquery--- 屬性和樣式的操作 設置和獲取HTML、文本和值、焦點事件

1.獲取p元素的title屬性: var title $("p").attr("title");2.給p元素加title屬性(值為:栗子)和date屬性(值為:2019/7/15): $("p").attr("title":"栗子", "date":"2019/7/15");3.刪除p中的title屬性:…

day9

前方高能---初識函數 一. 什么是函數 函數:對代碼塊和功能的封裝和定義. 二. 函數的定義,函數名,函數體,以及函數的調用 def 函數名(): 函數體 函數體:就是函數被執行之后要執行的代碼. 三, 函數的返回 執行完函數之后,我們可以使用return來返回結果. 函數中return的使用: 1.函…

MySQL 數據庫索引

數據庫索引在數據庫中、索引使數據庫程序無須對整個表進行全表掃描就可以在其中找到所需的數據&#xff1b;數據庫中的索引是某個表中一列或者若干列值的集合、以及物理標識這些值的數據頁的邏輯指針清單&#xff1b;MySQL 索引的增刪查SQL 語句效率的分析索引的作用&#xff1…

ES6-17 class與對象

class 模擬類的方式語法糖&#xff08;把以前的寫法換了一個方式&#xff09; 類內部的方法是不可枚舉的 ES5用Object.assign拓展的原型屬性是可枚舉的 function Point(x, y) {this.x x;this.y y; } // 這樣定義的原型上方法eat\drink是可枚舉的 Point.prototype Object…

8.8 正睿暑期集訓營 Day5

目錄 2018.8.8 正睿暑期集訓營 Day5總結A 友誼巨輪(線段樹 動態開點)B 璀璨光滑C 構解巨樹考試代碼ABC2018.8.8 正睿暑期集訓營 Day5時間&#xff1a;3.5h(實際)期望得分&#xff1a;602020實際得分&#xff1a;202020 比賽鏈接這里也有一些 總結 線段樹&#xff01;&#xff0…

算法 --- 二叉樹的最大深度

思路: 1.二叉樹的深度,等于Max(左子樹最大深度,右子樹最大深度) 1 2.節點不存在時,此時的深度為0 3.當節點存在,左右子樹不存在時(此時為葉子節點) 返回1 /*** Definition for a binary tree node.* function TreeNode(val) {* this.val val;* this.left this.righ…

ES6-18/19 異步的開端-promise

ES6-18異步的開端-promise ES6-19 promise的使用方法和自定義promisify try catch只能捕獲同步異常&#xff0c;不能捕獲異步的 等待所有異步都執行完&#xff0c;打印結果&#xff0c;比較笨拙的方法&#xff0c;在每個異步操作加arr.length 3 && show(arr) Promis…

leetcode35 C++ 4ms 搜索插入位置

class Solution { public:int searchInsert(vector<int>& nums, int target) {for(int i 0;i<nums.size();i){if(nums[i] > target){return i;}}return nums.size()-1;} }; 轉載于:https://www.cnblogs.com/theodoric008/p/9449049.html

OpenCV-Python 中文教程(搬運)目錄

OpenCV-Python 中文教程 OpenCV官方教程中文版&#xff08;For Python&#xff09; OpenCV2-Python-Tutorials 段力輝 譯 說明&#xff1a;搬運自linux公社pdf文件&#xff0c;粗略搬運&#xff0c;僅作個人筆記參考&#xff0c;有時間再美化 部分文件參考&#xff1a; https:/…

算法 --- 平衡二叉樹

解題思路: 1.首先寫一個返回深度的函數d 2.寫一個遍歷函數t 3.在t中首先判斷,r是否為空(為空則此時就是平衡二叉樹,返回true),然后判斷是否為葉子節點(r.left null && r.right null)若是則返回true,最后判斷,其左子樹的深度與右子樹的深度之差是否大于1.若是則返回fal…

【co】ES6-20/21 iterator與generator

ES6-20 iterator與generator ES6-21 async與await、ES6的模塊化 try catch不能捕獲異步異常 try catch是同步代碼 try {setTimeout(() > {console.log(a)}) } catch (e) {console.log(e) }iterator 內部迭代器&#xff1a;系統定義好的迭代器接口&#xff08;如數組Symbol…

嵌入式系統UBOOT

一個完整的嵌入式linux系統包含4部分內容&#xff1a;Bootloader、Parameters、Kernel、Root File System。3、4、5、6部分詳細介紹了這4部分的內容&#xff0c;這是Linux底層軟件開發人員應該掌握的。通過學習這些章節&#xff0c;您可以詳細了解到如何在一個裸板上裁減、移植…

驅動芯片

一 LED驅動芯片&#xff1a; 1.1 TM1640:16位數碼管驅動芯片&#xff0c;2線制控制&#xff08;CLK/DIN&#xff09;,SCLK低電平時DIN輸入&#xff0c;而SCLK高電平時保持DIN保持不變&#xff1b;開始傳輸&#xff1a;SCLKH時DIN由高變低&#xff0c;停止傳輸SCLKH時DIN由由低變…

jquery --- 控制元素的隱藏/顯示

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> </head> <body> <div id"panel"><h5 class"head">什么是jquery?</h5><div class"content" style"display:non…

confusion_matrix(混淆矩陣)

作者&#xff1a;十歲的小男孩 凡心所向&#xff0c;素履可往 目錄 監督學習—混淆矩陣 是什么&#xff1f;有什么用&#xff1f;怎么用&#xff1f; 非監督學習—匹配矩陣 混淆矩陣 矩陣每一列代表預測值&#xff0c;每一行代表的是實際的類別。這個名字來源于它可以非常容…