基於SSH框架的小型論壇項目 javascript
1、項目入門 傳送門css
2、框架整合 傳送門html
3、用戶模塊 傳送門java
4、頁面顯示 傳送門jquery
5、帖子模塊 傳送門web
6、點贊模塊 傳送門spring
7、輔助模塊 傳送門sql
User表數據庫
id:apache
username:登錄帳號
password:登錄密碼
name:用戶名
email:用戶郵箱
telephone:用戶電話
state(1,0):根據郵箱判斷用戶是否激活
code:
image:用戶頭像
level:用戶等級
coin:金幣
(根據用戶表單進行建立User表)
點擊當即註冊
用戶成功->登錄界面
註冊失敗->用戶名存在
將表單數據連接數據庫
<form action="${pageContext.request.contextPath }/UserAction_register }" method="post"> </form>
建立User實體(domain層)
private String id; private String username; private String password; private String name; private String email; private String telephone; private Integer state; private String code; private String image; private Integer level; private Integer coin;
package com.Gary.domain; public class User { private String id; private String username; private String password; private String name; private String email; private String telephone; private Integer state; private String code; private String image; private Integer level; private Integer coin; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } public Integer getLevel() { return level; } public void setLevel(Integer level) { this.level = level; } public Integer getCoin() { return coin; } public void setCoin(Integer coin) { this.coin = coin; } }
用戶註冊流程
一開始用戶先來到UserAction.java中register()方法
public String register() throws Exception { // TODO Auto-generated method stub userService.addUser(user); return "toLogin"; }
經過regiser()方法來到UserService.java
public class UserService { private UserDao userDao; public void addUser(User user) { userDao.addUser(user); } }
經過addUser()來到Dao層save(user)
public class UserDao extends HibernateDaoSupport{ public void addUser(User user) { // TODO Auto-generated method stub //拿到與當前線程綁定的session Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); session.save(user); } }
register.jsp自動封裝表單字段
<form action="${pageContext.request.contextPath }/UserAction_register }" method="post"> <div class="register-box"> <label for="username" class="username_label"> 用 戶 名 <input maxlength="20" name="username" type="text" placeholder="您的用戶名和登陸名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 設 置 密 碼 <input maxlength="20" type="password" name="password" placeholder="建議至少使用兩種字符組合" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 確 認 密 碼 <input maxlength="20" type="password" placeholder="請再次輸入密碼" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 真實姓名 <input maxlength="20" name="name" type="text" placeholder="您的真實姓名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 手機號 <input maxlength="20" name="telephone" type="text" placeholder="您的手機號" /> </label> <div class="tips"></div> </div> <div class="arguement"> <input type="checkbox" id="xieyi" /> 閱讀並贊成 <a href="javascript:void(0)">《錯題用戶註冊協議》</a> <a href="login.html">已有帳號,當即登陸</a> <div class="tips"></div> </div> <div class="submit_btn"> <button type="submit" id="submit_btn">立 即 注 冊</button> </div> </form>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/login.css" /> <link rel="stylesheet" href="css/head.css" /> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <section class="sec"> <form action="${pageContext.request.contextPath }/UserAction_register }" method="post"> <div class="register-box"> <label for="username" class="username_label"> 用 戶 名 <input maxlength="20" name="username" type="text" placeholder="您的用戶名和登陸名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 設 置 密 碼 <input maxlength="20" type="password" name="password" placeholder="建議至少使用兩種字符組合" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 確 認 密 碼 <input maxlength="20" type="password" placeholder="請再次輸入密碼" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 真實姓名 <input maxlength="20" name="name" type="text" placeholder="您的真實姓名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 手機號 <input maxlength="20" name="telephone" type="text" placeholder="您的手機號" /> </label> <div class="tips"></div> </div> <div class="arguement"> <input type="checkbox" id="xieyi" /> 閱讀並贊成 <a href="javascript:void(0)">《錯題用戶註冊協議》</a> <a href="login.html">已有帳號,當即登陸</a> <div class="tips"></div> </div> <div class="submit_btn"> <button type="submit" id="submit_btn">立 即 注 冊</button> </div> </form> </section> <script src="js/index.js" type="text/javascript" charset="utf-8"></script> </body> </html>
register()中手動封裝表單未添加數據
public String register() throws Exception { // TODO Auto-generated method stub /* 自動封裝的打1 private String id; private String username; 1 private String password; 1 private String name; 1 private String email; 1 private String telephone; 1 private Integer state; private String code; private String image; private Integer level; private Integer coin; */ //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); return "toLogin"; }
配置hibernate
applicationContext.xml中有一句
<property name="mappingDirectoryLocations" value="classpath:com/Gary/domain"></property>
<!-- 配置sessionFactory --> <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sqp">true</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> <property name="mappingDirectoryLocations" value="classpath:com/Gary/domain"></property> </bean>
數據源字段再User,hbm中配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.Gary.domain"> <class name="User" table="user"> <id name="id"> <generator class="uuid"></generator> </id> <!-- private String username; private String password; private String name; private String email; private String telephone; private Integer state; private String code; private String image; private Integer level; private Integer coin; --> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="name" column="name"></property> <property name="email" column="email"></property> <property name="telephone" column="telephone"></property> <property name="state" column="state"></property> <property name="code" column="code"></property> <property name="image" column="image"></property> <property name="level" column="level"></property> <property name="coin" column="coin"></property> </class> </hibernate-mapping>
配置Struts
在UserAction對Struts進行配置
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="css/head.css" /> <link rel="stylesheet" type="text/css" href="css/login.css" /> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <section class="sec"> <form action="UserLoginServlet" method="post"> <div class="register-box"> <label for="username" class="username_label"> 用 戶 名 <input maxlength="20" name="userName" type="text" placeholder="您的用戶名和登陸名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 密 碼 <input maxlength="20" type="password" name="pwd" placeholder="建議至少使用兩種字符組合" /> </label> <div class="tips"></div> </div> <div class="arguement"> <input type="checkbox" id="xieyi" /> 閱讀並贊成 <a href="javascript:void(0)">《你問我答用戶註冊協議》</a> <a href="register.html">沒有帳號,當即註冊</a> <div class="tips"></div> </div> <div class="submit_btn"> <button type="submit" id="submit_btn">立 即 登陸</button> </div> </form> </section> <script src="js/index.js" type="text/javascript" charset="utf-8"></script> </body>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 開啓動態方法調用 --> <constant name="struts.devMode" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <package name="Gary_SSHForum" namespace="/" extends="struts-default"> <!-- 容許所有方法 --> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="UserAction_*" class="com.Gary.web.UserAction"> <result name="toLogin" type="redirect">/login.jsp</result> </action> </package> </struts>
配置spring
<struts> <!--開啓動態方法調用 --> <constant name="struts.devMode" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- 告訴struts不用本身建立Action,Spring來幫你建立 --> <constant name="struts.objectFactory" value="spring"></constant> <package name="Gary_SSHForum" namespace="/" extends="struts-default"> <!-- 容許所有方法 --> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="UserAction_*" class="com.Gary.web.UserAction" method="{1}"> <result name="toLogin" type="redirect">/login.jsp</result> </action> </package> </struts>
applicationContext.xml中進行整合
<!-- 配置Action --> <bean name="userAction" class="com.Gary.web.UserAction" scope="prototype"> <property name="userService" ref="userService"> </property> </bean> <!-- 配置Service --> <bean name="userService" class="com.Gary.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <!-- 配置Dao --> <bean name="userDao" class="com.Gary.dao.UserDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
測試
在項目中進行表單註冊
表單校驗
頁面自帶表單校驗
經過引入jquery.validate.min.js就能夠實現
//input各類判斷 //用戶名: $('input').eq(0).blur(function(){ if($(this).val().length==0){ $(this).parent().next("div").text(""); $(this).parent().next("div").css("color",'#ccc'); }else if($(this).val().length>0 && $(this).val().length<4){ $(this).parent().next("div").text("長度只能在4-20個字符之間"); $(this).parent().next("div").css("color",'red'); }else if($(this).val().length>=4&& !isNaN($(this).val())){ $(this).parent().next("div").text("用戶名不能爲純數字"); $(this).parent().next("div").css("color",'red'); } }) //密碼 $('input').eq(1).blur(function(){ if($(this).val().length==0){ $(this).parent().next("div").text(""); $(this).parent().next("div").css("color",'#ccc'); }else if($(this).val().length>0 && $(this).val().length<3){ $(this).parent().next("div").text("長度只能在3-20個字符之間"); $(this).parent().next("div").css("color",'red'); }else{ $(this).parent().next("div").text(""); } }) // 確認密碼 $('input').eq(2).blur(function(){ if($(this).val().length==0){ $(this).parent().next("div").text(""); $(this).parent().next("div").css("color",'#ccc'); }else if($(this).val()!=$('input').eq(1).val()){ $(this).parent().next("div").text("兩次密碼不匹配"); $(this).parent().next("div").css("color",'red'); }else{ $(this).parent().next("div").text(""); } })
實現From表單中郵箱校驗
郵箱name="email"
<div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"></div> </div>
<script type="text/javascript"> $(function(){ $("#myform").validate({ //json格式規則 rules:{ "email":{ //是否未必填字段 "required":true, "email":true } }, //若是違反了規則應該怎麼辦 messages:{ "email":{ "required":"郵箱不能爲空", "email":"請輸入正確的郵箱" } } }) }) </script>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/login.css" /> <link rel="stylesheet" href="css/head.css" /> <script src="js/jquery-1.7.2.min.js"></script> <script src="js/jquery.validate.min.js"></script> <script src="js/index.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $(function(){ $("#myform").validate({ //json格式規則 rules:{ "email":{ //是否未必填字段 "required":true, "email":true } }, //若是違反了規則應該怎麼辦 messages:{ "email":{ "required":"郵箱不能爲空", "email":"請輸入正確的郵箱" } } }) }) </script> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <section class="sec"> <form id="myform" action="${pageContext.request.contextPath }/UserAction_register" method="post"> <div class="register-box"> <label for="username" class="username_label"> 用 戶 名 <input maxlength="20" name="username" type="text" placeholder="您的用戶名和登陸名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 設 置 密 碼 <input maxlength="20" type="password" name="password" placeholder="建議至少使用兩種字符組合" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 確 認 密 碼 <input maxlength="20" type="password" placeholder="請再次輸入密碼" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 真實姓名 <input maxlength="20" name="name" type="text" placeholder="您的真實姓名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 手機號 <input maxlength="20" name="telephone" type="text" placeholder="您的手機號" /> </label> <div class="tips"></div> </div> <div class="arguement"> <input type="checkbox" id="xieyi" /> 閱讀並贊成 <a href="javascript:void(0)">《錯題用戶註冊協議》</a> <a href="login.html">已有帳號,當即登陸</a> <div class="tips"></div> </div> <div class="submit_btn"> <button type="submit" id="submit_btn">立 即 注 冊</button> </div> </form> </section> </body> </html> register.jsp
書寫表單校驗提示信息
<div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"><label class="error" for="email" style="display:none">請輸入正確的郵箱</label></div> </div>
讓提示信息變得好看
錯誤信息顏色變紅
<style> .error{ color:red; } </style>
<div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"><label class="error" for="email" style="display:none; padding-left:0px ; line-height: 25px;color:red">請輸入正確的郵箱</label></div> </div>
Ajax實現用戶名異步校驗
異步校驗:當用戶註冊帳號一離焦,立馬將數據與數據庫中的數據進行校驗
給用戶名錶單添加Ajax校驗
<label for="username" class="username_label"> 用 戶 名 <input id="username" maxlength="20" name="username" type="text" placeholder="您的用戶名和登陸名" /> </label>
$(function() { $("#username").blur(function(){ $.post( //action地址 //提交的數據 {}, //回調函數 function(data) { } //數據的格式 "json" ) }) })
基於Ajax異步校驗檢測,Web層,Service層,Dao層
Web層校驗用戶名是否存在
public String checkUsername() throws Exception { //得到用戶username boolean success = userService.findUserByUsername(user.getUsername()); //得到原生Servlet對象 ServletActionContext.getResponse().getWriter().write("{\"success\":"+success+"}"); return null; }
Service層去查找有沒有username
public boolean findUserByUsername(String username) { // TODO Auto-generated method stub Long count = userDao.findUserByUsername(username); if(count==0) return true; else return false; }
Dao層對數據庫進程數據查詢
public Long findUserByUsername(String username){ // TODO Auto-generated method stub Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select count(*) from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); //1號位置設置爲username query.setParameter(1,username); BigInteger result = (BigInteger)query.uniqueResult(); return result.longValue(); }
register.jsp返回要查詢的值
$(function() { $("#username").blur(function(){ var usernameInput = $(this).val(); //alert(usernameInput); $.post( //action地址checkUsername() "${pageContext.request.contextPath}/UserAction_checkUsername", //提交的數據 {"username":usernameInput}, //回調函數 function(data) { var success = data.success; //能夠添加 if(success) { $("#usernameInfo").css("color","green"); $("#usernameInfo").html("用戶名可使用!"); } //不可添加 else { $("#usernameInfo").css("color","red"); $("#usernameInfo").html("用戶名已經被註冊!"); } }, //數據的格式 "json" ) }) })
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/login.css" /> <link rel="stylesheet" href="css/head.css" /> <style> .error{ color:red; } </style> <script src="js/jquery-1.7.2.min.js"></script> <script src="js/jquery.validate.min.js"></script> <script src="js/index.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $(function(){ $("#myform").validate({ //json格式規則 rules:{ "email":{ //是否未必填字段 "required":true, "email":true } }, //若是違反了規則應該怎麼辦 messages:{ "email":{ "required":"郵箱不能爲空", "email":"請輸入正確的郵箱" } } }) }) $(function() { $("#username").blur(function(){ var usernameInput = $(this).val(); //alert(usernameInput); $.post( //action地址checkUsername() "${pageContext.request.contextPath}/UserAction_checkUsername", //提交的數據 {"username":usernameInput}, //回調函數 function(data) { var success = data.success; //能夠添加 if(success) { $("#usernameInfo").css("color","green"); $("#usernameInfo").html("用戶名可使用!"); } //不可添加 else { $("#usernameInfo").css("color","red"); $("#usernameInfo").html("用戶名已經被註冊!"); } }, //數據的格式 "json" ) }) }) </script> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <section class="sec"> <form id="myform" action="${pageContext.request.contextPath }/UserAction_register" method="post"> <div class="register-box"> <label for="username" class="username_label"> 用 戶 名 <input id="username" maxlength="20" name="username" type="text" placeholder="您的用戶名和登陸名" /> </label> <div id="usernameInfo" class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 設 置 密 碼 <input maxlength="20" type="password" name="password" placeholder="建議至少使用兩種字符組合" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 確 認 密 碼 <input maxlength="20" type="password" placeholder="請再次輸入密碼" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 真實姓名 <input maxlength="20" name="name" type="text" placeholder="您的真實姓名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="username_label"> 郵箱 <input maxlength="20" name="email" type="text" placeholder="您的郵箱" /> </label> <div class="tips"><label class="error" for="email" style="display:none; padding-left:0px ; line-height: 25px;color:red">請輸入正確的郵箱</label></div> </div> <div class="register-box"> <label for="username" class="username_label"> 手機號 <input maxlength="20" name="telephone" type="text" placeholder="您的手機號" /> </label> <div class="tips"></div> </div> <div class="arguement"> <input type="checkbox" id="xieyi" /> 閱讀並贊成 <a href="javascript:void(0)">《錯題用戶註冊協議》</a> <a href="login.html">已有帳號,當即登陸</a> <div class="tips"></div> </div> <div class="submit_btn"> <button type="submit" id="submit_btn">立 即 注 冊</button> </div> </form> </section> </body> </html>
package com.Gary.web; import java.util.UUID; import org.apache.struts2.ServletActionContext; import com.Gary.domain.User; import com.Gary.service.UserService; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //採用模型驅動 泛型User public class UserAction extends ActionSupport implements ModelDriven<User>{ public User user = new User(); private UserService userService; //校驗用戶名是否存在 public String checkUsername() throws Exception { //得到用戶username boolean success = userService.findUserByUsername(user.getUsername()); //得到原生Servlet對象 ServletActionContext.getResponse().getWriter().write("{\"success\":"+success+"}"); return null; } public String register() throws Exception { // TODO Auto-generated method stub /* 自動封裝的打1 private String id; private String username; 1 private String password; 1 private String name; 1 private String email; 1 private String telephone; 1 private Integer state; private String code; private String image; private Integer level; private Integer coin; */ //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); return "toLogin"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public User getModel() { return user; } }
package com.Gary.service; import java.math.BigInteger; import com.Gary.dao.UserDao; import com.Gary.domain.User; public class UserService { private UserDao userDao; public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void addUser(User user) { // TODO Auto-generated method stub userDao.addUser(user); } public boolean findUserByUsername(String username) { // TODO Auto-generated method stub Long count = userDao.findUserByUsername(username); if(count==0) return true; else return false; } }
package com.Gary.dao; import java.math.BigInteger; import org.hibernate.Session; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.User; public class UserDao extends HibernateDaoSupport{ public void addUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); session.save(user); } public Long findUserByUsername(String username){ // TODO Auto-generated method stub Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select count(*) from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); //1號位置設置爲username query.setParameter(1,username); BigInteger result = (BigInteger)query.uniqueResult(); return result.longValue(); } }
郵箱註冊
郵箱類
// 1.建立一個程序與郵件服務器會話對象 Session Properties props = new Properties(); props.setProperty("mail.transport.protocol", "SMTP"); props.setProperty("mail.host", "smtp.163.com"); props.setProperty("mail.smtp.auth", "true");// 指定驗證爲true // 建立驗證器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("m17689470428", "tt199706282818"); } }; Session session = Session.getInstance(props, auth); // 2.建立一個Message,它至關因而郵件內容 Message message = new MimeMessage(session); message.setFrom(new InternetAddress("m17689470428@163.com")); // 設置發送者 message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 設置發送方式與接收者 //設置標題 message.setSubject(title); // message.setText("這是一封激活郵件,請<a href='#'>點擊</a>"); message.setContent(emailMsg, "text/html;charset=utf-8"); // 3.建立 Transport用於將郵件發送 Transport.send(message);
UserAction.java中添加郵箱激活內容,編寫用戶激活函數
public String register() throws Exception { // TODO Auto-generated method stub //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); MailUtils.sendMail(user.getEmail(), "請激活", "恭喜您註冊成功,請點擊下面的連接激活!! <a href='http://localhost:8080/Gary_SSHForum/UserAction_active'>點擊這裏</a>"); return "toLogin"; }
用戶激活函數
public String active() throws Exception { System.out.println("active"); return null; }
package com.Gary.utils; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage.RecipientType; public class MailUtils { //發郵箱,給誰發Email,以及Email內容 public static void sendMail(String email, String title,String emailMsg) throws AddressException, MessagingException { // 1.建立一個程序與郵件服務器會話對象 Session Properties props = new Properties(); props.setProperty("mail.transport.protocol", "SMTP"); props.setProperty("mail.host", "smtp.163.com"); props.setProperty("mail.smtp.auth", "true");// 指定驗證爲true // 建立驗證器 Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("m17689470428", "tt199706282818"); } }; Session session = Session.getInstance(props, auth); // 2.建立一個Message,它至關因而郵件內容 Message message = new MimeMessage(session); message.setFrom(new InternetAddress("m17689470428@163.com")); // 設置發送者 message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 設置發送方式與接收者 //設置標題 message.setSubject(title); // message.setText("這是一封激活郵件,請<a href='#'>點擊</a>"); message.setContent(emailMsg, "text/html;charset=utf-8"); // 3.建立 Transport用於將郵件發送 Transport.send(message); } }
package com.Gary.web; import java.util.UUID; import org.apache.struts2.ServletActionContext; import com.Gary.domain.User; import com.Gary.service.UserService; import com.Gary.utils.MailUtils; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //採用模型驅動 泛型User public class UserAction extends ActionSupport implements ModelDriven<User>{ public User user = new User(); private UserService userService; //用戶激活 public String active() throws Exception { System.out.println("active"); return null; } //校驗用戶名是否存在 public String checkUsername() throws Exception { //得到用戶username boolean success = userService.findUserByUsername(user.getUsername()); //得到原生Servlet對象 ServletActionContext.getResponse().getWriter().write("{\"success\":"+success+"}"); return null; } public String register() throws Exception { // TODO Auto-generated method stub //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); MailUtils.sendMail(user.getEmail(), "請激活", "恭喜您註冊成功,請點擊下面的連接激活!! <a href='http://localhost:8080/Gary_SSHForum/UserAction_active'>點擊這裏</a>"); return "toLogin"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public User getModel() { return user; } }
編寫用戶激活邏輯,設置用戶state屬性從0變1
MailUtils.sendMail(user.getEmail(), "請激活", "恭喜您註冊成功,請點擊下面的連接激活!! <a href='http://localhost:8080/Gary_SSHForum/UserAction_active?userCode="+user.getCode()+"'>點擊這裏</a>");
Web層用戶激活
public String active() throws Exception { userService.activeUser(userCode); return "toLogin"; }
Service層傳遞數據給Dao層
public void activeUser(String userCode) { // TODO Auto-generated method stub userDao.activeUser(userCode); }
Dao層修改數據庫中State爲1
public void activeUser(String userCode) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "update user set state = 1 where code = ?"; NativeQuery query = session.createSQLQuery(sql); query.setParameter(1,userCode); query.executeUpdate(); }
用戶註冊
查看SQL數據庫中用戶信息
阿里雲郵箱中激活用戶信息
點擊激活後,修改用戶我的state值
package com.Gary.web; import java.util.UUID; import org.apache.struts2.ServletActionContext; import com.Gary.domain.User; import com.Gary.service.UserService; import com.Gary.utils.MailUtils; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //採用模型驅動 泛型User public class UserAction extends ActionSupport implements ModelDriven<User>{ public User user = new User(); private String userCode; private UserService userService; //用戶激活 public String active() throws Exception { userService.activeUser(userCode); return "toLogin"; } public String getUserCode() { return userCode; } public void setUserCode(String userCode) { this.userCode = userCode; } //校驗用戶名是否存在 public String checkUsername() throws Exception { //得到用戶username boolean success = userService.findUserByUsername(user.getUsername()); //得到原生Servlet對象 ServletActionContext.getResponse().getWriter().write("{\"success\":"+success+"}"); return null; } public String register() throws Exception { // TODO Auto-generated method stub //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); MailUtils.sendMail(user.getEmail(), "請激活", "恭喜您註冊成功,請點擊下面的連接激活!! <a href='http://localhost:8080/Gary_SSHForum/UserAction_active?userCode="+user.getCode()+"'>點擊這裏</a>"); return "toLogin"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public User getModel() { return user; } }
package com.Gary.service; import java.math.BigInteger; import com.Gary.dao.UserDao; import com.Gary.domain.User; public class UserService { private UserDao userDao; public UserDao getUserDao() { return userDao; } public void activeUser(String userCode) { // TODO Auto-generated method stub userDao.activeUser(userCode); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void addUser(User user) { // TODO Auto-generated method stub userDao.addUser(user); } public boolean findUserByUsername(String username) { // TODO Auto-generated method stub Long count = userDao.findUserByUsername(username); if(count==0) return true; else return false; } }
package com.Gary.dao; import java.math.BigInteger; import org.hibernate.Session; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.User; public class UserDao extends HibernateDaoSupport{ public void addUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); session.save(user); } public Long findUserByUsername(String username){ // TODO Auto-generated method stub Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select count(*) from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); //1號位置設置爲username query.setParameter(1,username); BigInteger result = (BigInteger)query.uniqueResult(); return result.longValue(); } public void activeUser(String userCode) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "update user set state = 1 where code = ?"; NativeQuery query = session.createSQLQuery(sql); query.setParameter(1,userCode); query.executeUpdate(); } }
用戶登錄
用戶登陸
用戶登陸流程圖
Service層連接出具庫,在數據庫中查詢數據
public int checkUser(User user) { User temp = userDao.findUserByUsernameReturnUser(user); //用戶名不存在 if(temp==null) { return 1; } //判斷密碼是否相同 if(temp.getPassword().equals(user.getPassword())) { if(temp.getState()==1) { //登錄成功 return 0; }else { //沒有激活 return 3; } }else { //密碼錯誤 return 2; } }
Web層傳遞數據給Service層
public String Login() throws Exception { int success = userService.checkUser(user); if(success == 0) { return "toIndex"; } else if(success ==1) { //用戶名不存在 ActionContext.getContext().put("error","用戶名不存在!!"); return "login"; } else if(success ==2) { //密碼錯誤 ActionContext.getContext().put("error", "密碼錯誤"); return "login"; } else if(success ==3) { //用戶未激活 ActionContext.getContext().put("error","用戶未激活!!"); return "login"; }else { return "error"; } }
package com.Gary.web; import java.util.UUID; import org.apache.struts2.ServletActionContext; import com.Gary.domain.User; import com.Gary.service.UserService; import com.Gary.utils.MailUtils; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //採用模型驅動 泛型User public class UserAction extends ActionSupport implements ModelDriven<User>{ public User user = new User(); private String userCode; private UserService userService; //用戶登錄 public String Login() throws Exception { int success = userService.checkUser(user); if(success == 0) { return "toIndex"; } else if(success ==1) { //用戶名不存在 ActionContext.getContext().put("error","用戶名不存在!!"); return "login"; } else if(success ==2) { //密碼錯誤 ActionContext.getContext().put("error", "密碼錯誤"); return "login"; } else if(success ==3) { //用戶未激活 ActionContext.getContext().put("error","用戶未激活!!"); return "login"; }else { return "error"; } } //用戶激活 public String active() throws Exception { userService.activeUser(userCode); return "toLogin"; } public String getUserCode() { return userCode; } public void setUserCode(String userCode) { this.userCode = userCode; } //校驗用戶名是否存在 public String checkUsername() throws Exception { //得到用戶username boolean success = userService.findUserByUsername(user.getUsername()); //得到原生Servlet對象 ServletActionContext.getResponse().getWriter().write("{\"success\":"+success+"}"); return null; } public String register() throws Exception { // TODO Auto-generated method stub //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); MailUtils.sendMail(user.getEmail(), "請激活", "恭喜您註冊成功,請點擊下面的連接激活!! <a href='http://localhost:8080/Gary_SSHForum/UserAction_active?userCode="+user.getCode()+"'>點擊這裏</a>"); return "toLogin"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public User getModel() { return user; } }
package com.Gary.service; import java.math.BigInteger; import com.Gary.dao.UserDao; import com.Gary.domain.User; public class UserService { private UserDao userDao; public int checkUser(User user) { User temp = userDao.findUserByUsernameReturnUser(user); //用戶名不存在 if(temp==null) { return 1; } //判斷密碼是否相同 if(temp.getPassword().equals(user.getPassword())) { if(temp.getState()==1) { //登錄成功 return 0; }else { //沒有激活 return 3; } }else { //密碼錯誤 return 2; } } public UserDao getUserDao() { return userDao; } public void activeUser(String userCode) { // TODO Auto-generated method stub userDao.activeUser(userCode); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void addUser(User user) { // TODO Auto-generated method stub userDao.addUser(user); } public boolean findUserByUsername(String username) { // TODO Auto-generated method stub Long count = userDao.findUserByUsernameReturnNum(username); if(count==0) return true; else return false; } }
package com.Gary.dao; import java.math.BigInteger; import org.hibernate.Session; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.User; public class UserDao extends HibernateDaoSupport{ public void addUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); session.save(user); } public Long findUserByUsernameReturnNum(String username){ // TODO Auto-generated method stub Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select count(*) from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); //1號位置設置爲username query.setParameter(1,username); BigInteger result = (BigInteger)query.uniqueResult(); return result.longValue(); } public void activeUser(String userCode) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "update user set state = 1 where code = ?"; NativeQuery query = session.createSQLQuery(sql); query.setParameter(1,userCode); query.executeUpdate(); } public User findUserByUsernameReturnUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select * from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); query.addEntity(User.class); query.setParameter(1, user.getUsername()); User temp =(User) query.uniqueResult(); return temp; } }
對用戶登錄進行測試
此時數據庫中純在兩條數據
測試失敗:用戶名不存在,用戶密碼登錄錯誤,用戶未激活
測試成功:跳轉index頁面
添加一個提示用戶去激活郵箱的界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="css/head.css" /> <link rel="stylesheet" type="text/css" href="css/login.css" /> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <div class="dvlogo" style="color:black;margin-top:200px;margin-left:300px"> 恭喜你註冊成功,請到您剛填寫的郵箱去激活用戶!!謝謝 </div> </body>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--開啓動態方法調用 --> <constant name="struts.devMode" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- 告訴struts不用本身建立Action,Spring來幫你建立 --> <constant name="struts.objectFactory" value="spring"></constant> <package name="Gary_SSHForum" namespace="/" extends="struts-default"> <!-- 容許所有方法 --> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="UserAction_*" class="com.Gary.web.UserAction" method="{1}"> <result name="toLogin" type="redirect">/login.jsp</result> <result name="login">/login.jsp</result> <result name="toIndex" type="redirect">/index.jsp</result> <result name="error">/login.jsp</result> <result name="toRegisterSuccess" type="redirect">/registerSuccess.jsp</result> </action> </package> </struts>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="res/layui/css/layui.css"> <link rel="stylesheet" href="res/css/global.css"> <link rel="stylesheet" type="text/css" href="css/index.css"> <script src="res/layui/layui.js"></script> <style> </style> </head> <body> <div class="dvhead"> <div class="dvlogo"> <a href="index.jsp" target="_parent" fount-size="34px">論壇</a> </div> <div class="dvsearch">Cynical丶Gary</div> <div class="nav-user" style="top: 0px; right: 100px;"> <!--描述:未登陸的樣子 <a class="avatar" href=""> <img src="res/images/avatar/11.jpg"> <cite>Gary</cite> </a> <div class="nav"> <a href=""> <i class="iconfont icon-tuichu" style="top: 0; font-size: 22px;"></i> 退出 </a> </div> --> <!--描述:未登陸的樣子--> <a class="iconfont icon-touxiang layui-hide-xs" style="margin-top: 4px; display: inline-block;"> </a> <div class="nav" style="font-size: 14px; color: white; margin-top: -5px; margin-left: 1px;" /> <a href="login.jsp" target="_parent">登陸</a> <a href="register.jsp" target="_parent">註冊</a> </div> </div> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="css/head.css" /> <link rel="stylesheet" type="text/css" href="css/login.css" /> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <section class="sec"> <form action="${pageContext.request.contextPath }/UserAction_Login" method="post"> <div class="register-box"> <label for="username" class="username_label"> 用 戶 名 <input maxlength="20" name="username" type="text" placeholder="您的用戶名和登陸名" /> </label> <div class="tips"></div> </div> <div class="register-box"> <label for="username" class="other_label"> 密 碼 <input maxlength="20" type="password" name="password" placeholder="建議至少使用兩種字符組合" /> </label> <div class="tips"></div> </div> <div class="arguement"> <input type="checkbox" id="xieyi" /> 閱讀並贊成 <a href="javascript:void(0)">《你問我答用戶註冊協議》</a> <a href="register.html">沒有帳號,當即註冊</a> <div class="tips"> <font color="red"> <s:property value="error"/> </font> </div> </div> <div class="submit_btn"> <button type="submit" id="submit_btn">立 即 登陸</button> </div> </form> </section> <script src="js/index.js" type="text/javascript" charset="utf-8"></script> </body>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="css/head.css" /> <link rel="stylesheet" type="text/css" href="css/login.css" /> </head> <body style="margin: -2px"> <iframe src="head.html" scrolling="no" width="100%" height="110px"></iframe> <div class="dvlogo" style="color:black;margin-top:200px;margin-left:300px"> 恭喜你註冊成功,請到您剛填寫的郵箱去激活用戶!!謝謝 </div> </body>
package com.Gary.web; import java.util.UUID; import org.apache.struts2.ServletActionContext; import com.Gary.domain.User; import com.Gary.service.UserService; import com.Gary.utils.MailUtils; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; //採用模型驅動 泛型User public class UserAction extends ActionSupport implements ModelDriven<User>{ public User user = new User(); private String userCode; private UserService userService; //用戶登錄 public String Login() throws Exception { int success = userService.checkUser(user); if(success == 0) { return "toIndex"; } else if(success ==1) { //用戶名不存在 ActionContext.getContext().put("error","用戶名不存在!!"); return "login"; } else if(success ==2) { //密碼錯誤 ActionContext.getContext().put("error", "密碼錯誤"); return "login"; } else if(success ==3) { //用戶未激活 ActionContext.getContext().put("error","用戶未激活!!"); return "login"; }else { return "error"; } } //用戶激活 public String active() throws Exception { userService.activeUser(userCode); return "toLogin"; } public String getUserCode() { return userCode; } public void setUserCode(String userCode) { this.userCode = userCode; } //校驗用戶名是否存在 public String checkUsername() throws Exception { //得到用戶username boolean success = userService.findUserByUsername(user.getUsername()); //得到原生Servlet對象 ServletActionContext.getResponse().getWriter().write("{\"success\":"+success+"}"); return null; } public String register() throws Exception { // TODO Auto-generated method stub //沒有的數據手動封裝 user.setState(0); user.setCode(UUID.randomUUID().toString()); user.setImage("0"); user.setLevel(1); user.setCoin(1000); //是否添加成功 userService.addUser(user); MailUtils.sendMail(user.getEmail(), "請激活", "恭喜您註冊成功,請點擊下面的連接激活!! <a href='http://localhost:8080/Gary_SSHForum/UserAction_active?userCode="+user.getCode()+"'>點擊這裏</a>"); return "toRegisterSuccess"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public User getModel() { return user; } }
package com.Gary.service; import java.math.BigInteger; import com.Gary.dao.UserDao; import com.Gary.domain.User; public class UserService { private UserDao userDao; public int checkUser(User user) { User temp = userDao.findUserByUsernameReturnUser(user); //用戶名不存在 if(temp==null) { return 1; } //判斷密碼是否相同 if(temp.getPassword().equals(user.getPassword())) { if(temp.getState()==1) { //登錄成功 return 0; }else { //沒有激活 return 3; } }else { //密碼錯誤 return 2; } } public UserDao getUserDao() { return userDao; } public void activeUser(String userCode) { // TODO Auto-generated method stub userDao.activeUser(userCode); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void addUser(User user) { // TODO Auto-generated method stub userDao.addUser(user); } public boolean findUserByUsername(String username) { // TODO Auto-generated method stub Long count = userDao.findUserByUsernameReturnNum(username); if(count==0) return true; else return false; } }
package com.Gary.dao; import java.math.BigInteger; import org.hibernate.Session; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.User; public class UserDao extends HibernateDaoSupport{ public void addUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); session.save(user); } public Long findUserByUsernameReturnNum(String username){ // TODO Auto-generated method stub Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select count(*) from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); //1號位置設置爲username query.setParameter(1,username); BigInteger result = (BigInteger)query.uniqueResult(); return result.longValue(); } public void activeUser(String userCode) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "update user set state = 1 where code = ?"; NativeQuery query = session.createSQLQuery(sql); query.setParameter(1,userCode); query.executeUpdate(); } public User findUserByUsernameReturnUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); String sql = "select * from user where username = ?"; NativeQuery query = session.createSQLQuery(sql); query.addEntity(User.class); query.setParameter(1, user.getUsername()); User temp =(User) query.uniqueResult(); return temp; } }
項目過程當中的問題
1、Struts has detected an unhandled exception:
Messages: |
|
註冊信息重名,不能添加劇復的username