前言:
這篇文章所涉及的關鍵部分是在關於JavaMail實現QQ郵箱發送郵件的實現(一)的基礎上完成的,所以請先閱讀上一篇文章,以便更好的理解這一篇。這篇文章中實現的功能是,在用戶注冊的時候,通過系統郵箱向注冊的郵箱發送一封激活郵件,在點擊激活之后,完成用戶的注冊。
需要的相關JAR包和配置文件下載:https://i.cnblogs.com/Files.aspx
一 引入相關JAR包
1.在新建的Java Web工程中的WebRoot-->WEB-INF-->lib下導入以下這個四個JAR包
2. 在Java Web工程中的src目錄下導入c3p0配置文件
二 搭建好包結構和類結構
三 數據庫相關
1.創建MYSQL數據庫
1 /** 2 * state 是激活狀態,0:未激活 1:已經激活 3 * code 是激活碼 4 */ 5 6 create database mail; 7 use mail; 8 create table user ( 9 id int primary key auto_increment, 10 username varchar(20) default null, 11 password varchar(20) default null, 12 email varchar(30) default null, 13 state int(11) default null, 14 code varchar(64) default null 15 );
2.創建數據庫類JDBCUtils.java (數據池連接)
1 package com.mail.utils; 2 3 import com.mchange.v2.c3p0.ComboPooledDataSource; 4 5 public class JDBCUtils { 6 private static String url = "jdbc:mysql://localhost:3306/mail"; //注意用自己的創建的數據庫 7 private static String user = "root"; 8 private static String passwd = "數據庫登錄密碼"; 9 private static String driver = "com.mysql.jdbc.Driver"; 10 11 public static ComboPooledDataSource getDataSource() throws Exception{ 12 ComboPooledDataSource cpds = new ComboPooledDataSource(); 13 cpds.setDriverClass( driver); 14 cpds.setJdbcUrl( url ); 15 cpds.setUser(user); 16 cpds.setPassword(passwd); 17 cpds.setMinPoolSize(5); 18 cpds.setAcquireIncrement(5); 19 cpds.setMaxPoolSize(30); 20 cpds.setMaxIdleTime(60); 21 return cpds; 22 } 23 }
四 核心代碼
1.創建一個表單的注冊頁面register.jsp,該表單會提交到RegisterServlet上
1 <!-- 用戶注冊的頁面 --> 2 3 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 4 5 <% 6 String path = request.getContextPath(); 7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 8 %> 9 10 11 12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 13 <html> 14 <head> 15 <base href="<%=basePath%>"> 16 17 <title>My JSP 'register.jsp' starting page</title> 18 19 <meta http-equiv="pragma" content="no-cache"> 20 <meta http-equiv="cache-control" content="no-cache"> 21 <meta http-equiv="expires" content="0"> 22 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 23 <meta http-equiv="description" content="This is my page"> 24 <!-- 25 <link rel="stylesheet" type="text/css" href="styles.css"> 26 --> 27 28 </head> 29 30 <body> 31 <h1>用戶注冊界面</h1> 32 <form action="RegisterServlet" method="post"> 33 <table border="1"> 34 <tr> 35 <td>用戶名:</td> 36 <td><input type="text" name="username" size="30"></td> 37 </tr> 38 <tr> 39 <td>密碼:</td> 40 <td><input type="password" name="password" size="30"></td> 41 </tr> 42 <tr> 43 <td>驗證郵箱:</td> 44 <td><input type="text" name="email" size="30"></td> 45 </tr> 46 <tr> 47 <td colspan="2" align="center"><input type="submit" value="提交"></td> 48 </tr> 49 </table> 50 </form> 51 </body> 52 </html>
2.創建User對象類User.java
1 package com.mail.bean; 2 3 /** 4 * 5 * user的javabean實體類 6 * 7 */ 8 public class User { 9 private Integer id; 10 private String username; 11 private String password; 12 private String email; 13 private Integer state; 14 private String code; 15 16 public Integer getId() { 17 return id; 18 } 19 public void setId(Integer id) { 20 this.id = id; 21 } 22 public String getUsername() { 23 return username; 24 } 25 public void setUsername(String username) { 26 this.username = username; 27 } 28 public String getPassword() { 29 return password; 30 } 31 public void setPassword(String password) { 32 this.password = password; 33 } 34 public String getEmail() { 35 return email; 36 } 37 public void setEmail(String email) { 38 this.email = email; 39 } 40 public Integer getState() { 41 return state; 42 } 43 public void setState(Integer state) { 44 this.state = state; 45 } 46 public String getCode() { 47 return code; 48 } 49 public void setCode(String code) { 50 this.code = code; 51 } 52 }
3. register.jsp提交過來的數據由RegisterServlet.java處理,而RegisterServlet.java只能調用業務層UserService.java接口
1 package com.mail.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import com.mail.bean.User; 11 import com.mail.service.UserService; 12 import com.mail.service.UserServiceImpl; 13 import com.mail.utils.UUIDUtils; 14 15 public class RegisterServlet extends HttpServlet { 16 17 private static final long serialVersionUID = 1L; 18 19 public void doGet(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 22 //接收表格傳進來的數據 23 request.setCharacterEncoding("GB18030"); //設置編碼 24 String username = request.getParameter("username"); 25 String password = request.getParameter("password"); 26 String email = request.getParameter("email"); 27 28 //數據封裝 29 User user = new User(); 30 user.setUsername(username); 31 user.setPassword(password); 32 user.setEmail(email); 33 user.setState(0); //0:未激活 1:已激活 34 String code = UUIDUtils.getUUID(); //得到的編碼去掉所有"-",剩32位 35 user.setCode(code); 36 37 //調用業務層傳遞用戶信息 38 UserService userService = new UserServiceImpl(); 39 userService.register(user); 40 41 //頁面跳轉 42 request.setAttribute("msg", "您已注冊成功,請去郵箱激活!"); 43 request.getRequestDispatcher("/msg.jsp").forward(request, response); 44 } 45 46 public void doPost(HttpServletRequest request, HttpServletResponse response) 47 throws ServletException, IOException { 48 doGet(request, response); //記得一定要調用這個 49 } 50 51 }
4. UserService.java接口代碼
1 package com.mail.service; 2 3 import com.mail.bean.User; 4 5 public interface UserService { 6 7 void register(User user); 8 9 User foundByCode(String code); 10 11 void update(User user); 12 13 }
5.UserServiceImpl.java實現了UserService.java接口
1 package com.mail.service; 2 3 import javax.mail.MessagingException; 4 import javax.mail.internet.AddressException; 5 6 import com.mail.bean.User; 7 import com.mail.dao.UserDAO; 8 import com.mail.dao.UserDaoImpl; 9 import com.mail.utils.MailUtils; 10 11 public class UserServiceImpl implements UserService { 12 13 @Override 14 public void register(User user) { 15 //向dao傳遞user 16 UserDAO userDAO = new UserDaoImpl(); 17 userDAO.register(user); 18 19 //給郵箱發送一封郵件 20 try { 21 MailUtils.senMail(user.getEmail(), user.getCode()); 22 } catch (AddressException e) { 23 e.printStackTrace(); 24 } catch (MessagingException e) { 25 e.printStackTrace(); 26 } 27 } 28 29 @Override 30 public User foundByCode(String code) { 31 UserDAO userDAO = new UserDaoImpl(); 32 return userDAO.foundByCode(code); 33 } 34 35 @Override 36 public void update(User user) { 37 UserDAO userDAO = new UserDaoImpl(); 38 userDAO.update(user); 39 } 40 }
6.UserServiceImpl.java調用數據層接口的接口類UserDAO.java
1 package com.mail.dao; 2 3 import com.mail.bean.User; 4 5 public interface UserDAO { 6 7 void register(User user); 8 9 User foundByCode(String code); 10 11 void update(User user); 12 13 }
7.同樣的UserDaoImpl.java為UserDAO.java的實現類,直接調用了數據庫連接池
1 package com.mail.dao; 2 3 import java.sql.SQLException; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanHandler; 7 8 import com.mail.bean.User; 9 import com.mail.utils.JDBCUtils; 10 11 public class UserDaoImpl implements UserDAO { 12 13 @Override 14 public void register(User user) { 15 QueryRunner queryRunner = null; 16 try { 17 queryRunner = new QueryRunner(JDBCUtils.getDataSource()); //連接數據池 18 String sql = "insert into user values (?, ?, ?, ?, ?, ?)"; //插入數據 19 Object[] params = {user.getId(), user.getUsername(), user.getPassword(), user.getEmail(), user.getState(), user.getCode()}; 20 queryRunner.update(sql, params); 21 } catch (SQLException e) { 22 e.printStackTrace(); 23 } catch (Exception e) { 24 e.printStackTrace(); 25 } 26 } 27 28 @Override 29 public User foundByCode(String code) { 30 QueryRunner queryRunner = null; 31 User user = null; 32 try { 33 queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 34 String sql = "select * from user where code = ?"; 35 //BeanHandler<T>用於獲取結果集中的第一行數據,並將其封裝到JavaBean對象 36 user = queryRunner.query(sql, new BeanHandler<User>(User.class), code); 37 } catch (Exception e) { 38 e.printStackTrace(); 39 } 40 return user; 41 } 42 43 @Override 44 public void update(User user) { 45 QueryRunner queryRunner = null; 46 try { 47 queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 48 String sql = "update user set username=?, password=?, email=?, state=?, code=? where id=?"; 49 Object[] params = {user.getUsername(), user.getPassword(), user.getEmail(), user.getState(), user.getCode(),user.getId()}; 50 queryRunner.update(sql, params);52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 } 56 }
8.接着就是發送一封激活郵件給郵箱MailUtils.java
1 package com.mail.utils; 2 3 import java.util.Properties; 4 5 import javax.mail.Message; 6 import javax.mail.MessagingException; 7 import javax.mail.Session; 8 import javax.mail.Transport; 9 import javax.mail.internet.AddressException; 10 import javax.mail.internet.InternetAddress; 11 import javax.mail.internet.MimeMessage; 12 import javax.mail.internet.MimeMessage.RecipientType; 13 14 public class MailUtils { 15 public static void senMail(String toMail, String code) throws AddressException, MessagingException { 16 17 Properties properties = new Properties(); 18 properties.put("mail.transport.protocol", "smtp"); // 連接協議 19 properties.put("mail.smtp.host", "smtp.qq.com"); // 主機名 20 properties.put("mail.smtp.port", 465); // 端口號 21 properties.put("mail.smtp.auth", "true"); 22 properties.put("mail.smtp.ssl.enable", "true"); // 設置是否使用ssl安全連接 (一般都使用) 23 properties.put("mail.debug", "true"); // 設置是否顯示debug信息 true 會在控制台顯示相關信息 24 // 得到回話對象 25 Session session = Session.getInstance(properties); 26 // 獲取郵件對象 27 Message message = new MimeMessage(session); 28 // 設置發件人郵箱地址 29 message.setFrom(new InternetAddress("系統郵箱@qq.com")); 30 // 設置收件人地址 31 message.setRecipients( RecipientType.TO, new InternetAddress[] { new InternetAddress(toMail) }); 32 // 設置郵件標題 33 message.setSubject("由JavaMail發出的測試郵件"); 34 // 設置郵件內容 35 message.setContent("<h1>請點擊以下鏈接址激活注冊:</br><h3>(若無法點擊,請復制到瀏覽器中打開)</h3></h1><h3><a herf='http://localhost:8080/MailTest/ActiveServlet?code="+code+"'>http://localhost:8080/MailTest/ActiveServlet?code="+code+"</a></h3>","text/html;Charset=UTF-8"); 36 // 得到郵差對象 37 Transport transport = session.getTransport(); 38 // 連接自己的郵箱賬戶 39 transport.connect("系統郵箱@qq.com", "cnqhvvkhqnzzbgce"); //密碼為剛才得到的授權碼 40 // 發送郵件 41 transport.sendMessage(message, message.getAllRecipients()); 42 } 43 }
9.響應激活郵箱的servlet類ActiveServlet.java
1 package com.mail.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import com.mail.bean.User; 11 import com.mail.service.UserService; 12 import com.mail.service.UserServiceImpl; 13 14 public class ActiveServlet extends HttpServlet { 15 16 private static final long serialVersionUID = 1L; 17 18 public void doGet(HttpServletRequest request, HttpServletResponse response) 19 throws ServletException, IOException { 20 //接受郵箱鏈接的激活碼 21 String code = request.getParameter("code"); 22 23 //根據激活碼查找到用戶 24 UserService userService = new UserServiceImpl(); 25 User user = userService.foundByCode(code); 26 if (user != null) { 27 user.setState(1); 28 user.setCode(null); 29 userService.update(user); 30 request.setAttribute("msg", "您已激活成功,請去登陸!"); 31 }else { 32 //沒有查到該用戶 33 request.setAttribute("msg", "您的激活碼有誤,請點擊鏈接重新激活!"); 34 } 35 36 //跳轉至指定頁面 37 request.getRequestDispatcher("/msg.jsp").forward(request, response); 38 } 39 40 public void doPost(HttpServletRequest request, HttpServletResponse response) 41 throws ServletException, IOException { 42 doGet(request, response); 43 } 44 45 }
10. msg.jsp代碼
1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'msg.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <h1> ${ msg } </h1> 27 </body> 28 </html>
11.生成激活碼的代碼
1 package com.mail.utils; 2 3 /** 4 * 用UUID隨機產生字符串,用於激活碼code 5 */ 6 7 import java.util.UUID; 8 9 public class UUIDUtils { 10 public static String getUUID() { 11 return UUID.randomUUID().toString().replaceAll("-", ""); 12 } 13 }
12.Servlet的.xml配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 6 <servlet> 7 <description>My First Servlet</description> 8 <display-name>HelloServle</display-name> 9 <servlet-name>RegisterServlet</servlet-name> 10 <servlet-class>com.mail.servlet.RegisterServlet</servlet-class> 11 </servlet> 12 <servlet> 13 <description>My First Servlet</description> 14 <display-name>HelloServle</display-name> 15 <servlet-name>ActiveServlet</servlet-name> 16 <servlet-class>com.mail.servlet.ActiveServlet</servlet-class> 17 </servlet> 18 19 20 <servlet-mapping> 21 <servlet-name>RegisterServlet</servlet-name> 22 <url-pattern>/RegisterServlet</url-pattern> 23 </servlet-mapping> 24 <servlet-mapping> 25 <servlet-name>ActiveServlet</servlet-name> 26 <url-pattern>/ActiveServlet</url-pattern> 27 </servlet-mapping> 28 29 </web-app>
五 完成
以上為全部代碼內容,一定主要XML的文件配置以及JAR導入不要出錯,根據部分人JDK環境的不同,可能還需要activation.jar和mail.jar兩個包,在試用以上代碼的時候一定要注意每一層的調用關系,有些地方需要自己修改的要注意(比如數據庫的登陸密碼,自己設置的系統郵箱,已經授權碼等),要是看完之后發現有錯誤的地方或者又不理解的地方,請給我留言。最后祝大家開心度過每一天!o(* ̄▽ ̄*)ブ