注冊登錄界面尤為常見,我的界面尤為難看,勉為其難的寫吧,前端不熟就是這樣。。。
這個案例運用到了:
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>密 碼: <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>密 碼:<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 記
?