首頁 web前端 js教程 JQuery+Ajax+Struts2+Hibernate框架整合實現完整的登入註冊

JQuery+Ajax+Struts2+Hibernate框架整合實現完整的登入註冊

May 24, 2018 pm 03:35 PM
完整 實現

最近沒有專案做,閒著沒事,看到一個書城的網站很好,於是就是仿了一個,把裡面的ui直接拿過來用,前端後端自己寫的,目前大部分的功能已經實現了。

一、開發環境的部署

程式結構:

BootStrap Ajax Struts2 Hibernate MySql

僅供參考:可實現相關功能即可

作業系統:ubuntu 14.10

#前端框架:BootStrap   注意:此架構只是為了實現使用者介面,與特定功能無關

資料庫:mysql-5.5 資料庫工具:emma

伺服器:tomcat 伺服器工具:Myeclipse 10(已配置好Struts2和Hibernate環境)

注意:

程式偵錯流程可能會產生亂碼,只需保持所有工具編碼方式相同即可。

二、專案檔案設定

1、新Web Project,命名為ROOT

2、設定/WebRoot/ WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 id="WebApp_ID" version="3.0">
 <display-name>ROOT</display-name>
 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
   </filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <error-page>
  <error-code>404</error-code>
  <location>/error.jsp</location>
 </error-page>
 <error-page>
  <error-code>500</error-code>
  <location>/error.jsp</location>
 </error-page>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
</web-app>
登入後複製

3 、 設定/src/struts.xml(struts設定檔),其他的action和interceptor被我刪了,這點夠用了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
 <package name="default" namespace="/" extends="struts-default">
  <!-- 登录 -->
  <action name="login" class="com.action.Login" method="login"></action>
  <!-- 登出 -->
  <action name="logout" class="com.action.Logout" method="logout"></action>
  <!-- 注册 -->
   <action name="register" class="com.action.Register" method="register"></action>
  <!-- 邮件发送 -->
   <action name="sendmail" class="com.action.SendMail" method="sendmail"></action>
 </package>
</struts>
登入後複製

4、設定/src/hibernate.cfg.xml(hibernate資料庫設定檔),注意倒數第4行有個<mapping />是沒有的需要自己創建,將在下一步設定

&lt;?xml version=&#39;1.0&#39; encoding=&#39;UTF-8&#39;?&gt;
&lt;!DOCTYPE hibernate-configuration PUBLIC
   &quot;-//Hibernate/Hibernate Configuration DTD 3.0//EN&quot;
   &quot;http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd&quot;&gt;
&lt;!-- Generated by MyEclipse Hibernate Tools. --&gt;
&lt;hibernate-configuration&gt;
 &lt;session-factory&gt;
  &lt;property name=&quot;myeclipse.connection.profile&quot;&gt;Myeclipse Mysql&lt;/property&gt;
  &lt;!--指明JDBC路径、指明数据库名称--&gt;
  &lt;property name=&quot;connection.url&quot;&gt;jdbc:mysql://localhost:3306/test&lt;/property&gt;
  &lt;!--指明数据库账户和密码--&gt;
  &lt;property name=&quot;connection.username&quot;&gt;root&lt;/property&gt;
  &lt;property name=&quot;connection.password&quot;&gt;root&lt;/property&gt;
  &lt;!--指明JDBC驱动--&gt;
  &lt;property name=&quot;connection.driver_class&quot;&gt;com.mysql.jdbc.Driver&lt;/property&gt;
  &lt;!--指明mysql方言--&gt;
  &lt;property name=&quot;dialect&quot;&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
  &lt;property name=&quot;hibernate.current_session_context_class&quot;&gt;thread&lt;/property&gt;
  &lt;property name=&quot;hibernate.dialect&quot;&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
  &lt;property name=&quot;show_sql&quot;&gt;true&lt;/property&gt;
  &lt;property name=&quot;format_sql&quot;&gt;true&lt;/property&gt;
  &lt;mapping resource=&quot;com/hibernate/bookchat.hbm.xml&quot; /&gt;
 &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;
登入後複製

5、/src下建立com.hibernate包,在該包下建立bookchat.hbm.xml(hibernate物件關係映射檔),並配置

注意<class name=" com.hibernate.User" />中的這個User類別是自訂的資料庫物件類別(pojo),將在下一步設定

&lt;?xml version=&quot;1.0&quot;?&gt; 
&lt;!DOCTYPE hibernate-mapping PUBLIC &quot;-//Hibernate/Hibernate Mapping DTD 3.0//EN&quot; &quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&quot;&gt;
&lt;hibernate-mapping&gt;
 &lt;!--指明Bean类名,指明数据库表名--&gt;
 &lt;class name=&quot;com.hibernate.User&quot; table=&quot;user&quot;&gt;
  &lt;id column=&quot;id&quot; type=&quot;int&quot;&gt;
   &lt;generator class=&quot;native&quot; /&gt;
  &lt;/id&gt;
  &lt;!--指明数据库字段名、字段类型--&gt;
  &lt;property name=&quot;user_id&quot; column=&quot;user_id&quot; type=&quot;int&quot; /&gt;
  &lt;property name=&quot;phone&quot; column=&quot;phone&quot; type=&quot;int&quot; /&gt;
  &lt;property name=&quot;email&quot; column=&quot;email&quot; type=&quot;string&quot; /&gt;
  &lt;property name=&quot;username&quot; column=&quot;username&quot; type=&quot;string&quot; /&gt;
  &lt;property name=&quot;password&quot; column=&quot;password&quot; type=&quot;string&quot; /&gt;
  &lt;property name=&quot;icon&quot; column=&quot;icon&quot; type=&quot;string&quot; /&gt;
  &lt;property name=&quot;description&quot; column=&quot;description&quot; type=&quot;string&quot; /&gt;
  &lt;property name=&quot;followThreadNum&quot; column=&quot;followThreadNum&quot; type=&quot;int&quot; /&gt;
  &lt;property name=&quot;followPeopleNum&quot; column=&quot;followPeopleNum&quot; type=&quot;int&quot; /&gt;
  &lt;property name=&quot;fansNum&quot; column=&quot;fansNum&quot; type=&quot;int&quot; /&gt;
  &lt;property name=&quot;haveMsg&quot; column=&quot;haveMsg&quot; type=&quot;int&quot; /&gt;
 &lt;/class&gt;
&lt;/hibernate-mapping&gt;
登入後複製

6、/src下的com.hibernate套件下建立User類

package com.hibernate;
public class User {
 private int user_id; //对应数据库中user_id
 private int phone; //手机号
 private String email; //邮件
 private String username; //用户名
 private String password; //密码
 private String icon; //用户头像
 private String description;  //自定义描述
 private int followThreadNum; //关注书单数量
 private int followPeopleNum; //关注的人数量
 private int fansNum; //粉丝数量
 private int haveMsg; //当前是否有新消息
 public User() {
  super();
 }
   //这个构造方法在注册时有用
 public User(String email, String username, String password) {
  // 用户内容:username,password,email
  // 系统定义:user_id,icon,followThreadNum,followPeopleNum,fansNum,haveMsg
  // 留空:phone,description,
  this.user_id = 39212;
  // this.phone = phone;
  this.email = email;
  this.username = username;
  this.password = password;
  this.icon = &quot;images/icon.png&quot;;
  // this.description = description;
  this.followThreadNum = 0;
  this.followPeopleNum = 0;
  this.fansNum = 0;
  this.haveMsg = 0;
 }
 public int getUser_id() {
  return user_id;
 }
 public void setUser_id(int user_id) {
  this.user_id = user_id;
 }
 public int getPhone() {
  return phone;
 }
 public void setPhone(int phone) {
  this.phone = phone;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 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 getIcon() {
  return icon;
 }
 public void setIcon(String icon) {
  this.icon = icon;
 }
 public String getDescription() {
  return description;
 }
 public void setDescription(String description) {
  this.description = description;
 }
 public int getFollowThreadNum() {
  return followThreadNum;
 }
 public void setFollowThreadNum(int followThreadNum) {
  this.followThreadNum = followThreadNum;
 }
 public int getFollowPeopleNum() {
  return followPeopleNum;
 }
 public void setFollowPeopleNum(int followPeopleNum) {
  this.followPeopleNum = followPeopleNum;
 }
 public int getFansNum() {
  return fansNum;
 }
 public void setFansNum(int fansNum) {
  this.fansNum = fansNum;
 }
 public int getHaveMsg() {
  return haveMsg;
 }
 public void setHaveMsg(int haveMsg) {
  this.haveMsg = haveMsg;
 }
}
登入後複製

7、/src下的com.db包下建立CreateTable類,之後Run as - Java Application,查看控制台是否輸出了sql語句

package com.db;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class CREATTABLEDONOT {
 public static void main(String[] args) {
  // 默认读取hibernate.cfg.xml文件
  Configuration cfg = new Configuration().configure();
  SchemaExport export = new SchemaExport(cfg);
  export.create(true, true);
 }
}
登入後複製

#三、檢查資料庫

1、開啟資料庫GUI工具,查看test資料庫下方是否有一個user表,若能開啟user表說明之前設定成功。

2、編輯user表:設定欄位預設值,可以向表中新增資料。

 

#四、網頁UI設計

1、我們在struts.xml檔案設定中已經埋下伏筆:

&lt;action name=&quot;login&quot; class=&quot;com.action.Login&quot; method=&quot;login&quot;&gt;&lt;/action&gt;
&lt;action name=&quot;logout&quot; class=&quot;com.action.Logout&quot; method=&quot;logout&quot;&gt;&lt;/action&gt;
&lt;action name=&quot;register&quot; class=&quot;com.action.Register&quot; method=&quot;register&quot;&gt;&lt;/action&gt;
&lt;action name=&quot;sendmail&quot; class=&quot;com.action.SendMail&quot; method=&quot;sendmail&quot;&gt;&lt;/action&gt;
登入後複製

我們可以在網頁中請求/login,/logout,/register來存取這三個Action處理類,當然這三個類具體的內容我們還沒寫,先放。

2、現在開始思考網頁設計需要什麼東西...

<1>首頁提供登陸和註冊連結

 

<2> 登陸彈出框和註冊頁面

#<3> 登陸/註冊成功,登陸和註冊消失,顯示用戶名和退出登陸

 

<4> 我們想達到的效果:登陸/註冊成功後顯示用戶名,登陸失敗後動態提示錯誤詳情!

五、JQuery Ajax設計

#1、主要的JQuery和Ajax程式碼

(function(window, $) {
 var SOKK = {};
 ys.common = SOKK;
 //邮箱验证
 SOKK.sendmail = function(){
  var email = $(&quot;#inputEmail&quot;).val().trim();
  if(!checkEmail(email)){
   return false;
  }
  //发送请求
  $.get(&quot;/sendmail&quot;,&quot;email=&quot;+email,function(data){
   data = JSON.parse(data);
   tip(data.code);
  })
 }
 //注册
 SOKK.signup = function(form){
  var form = $(form);
  //成功方可继续执行
  if(!checkSignUp(form.find(&quot;input&quot;)))
   return false;
  //序列化表单,生成JSON对象
  var JStr =form.serialize();
  // var JStr = JSON.stringify(JForm);
  tip(JStr);
  $.post(&quot;/register&quot;,JStr,function(data){
   data = JSON.parse(data);
   if (data.code == 200) {
    location.reload(); //如何跳转到首页?
   } else {
    tip(data.code);
   }
  })
 };
 // 登录
 SOKK.login = function(form) {
  var form = $(form);
  var input = form.find(&quot;input&quot;);
  var username=$.trim(input[0].value);
  var password=$.trim(input[1].value);
  if(checkLogin(username,password)){
   return false;
  }
  var dataParam = {};
  dataParam.username = username;
  dataParam.password = password;
  // 这里的dataParam是键值对,但服务器获取的时候是?username=xx&amp;password=xx;
  // 如果使用json传输那么就不能用这种方式而必须用$.ajax,而且json在服务器端还要再解析,
  // 所以在发送请求时,不建议使用json。接受数据可以使用json
  $.post(&quot;/login&quot;, dataParam, function(data) {
   // json字符串-&gt;json对象
   data = JSON.parse(data);
   if (data.code == 200) {
    location.reload();
   } else {
    tip(data.code);
   }
  })
 };
 //登出
 SOKK.logout = function(){
  $.get(&quot;/logout&quot;, function (data) {
   //json字符串-&gt;json对象  
   data = JSON.parse(data);
   if (data.code==200){
    location.reload();
   }
  })
 };
})(window, $)
登入後複製

2、自訂工具程式碼

// 自定义提示
function tip(info){
 if(isNaN(info)){
  toastr.info(info);
 }else{
  var msg;
  if(info&lt;300){  
   switch(info){
    case 100: msg=&quot;加入书架成功!&quot;; break;
    case 101: msg=&quot;关注本书成功!&quot;; break;
    case 102: msg=&quot;已移动到【正在看】!&quot;; break;
    case 103: msg=&quot;已移动到【准备看】!&quot;; break;
    case 104: msg=&quot;已移动到【已看完】!&quot;; break;
    case 105: msg=&quot;已移动到【回收站】!&quot;; break;
    case 110: msg=&quot;验证邮件已发送到你的邮箱!&quot;;break;
    case 200: msg=&quot;请求成功!&quot;; break;
    case 202: msg=&quot;请求已接受,但尚未处理。&quot;; break;
    case 204: msg=&quot;请求成功,但无返回内容。&quot;; break;
    default : break;
   }
   toastr.success(msg);
  }else if(info&lt;1000){
   switch(info){
    case 301: msg=&quot;请求网页的位置发生改变!&quot;; break;
    case 400: msg=&quot;错误请求,请输入正确信息!&quot;; break;
    case 401: msg=&quot;非法请求,未授权进入此页面!&quot;; break;
    case 403: msg=&quot;拒绝请求!&quot;; break;
    case 404: msg=&quot;请求页面不存在!&quot;; break;
    case 408: msg=&quot;请求超时!&quot;; break;
    case 500: msg=&quot;服务器出错!&quot;; break;
    case 500: msg=&quot;服务不可用!&quot;; break;
    case 900: msg=&quot;用户名/密码错误,请重新输入&quot;; break;
    case 903: msg=&quot;服务器出错,请重试!&quot;; break;
    case 904: msg=&quot;服务器无返回信息!&quot;; break;
    case 905: msg=&quot;网络出错!&quot;; break;
    case 906: msg=&quot;注册失败,请重试!&quot;;break;
    case 907: msg=&quot;邮箱验证码错误!&quot;;break;
    case 908: msg=&quot;用户名已存在!&quot;;break;
    case 909: msg=&quot;邮箱已被注册!&quot;;break;
    case 910: msg=&quot;验证邮件发送失败!&quot;;break;
    default : break;
   }
   toastr.error(msg);
  }else{
   toastr.info(info);
  }
 }
}
//注册检查
function checkSignUp(input){
 var username = $.trim(input[0].value);
 var password1 = $.trim(input[1].value);
 var password2 = $.trim(input[2].value);
 var email = $.trim(input[3].value);
 var emailcode = $.trim(input[4].value);
 for (var i = 0; i &lt; input.length; i++) {
  if(input[i].value.length&lt;=0){
   tip(&quot;所有内容不得为空!&quot;);
   return false;
  }
 };
 if(username.length&lt;4){
  tip(&quot;用户名不得少于4个字符!&quot;);
  return false;
 }
 if(password1!==password2){
  tip(&quot;两次输入的密码不同!&quot;);
  return false;
 }
 if(password1.length&lt;6){
  tip(&quot;密码不得少于6个字符!&quot;);
  return false;
 }
 return true;
}
function checkLogin(username,password){
 if(!username){
  tip(&quot;请输入用户名!&quot;);
  return false;
 }
 if(!password){
  tip(&quot;请输入密码!&quot;);
  return false;
 }
}
function checkEmail(email){
 var reg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
 if(email){
  if(reg.test(email)){
   return true;
  }else{
   tip(&quot;邮箱地址不符合规范!&quot;);
   return false;
  }
 }else{
  tip(&quot;邮箱地址不得为空!&quot;);
  return false;
 }
}
登入後複製

3、toastr是一個前端非阻塞的提示插件,可以到http://www.bootcdn.cn/toastr.js/ 下載使用

        

#六、Action設計

1、Login.java

package com.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.service.BaseService;
import com.service.BaseServiceImpl;
import com.util.OperateJSON;
public class Login extends ActionSupport {
 private static final long serialVersionUID = 4679952956618457478L;
 private String username;
 private String password;
 public void login() {
  HttpServletRequest request = ServletActionContext.getRequest();
  BaseService hs = new BaseServiceImpl();
  OperateJSON oj = new OperateJSON();
  username = request.getParameter(&quot;username&quot;);
  password = request.getParameter(&quot;password&quot;);
  System.out.println(&quot;用户名:&quot; + username + &quot;--密码:&quot; + password);
  // 登陆返回用户id
  Object obj = hs.login(username, password);
  if (obj != null) {
   System.out.println(&quot;用户名密码正确&quot;);
   request.getSession().setAttribute(&quot;username&quot;, username);
   request.getSession().setAttribute(&quot;userid&quot;, obj);
   System.out.println(&quot;用户名&quot; + username + &quot;的Session设置完毕~&quot;);
   System.out.println(&quot;用户id的Session设置完毕~&quot;);
   oj.putCode(200);
  } else {
   System.out.println(&quot;用户名密码错误&quot;);
   oj.putCode(900);
  }
  oj.send();
 }
}
登入後複製

2、Logout.java

package com.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.util.OperateJSON;
public class Logout extends ActionSupport {
 private static final long serialVersionUID = -6758897982192371466L;
 HttpServletRequest request = ServletActionContext.getRequest();
 HttpServletResponse response = ServletActionContext.getResponse();
 OperateJSON oj = new OperateJSON();
 public void logout() {
  request.getSession().removeAttribute(&quot;username&quot;);
  request.getSession().invalidate();
  if (request.getSession().getAttribute(&quot;username&quot;) == null) {
   oj.putCode(200);
  } else {
   oj.putCode(903);
  }
  oj.send();
 }
}
登入後複製

3、 Register.java

package com.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.hibernate.User;
import com.opensymphony.xwork2.ActionSupport;
import com.service.BaseService;
import com.service.BaseServiceImpl;
import com.util.OperateJSON;
public class Register extends ActionSupport {
 private static final long serialVersionUID = -3356620731966076779L;
 HttpServletRequest request = ServletActionContext.getRequest();
 HttpServletResponse response = ServletActionContext.getResponse();
 BaseService bs = new BaseServiceImpl();
 OperateJSON oj = new OperateJSON();
 SendMail sm = new SendMail();
 public void register() {
  String username = request.getParameter(&quot;username&quot;);
  String password1 = request.getParameter(&quot;password1&quot;);
  String password2 = request.getParameter(&quot;password2&quot;);
  String password = (password1.equals(password2) ? password1 : null);
  String email = request.getParameter(&quot;email&quot;);
  String emailcode = request.getParameter(&quot;emailcode&quot;);
  // 判断用户输入和生成的邮箱验证码是否相同
  if (!(emailcode.equals(sm.getMailCode()))) {
   oj.putCode(907);
   oj.send();
   return;
  }
  // 检测用户名/邮箱是否唯一
  if (!bs.isUnique(&quot;User&quot;, &quot;username&quot;, username)) {
   oj.putCode(908);
   oj.send();
   return;
  }
  if (!bs.isUnique(&quot;User&quot;, &quot;email&quot;, email)) {
   oj.putCode(909);
   oj.send();
   return;
  }
  // 构建User对象
  User user = new User(email, username, password);
  // 建立对象关系映射
  Boolean reged = bs.register(user);
  if (reged) {
   System.out.println(&quot;用户注册成功&quot;);
   request.getSession().setAttribute(&quot;username&quot;, username);
   oj.putCode(200);
  } else {
   System.out.println(&quot;注册失败&quot;);
   oj.putCode(906);
  }
  oj.send();
 }
}
登入後複製

4、 SendMail.java  SMTP協定發送郵件的類,使用前需要導入mail的jar包,同時,還要設定開啟發件人郵箱的smtp服務

package com.action;
import java.util.Date;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.util.OperateJSON;
public class SendMail extends ActionSupport {
  private static final long serialVersionUID = -4724909293302616101L;
  private static String QQ = &quot;392102018&quot;; // qq
  private static String HOST = &quot;qq.com&quot;; // SMTP服务器主机名
  private static String PASS = &quot;xxxxxxxx&quot;; // SMTP服务器密码
  private static String mailCode; // 邮件验证码

  OperateJSON oj = new OperateJSON();
  public void sendmail() {
 HttpServletRequest request = ServletActionContext.getRequest();
 String email = request.getParameter(&quot;email&quot;);
 System.out.println(email);
 String mailCode = SendMail.setMailCode();
 try {
   beginSend(email, mailCode);
   oj.putCode(110);
 } catch (MessagingException e) {
   oj.putCode(910);
 } finally {
   oj.send();
 }
  }
  public static String setMailCode() {
 mailCode = 100000 + (int) (Math.random() * 900000) + &quot;BC&quot;;
 System.out.println(mailCode);
 return mailCode;
  }
  public String getMailCode() {
 return SendMail.mailCode;
  }
  public void beginSend(String email, String mailCode)
   throws MessagingException {
 String mailTo = email; // 收件方mail地址
 String mailTitle = &quot;欢迎您使用书聊网! 立即激活您的账户&quot;;
 String mailContent = &quot;&lt;p&gt;尊敬的用户:&lt;/p&gt;&lt;p&gt;你好!立即激活您的账户,和书聊网会员一起看书交流。要激活您的账户,只需复制下面的验证码到注册页面确认。 &lt;/p&gt;&quot;
  + mailCode + &quot;&lt;p&gt;版权所有© 1999 - 2015 BookChat。保留所有权利。&lt;/p&gt;&quot;;
 // 设置主要信息
 Properties props = new Properties();
 props.put(&quot;mail.smtp.host&quot;, &quot;smtp.&quot; + HOST);
 props.put(&quot;mail.smtp.auth&quot;, &quot;true&quot;);
 Session session = Session.getInstance(props);
 session.setDebug(true);
 // 开启邮件对象
 MimeMessage message = new MimeMessage(session);
 // 设置发件人/收件人/主题/发信时间
 InternetAddress from = new InternetAddress(QQ + &quot;@&quot; + HOST);
 message.setFrom(from);
 InternetAddress to = new InternetAddress(mailTo);
 message.setRecipient(Message.RecipientType.TO, to);
 message.setSubject(mailTitle);
 message.setSentDate(new Date());
 // 设置消息对象内容
 BodyPart mdp = new MimeBodyPart();// 新建一个存放信件内容的BodyPart对象
 mdp.setContent(mailContent, &quot;text/html;charset=utf-8&quot;);// 给BodyPart对象设置内容和格式/编码方式
 Multipart mm = new MimeMultipart();// 新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
 mm.addBodyPart(mdp);// 将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
 message.setContent(mm);// 把mm作为消息对象的内容
 message.saveChanges();
 // 开启传输对象
 Transport transport = session.getTransport(&quot;smtp&quot;);
 transport.connect(&quot;smtp.&quot; + HOST, QQ, PASS); // 这里的115798090也要修改为您的QQ号码
 transport.sendMessage(message, message.getAllRecipients());
 transport.close();
  }
}
登入後複製

5、OpreateJSON

package com.util;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.struts2.ServletActionContext;
import net.sf.json.JSONObject;
public class OperateJSON {
 JSONObject json;
 public OperateJSON() {
  json = new JSONObject();
  json.put(&quot;code&quot;, &quot;&quot;);
  json.put(&quot;msg&quot;, &quot;&quot;);
  json.put(&quot;data&quot;, &quot;&quot;);
 }
 public OperateJSON(String str) {
  json = JSONObject.fromObject(str);
 }
 public void put(String key, Object value) {
  json.remove(key);
  json.put(key, value);
 }
 public void putCode(Object value) {
  json.remove(&quot;code&quot;);
  this.put(&quot;code&quot;, value);
 }
 public void putMsg(Object value) {
  json.remove(&quot;msg&quot;);
  this.put(&quot;msg&quot;, value);
 }
 public void remove(String key) {
  json.remove(key);
 }
 public void send() {
  System.out.println(&quot;----------返回的数据是:&quot; + json);
  try {
   PrintWriter out = ServletActionContext.getResponse().getWriter();
   out.print(json);
   out.flush();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}
登入後複製

七、Hibernate Dao設計

這塊都是一些操作資料庫的內容,大家都有自己的風格,仔細一點寫就好了。代碼太亂,我就不放出來嚇人了-.-! 。

八、總結

開始想展示下結果的還是算了,也就那麼回事。一個小例子,瑕疵難免,還望大神們指正。

寫完了,心情好多了,招募會去看看也好,找不找工作不重要,重要的是我走在正確的路上,只有依靠自己才是強者...

上面是我整理給大家的,希望未來會對大家有幫助。

相關文章:

防止重複發送Ajax請求的解決方案

#Ajax請求過程中下載檔案在FireFox(火狐)瀏覽器下的相容問題

解決ajax回傳驗證的時候總是彈出error錯誤的方法

以上是JQuery+Ajax+Struts2+Hibernate框架整合實現完整的登入註冊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

華為手機如何實現雙微信登入? 華為手機如何實現雙微信登入? Mar 24, 2024 am 11:27 AM

華為手機如何實現雙微信登入?

使用Java編寫程式碼實作愛心動畫 使用Java編寫程式碼實作愛心動畫 Dec 23, 2023 pm 12:09 PM

使用Java編寫程式碼實作愛心動畫

如何在華為手機上實現微信分身功能 如何在華為手機上實現微信分身功能 Mar 24, 2024 pm 06:03 PM

如何在華為手機上實現微信分身功能

PHP程式設計指南:實作斐波那契數列的方法 PHP程式設計指南:實作斐波那契數列的方法 Mar 20, 2024 pm 04:54 PM

PHP程式設計指南:實作斐波那契數列的方法

PHP遊戲需求實作指南 PHP遊戲需求實作指南 Mar 11, 2024 am 08:45 AM

PHP遊戲需求實作指南

開發建議:如何利用ThinkPHP框架實現非同步任務 開發建議:如何利用ThinkPHP框架實現非同步任務 Nov 22, 2023 pm 12:01 PM

開發建議:如何利用ThinkPHP框架實現非同步任務

掌握Golang如何實現遊戲開發的可能性 掌握Golang如何實現遊戲開發的可能性 Mar 16, 2024 pm 12:57 PM

掌握Golang如何實現遊戲開發的可能性

如何在Golang中實現精確除法運算 如何在Golang中實現精確除法運算 Feb 20, 2024 pm 10:51 PM

如何在Golang中實現精確除法運算

See all articles