JavaWeb黑马旅游网-学习笔记02【注册功能】
- Java后端 學習路線 筆記匯總表【黑馬程序員】
目錄
05-注冊功能_功能分析
06-注冊功能_前臺_表單校驗1
07-注冊功能_前臺_表單校驗2
08-注冊功能_前臺_異步提交表單
09-注冊功能_后臺_Servlet代碼實現
處理編碼過濾器Filter?CharchaterFilter.java
其他Java代碼
10-注冊功能_后臺_Dao代碼實現
11-注冊功能_后臺_service代碼實現&測試
12-注冊功能_后臺_驗證碼&前臺數據處理
前臺驗證碼
驗證碼 CheckCodeServlet.java
后臺驗證碼校驗
RegistUserServlet.java
13-注冊功能_后臺_郵件激活分析
14-注冊功能_郵件激活_發送郵件
MailUtils.java 發送郵件工具類
15-注冊功能_郵件激活_點擊激活分析
發送郵件
用戶點擊郵件激活
發送郵件代碼
UUID
16-注冊功能_郵件激活_代碼實現_Servlet
ActiveUserServlet.java
17-注冊功能_郵件激活_代碼實現_Service&Dao
UserDao.java
UserDaoImpl.java
修改保存Dao代碼,加上存儲status和code 的代碼邏輯
05-注冊功能_功能分析
頁面效果:
注冊功能分析06-注冊功能_前臺_表單校驗1
表單校驗:
 ? ? 1.用戶名:單詞字符,長度8到20位
 ? ? 2.密碼:單詞字符,長度8到20位
 ? ? 3.email:郵件格式
 ? ? 4.姓名:非空
 ? ? 5.手機號:手機號格式
 ? ? 6.出生日期:非空
 ? ? 7.驗證碼:非空
07-注冊功能_前臺_表單校驗2
提升用戶體驗,并減輕服務器壓力。
??
??
08-注冊功能_前臺_異步提交表單
異步(ajax)提交表單
在此使用“異步提交表單”是為了獲取服務器響應的數據。因為我們前臺使用的是html作為視圖層,不能夠直接從servlet相關的域對象獲取值,只能通過ajax獲取響應數據。
09-注冊功能_后臺_Servlet代碼實現
6.3.5?? ?編寫RegistUserServlet
6.3.6?? ?編寫UserService以及UserServiceImpl
6.3.7?? ?編寫UserDao以及UserDaoImpl
處理編碼過濾器Filter?CharchaterFilter.java
package cn.itcast.travel.web.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** 解決全站亂碼問題,處理所有的請求*/ @WebFilter("/*") public class CharchaterFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {//將父接口轉為子接口HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) rep;//獲取請求方法String method = request.getMethod();//解決post請求中文數據亂碼問題if (method.equalsIgnoreCase("post")) {request.setCharacterEncoding("utf-8");}//處理響應亂碼response.setContentType("text/html;charset=utf-8");filterChain.doFilter(request, response);}@Overridepublic void destroy() {} }其他Java代碼
10-注冊功能_后臺_Dao代碼實現
11-注冊功能_后臺_service代碼實現&測試
12-注冊功能_后臺_驗證碼&前臺數據處理
前臺驗證碼
驗證碼 CheckCodeServlet.java
package cn.itcast.travel.web.servlet;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;/*** 驗證碼*/ @WebServlet("/checkCode") public class CheckCodeServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//服務器通知瀏覽器不要緩存response.setHeader("pragma", "no-cache");response.setHeader("cache-control", "no-cache");response.setHeader("expires", "0");//在內存中創建一個長80,寬30的圖片,默認黑色背景//參數一:長//參數二:寬//參數三:顏色int width = 80;int height = 30;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//獲取畫筆Graphics g = image.getGraphics();//設置畫筆顏色為灰色g.setColor(Color.GRAY);//填充圖片g.fillRect(0, 0, width, height);//產生4個隨機驗證碼,12EyString checkCode = getCheckCode();//將驗證碼放入HttpSession中request.getSession().setAttribute("CHECKCODE_SERVER", checkCode);//設置畫筆顏色為黃色g.setColor(Color.YELLOW);//設置字體的小大g.setFont(new Font("黑體", Font.BOLD, 24));//向圖片上寫入驗證碼g.drawString(checkCode, 15, 25);//將內存中的圖片輸出到瀏覽器//參數一:圖片對象//參數二:圖片的格式,如PNG,JPG,GIF//參數三:圖片輸出到哪里去ImageIO.write(image, "PNG", response.getOutputStream());}/*** 產生4位隨機字符串*/private String getCheckCode() {String base = "0123456789ABCDEFGabcdefg";int size = base.length();Random r = new Random();StringBuffer sb = new StringBuffer();for (int i = 1; i <= 4; i++) {//產生0到size-1的隨機值int index = r.nextInt(size);//在base字符串中獲取下標為index的字符char c = base.charAt(index);//將c放入到StringBuffer中去sb.append(c);}return sb.toString();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }后臺驗證碼校驗
RegistUserServlet.java
package cn.itcast.travel.web.servlet;import cn.itcast.travel.domain.ResultInfo; import cn.itcast.travel.domain.User; import cn.itcast.travel.service.UserService; import cn.itcast.travel.service.impl.UserServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.beanutils.BeanUtils;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map;@WebServlet("/registUserServlet") public class RegistUserServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//驗證校驗String check = request.getParameter("check");//從session中獲取驗證碼HttpSession session = request.getSession();String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");session.removeAttribute("CHECKCODE_SERVER");//為了保證驗證碼只能使用一次//比較if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)) {//驗證碼錯誤ResultInfo info = new ResultInfo();//注冊失敗info.setFlag(false);info.setErrorMsg("驗證碼錯誤");//將info對象序列化為jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(info);response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);return;}//1.獲取數據Map<String, String[]> map = request.getParameterMap();//2.封裝對象User user = new User();try {BeanUtils.populate(user, map); // 將map對應的數據封裝進user對應的屬性中} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//3.調用service完成注冊UserService service = new UserServiceImpl();boolean flag = service.regist(user);ResultInfo info = new ResultInfo();//4.響應結果if (flag) {//注冊成功info.setFlag(true);} else {//注冊失敗info.setFlag(false);info.setErrorMsg("注冊失敗!");}//將info對象序列化為jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(info);//將json數據寫回客戶端//設置content-typeresponse.setContentType("application/json;charset=utf-8");response.getWriter().write(json);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }13-注冊功能_后臺_郵件激活分析
為什么要進行郵件激活?為了保證用戶填寫的郵箱是正確的。將來可以推廣一些宣傳信息到用戶郵箱中。
- 發送郵件。
- 用戶點擊郵件,進行激活。
14-注冊功能_郵件激活_發送郵件
MailUtils.java 發送郵件工具類
什么是授權碼,它又是如何設置?_QQ郵箱幫助中心
package cn.itcast.travel.util;import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties;/*** 發郵件工具類*/ public final class MailUtils {private static final String USER = ""; // 發件人稱號,同郵箱地址private static final String PASSWORD = ""; // 如果是qq郵箱可以使戶端授權碼,或者登錄密碼/*** @param to 收件人郵箱* @param text 郵件正文* @param title 標題*//* 發送驗證信息的郵件 */public static boolean sendMail(String to, String text, String title) {try {final Properties props = new Properties();props.put("mail.smtp.auth", "true");props.put("mail.smtp.host", "smtp.qq.com");// 發件人的賬號props.put("mail.user", USER);//發件人的密碼props.put("mail.password", PASSWORD);// 構建授權信息,用于進行SMTP進行身份驗證Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用戶名、密碼String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用環境屬性和授權信息,創建郵件會話Session mailSession = Session.getInstance(props, authenticator);// 創建郵件消息MimeMessage message = new MimeMessage(mailSession);// 設置發件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 設置收件人InternetAddress toAddress = new InternetAddress(to);message.setRecipient(Message.RecipientType.TO, toAddress);// 設置郵件標題message.setSubject(title);// 設置郵件的內容體message.setContent(text, "text/html;charset=UTF-8");// 發送郵件Transport.send(message);return true;} catch (Exception e) {e.printStackTrace();}return false;}public static void main(String[] args) throws Exception { // 做測試用MailUtils.sendMail("itcast_xian@163.com", "你好,這是一封測試郵件!無需回復。", "測試郵件!");System.out.println("發送成功!!!");} }15-注冊功能_郵件激活_點擊激活分析
發送郵件
郵件工具類:MailUtils,調用其中sendMail方法可以完成郵件發送。
用戶點擊郵件激活
經過分析,發現,用戶激活其實就是修改用戶表中的status為‘Y’。
分析:
發送郵件代碼
UUID
package cn.itcast.travel.util;import java.util.UUID;/*** 產生UUID隨機字符串工具類*/ public final class UuidUtil {private UuidUtil() {}public static String getUuid() {return UUID.randomUUID().toString().replace("-", "");}/*** 測試*/public static void main(String[] args) {System.out.println(UuidUtil.getUuid());System.out.println(UuidUtil.getUuid());System.out.println(UuidUtil.getUuid());System.out.println(UuidUtil.getUuid());} }16-注冊功能_郵件激活_代碼實現_Servlet
ActiveUserServlet
- UserService:active
- UserDao:findByCode、updateStatus
ActiveUserServlet.java
package cn.itcast.travel.web.servlet;import cn.itcast.travel.service.UserService; import cn.itcast.travel.service.impl.UserServiceImpl;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/activeUserServlet") public class ActiveUserServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.獲取激活碼String code = request.getParameter("code");if (code != null) {//2.調用service完成激活UserService service = new UserServiceImpl();boolean flag = service.active(code);//3.判斷標記String msg = null;if (flag) {//激活成功msg = "激活成功,請<a href='login.html'>登錄</a>";} else {//激活失敗msg = "激活失敗,請聯系管理員!";}response.setContentType("text/html;charset=utf-8");response.getWriter().write(msg);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }17-注冊功能_郵件激活_代碼實現_Service&Dao
UserDao.java
UserDaoImpl.java
修改保存Dao代碼,加上存儲status和code 的代碼邏輯
內心純潔的人是那么容易被觸動,會為了別人的幸福而喜悅,會為了別人的痛苦而悲傷,會為了有人關心而溫暖,會為了美好的事物而觸動。
有平凡人的喜樂,也有平凡人的悲苦,也有平凡人的追求,希望活在愛中,也不吝嗇付出自己的愛。
在孤單無助時會去尋求幫助或者自己努力解決問題,而不是一味逃避,活成行尸走肉。
總結
以上是生活随笔為你收集整理的JavaWeb黑马旅游网-学习笔记02【注册功能】的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JavaWeb图书管理系统day03
- 下一篇: 电脑win10-重装系统
