一.創建數據庫foxmail,再創建user表
CREATE DATABASE Foxmail;
USE Foxmail;
CREATE TABLE `user`(
`uid` INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(20) DEFAULT NULL,
`nickname` VARCHAR(20) DEFAULT NULL,
`email` VARCHAR(30) DEFAULT NULL,
`state` INT(11) DEFAULT NULL,
`code` VARCHAR(64) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
二.配置環境,安裝軟件
eyoumailserversetup.exe :易郵郵件服務器
Foxmail.exe :Foxmail客戶端
1.創建郵箱賬號
2.登錄Foxmail客戶端
三.使用eclipse編寫代碼
1.新建一個web項目
2.實體類domain
代碼如下:----User.java
1 package com.xigua.domain; 2 3 public class User { 4 5 private Integer uid; 6 private String username; 7 private String password; 8 private String nickname; 9 private String email; 10 private Integer state; 11 private String code; 12 public Integer getUid() { 13 return uid; 14 } 15 public void setUid(Integer uid) { 16 this.uid = uid; 17 } 18 public String getUsername() { 19 return username; 20 } 21 public void setUsername(String username) { 22 this.username = username; 23 } 24 public String getPassword() { 25 return password; 26 } 27 public void setPassword(String password) { 28 this.password = password; 29 } 30 public String getNickname() { 31 return nickname; 32 } 33 public void setNickname(String nickname) { 34 this.nickname = nickname; 35 } 36 public String getEmail() { 37 return email; 38 } 39 public void setEmail(String email) { 40 this.email = email; 41 } 42 public Integer getState() { 43 return state; 44 } 45 public void setState(Integer state) { 46 this.state = state; 47 } 48 public String getCode() { 49 return code; 50 } 51 public void setCode(String code) { 52 this.code = code; 53 } 54 55 56 57 }
3.C3P0.config.xml代碼
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 4 <c3p0-config> 5 <default-config> 6 <property name="driverClass">com.mysql.jdbc.Driver</property> 7 <property name="jdbcUrl">jdbc:mysql://localhost:3306/foxmail</property> 8 <property name="user">root</property> 9 <property name="password">123</property> 10 11 <property name="acquireIncrement">5</property> 12 <property name="initialPoolSize">10</property> 13 <property name="minPoolSize">5</property> 14 <property name="maxPoolSize">20</property> 15 16 17 </default-config> 18 19 </c3p0-config>
4.編寫utils包內的工具類
C3P0Util.java 代碼如下:
1 package com.xigua.utils; 2 3 import javax.sql.DataSource; 4 5 import com.mchange.v2.c3p0.ComboPooledDataSource; 6 7 public class C3P0Util { 8 /** 9 * 配置文件的名字只能叫c3p0-config.xml ,位置只能放在src的根目錄下�?? 10 * 默認是去找default-config的配�? 11 */ 12 private static ComboPooledDataSource dataSource=new ComboPooledDataSource(); 13 14 public static DataSource getDataSource(){ 15 return dataSource; 16 17 } 18 } 19 20
JDBCUtils.java 代碼如下:
1 package com.xigua.utils; 2 3 import java.beans.PropertyVetoException; 4 import java.sql.Connection; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 import com.mchange.v2.c3p0.ComboPooledDataSource; 11 import com.mchange.v2.c3p0.DataSources; 12 13 public class JDBCUtils { 14 private static String url = "jdbc:mysql://localhost:3306/foxmail"; 15 private static String user = "root"; 16 private static String passwd = "123"; 17 private static String driver = "com.mysql.jdbc.Driver"; 18 19 public static ComboPooledDataSource getDataSource() throws Exception{ 20 ComboPooledDataSource cpds = new ComboPooledDataSource(); 21 cpds.setDriverClass( driver); 22 cpds.setJdbcUrl( url ); 23 cpds.setUser(user); 24 cpds.setPassword(passwd); 25 cpds.setMinPoolSize(5); 26 cpds.setAcquireIncrement(5); 27 cpds.setMaxPoolSize(30); 28 cpds.setMaxIdleTime(60); 29 return cpds; 30 } 31 }
MailUtils.java代碼如下:
1 package com.xigua.utils; 2 3 import java.util.Properties; 4 5 import javax.mail.Authenticator; 6 import javax.mail.Message.RecipientType; 7 import javax.mail.MessagingException; 8 import javax.mail.PasswordAuthentication; 9 import javax.mail.Session; 10 import javax.mail.Transport; 11 import javax.mail.internet.AddressException; 12 import javax.mail.internet.InternetAddress; 13 import javax.mail.internet.MimeMessage; 14 15 public class MailUtils { 16 /** 17 * 18 * @param to:代表給誰發郵件 19 * @param code:代表激活碼是什么 20 * @throws MessagingException 21 * @throws AddressException 22 */ 23 24 public static void sendMail(String to,String code) throws Exception{ 25 //1.創建連接對象,連接到郵箱服務器 26 Properties props = new Properties(); 27 28 Session session=Session.getInstance(props, new Authenticator() { 29 30 @Override 31 protected PasswordAuthentication getPasswordAuthentication() { 32 /**創建一個郵箱賬號:service@mac.com 123 33 * 默認使用該賬號發送郵件 34 */ 35 //return new PasswordAuthentication("service@mac.com", "123"); 36 return new PasswordAuthentication("自己的QQ郵箱", "授權編碼"); 37 } 38 39 40 }); 41 42 //2.創建郵件對象 43 MimeMessage message = new MimeMessage(session); 44 //2.1設置發件人 45 /** 46 * service@mac.com是一個字符串, 47 * 將字符串轉換成地址:new InternetAddress("service@mac.com") 48 */ 49 message.setFrom(new InternetAddress("自己的QQ郵箱")); 50 51 //2.2設置收件人 52 message.setRecipient(RecipientType.TO, new InternetAddress(to)); 53 54 //2.3設置郵件主題 55 message.setSubject("這是一封激活郵件!"); 56 57 //2.4設置郵件正文 58 /** 59 * ?code="+code+" :表示從外面傳入一個激活碼 60 */ 61 message.setContent("<h1>來自西瓜瓜購物網站的激活郵件,激活請點擊以下鏈接:</h1> <h3> <a href='http://localhost:8080/Foxmail/ActiveServlet?code="+code+"'> http://localhost:8080/Foxmail/ActiveServlet?code="+code+" </a></h3>", "text/html;charset=UTF-8"); 62 63 //3.發送一封激活郵件 64 Transport.send(message); 65 } 66 67 68 69 }
UUIDUtils.java代碼如下:
1 package com.xigua.utils; 2 import java.util.UUID; 3 public class UUIDUtils { 4 //生成隨機字符串的工具類 5 public static String getUUID(){ 6 //取消短- 7 return UUID.randomUUID().toString().replace("-", ""); 8 9 } 10 11 }
5.編寫service包內代碼
UserService接口:
1 package com.xigua.service; 2 3 import com.xigua.domain.User; 4 5 public interface UserService { 6 void regist(User user) throws Exception; 7 8 User findByCode(String code) throws Exception; 9 10 void update(User user)throws Exception; 11 }
UserServiceImpl實現類:
1 package com.xigua.service.impl; 2 3 import com.xigua.dao.UserDao; 4 import com.xigua.dao.impl.UserDaoImpl; 5 import com.xigua.domain.User; 6 import com.xigua.service.UserService; 7 import com.xigua.utils.MailUtils; 8 9 public class UserServiceImpl implements UserService { 10 11 UserDao userDao = new UserDaoImpl(); 12 13 //業務層用戶注冊的方法: 14 public void regist(User user) throws Exception { 15 //將數據存入到數據庫 16 userDao.regist(user); 17 18 //發送一封激活郵件 19 /** 20 * 直接用發寫好的工具類發送郵件 21 */ 22 MailUtils.sendMail(user.getEmail(), user.getCode()); 23 24 } 25 26 @Override 27 //根據激活碼查找用戶 28 public User findByCode(String code) throws Exception { 29 30 return userDao.findByCode(code); 31 } 32 33 @Override 34 //業務層修改用戶的方法 35 public void update(User user) throws Exception { 36 userDao.update(user); 37 38 } 39 40 }
6.編寫dao包內代碼
UserDao接口:
1 package com.xigua.dao; 2 3 import java.sql.SQLException; 4 5 import com.xigua.domain.User; 6 7 public interface UserDao { 8 9 void regist(User user) throws Exception; 10 11 User findByCode(String code) throws Exception; 12 13 void update(User user)throws Exception; 14 15 }
UserDaoImpl實現類:
1 package com.xigua.dao.impl; 2 3 4 5 import java.sql.SQLException; 6 7 import org.apache.commons.dbutils.QueryRunner; 8 import org.apache.commons.dbutils.handlers.BeanHandler; 9 10 import com.xigua.dao.UserDao; 11 import com.xigua.domain.User; 12 13 import com.xigua.utils.JDBCUtils; 14 15 16 public class UserDaoImpl implements UserDao { 17 18 //Dao中保存用戶的方法 19 public void regist(User user) throws Exception { 20 21 //QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource()); 22 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 23 //寫SQL語句 24 String sql="insert into user values(?,?,?,?,?,?,?);"; 25 26 Object[] params={user.getUid(),user.getUsername(),user.getPassword(),user.getNickname(),user.getEmail(),user.getState(),user.getCode()}; 27 28 // 更新語句 29 queryRunner.update(sql,params); 30 31 } 32 33 @Override 34 //Dao中根據激活碼來查詢用戶的方法 35 public User findByCode(String code) throws Exception { 36 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 37 String sql="select * from user where code = ?"; 38 User user=queryRunner.query(sql,new BeanHandler<User>(User.class), code); 39 return user; 40 } 41 42 @Override 43 //Dao中修改用戶的方法 44 public void update(User user) throws Exception { 45 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 46 String sql="update user set username=?,password=?,nickname=?,email=?,state=?,code=? where uid=?;"; 47 48 Object[] params={user.getUsername(),user.getPassword(),user.getNickname(),user.getEmail(),user.getState(),user.getCode(),user.getUid()}; 49 // 更新語句 50 queryRunner.update(sql,params); 51 52 } 53 }
7.編寫action包內代碼
新建兩個Servlet,不是class
ActiveServlet代碼:
1 package com.xigua.action; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import com.xigua.domain.User; 10 import com.xigua.service.UserService; 11 import com.xigua.service.impl.UserServiceImpl; 12 13 public class ActiveServlet extends HttpServlet { 14 private static final long serialVersionUID = 1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 try { 18 //接收激活碼 19 String code = request.getParameter("code"); 20 //根據激活碼查用戶 21 System.out.println("code值:"+code); 22 UserService userService = new UserServiceImpl(); 23 24 User user=userService.findByCode(code); 25 26 if(user!=null){ 27 //已經查詢到,修改用戶狀態 28 user.setState(1);//狀態變為1 29 user.setCode(null);//狀態碼,點擊一次就失效了 30 userService.update(user); 31 request.setAttribute("msg", "恭喜你已經激活成功!請登錄~"); 32 33 }else{ 34 //根據激活碼沒有查詢到該用戶 35 request.setAttribute("msg", "您的激活碼有誤,請重新激活!"); 36 } 37 //頁面跳轉 38 request.getRequestDispatcher("/msg.jsp").forward(request, response); 39 40 } catch (Exception e) { 41 42 e.printStackTrace(); 43 } 44 } 45 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 47 doGet(request, response); 48 } 49 50 }
RegistServlet代碼:
1 package com.xigua.action; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import com.xigua.domain.User; 10 import com.xigua.service.UserService; 11 import com.xigua.service.impl.UserServiceImpl; 12 import com.xigua.utils.UUIDUtils; 13 14 public class RegistServlet extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 try { 19 //接收數據 20 //處理中文亂碼 21 request.setCharacterEncoding("UTF-8"); 22 23 String username = request.getParameter("username"); 24 String password = request.getParameter("password"); 25 String nickname = request.getParameter("nickname"); 26 String email = request.getParameter("email"); 27 28 //包裝數據 29 User user=new User(); 30 user.setUsername(username); 31 user.setPassword(password); 32 user.setNickname(nickname); 33 user.setEmail(email); 34 35 user.setState(0); //0未激活 1已激活 36 // UUIDUtils.getUUID()默認32位,若不夠,在+32位 37 String code = UUIDUtils.getUUID()+UUIDUtils.getUUID(); 38 39 user.setCode(code); 40 41 //調用業務層處理數據 42 UserService userService = new UserServiceImpl(); 43 44 userService.regist(user); 45 46 //頁面跳轉 47 request.setAttribute("msg", "您已經注冊成功!請去郵箱激活~"); 48 request.getRequestDispatcher("/msg.jsp").forward(request, response); 49 50 } catch (Exception e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 54 } 55 56 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 57 58 doGet(request, response); 59 } 60 61 }
8.編寫JSP代碼
注冊: regist.jsp 代碼
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>注冊界面</title> 8 </head> 9 <body> 10 <h1>用戶注冊</h1> 11 12 <form action="${pageContext.request.contextPath }/RegistServlet" method="post"> 13 <table > 14 <tr> 15 <td>用戶名</td> 16 <td><input type="text" name="username"/></td> 17 </tr> 18 <tr> 19 <td>密碼</td> 20 <td><input type="password" name="password"/></td> 21 </tr> 22 <tr> 23 <td>昵稱</td> 24 <td><input type="text" name="nickname"/></td> 25 </tr> 26 <tr> 27 <td>郵箱</td> 28 <td><input type="text" name="email"/></td> 29 </tr> 30 <tr> 31 32 <td colspan="2"> 33 <input type="submit" value="注冊"/> 34 <input type="reset" value="重置"/> 35 </td> 36 </tr> 37 38 39 </table> 40 41 </form> 42 43 44 45 </body> 46 </html>
激活界面:msg.jsp代碼
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>激活界面</title> 8 </head> 9 <body> 10 <h1>${ msg }</h1> 11 </body> 12 </html>
后續更新中……
有錯請評論下方,謝謝~