JavaWeb网上图书商城完整项目--day02-12.激活功能各层实现

1、我们来看程序的代码

数据库层:

1、通过激活码查找到对应的用户

2、设置用户的激活状态

2、业务层

1、通过数据库接口通过验证码得到对应的用户

2、判断当用户是否为空,如果没有通过激活码查找到对应的用户,说明用户点击邮箱上传的激活码是无效的,这个时候说明激活失败,抛出一个业务失败异常,说明激活码无效

3、如果用户不为空,并且用户的激活状态是没有激活的,将用户的激活状态设置成true

4、如果用户不为空,但是用户的激活状态是已经激活的,抛出一个业务失败异常,提示用户无需重复激活

3、servlet就是调用业务层的方法进行激活,对业务层返回的异常进行处理,在界面上提示激活成功还是激活失败。我们来看程序的代码

package com.weiyuan.goods.user.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.weiyuan.goods.user.domian.User;

import cn.itcast.jdbc.TxQueryRunner;

public class UserDao {

     //操作数据库
    private TxQueryRunner qr = new TxQueryRunner();

    /***
     * 查询用户名是否存在
     * @throws SQLException
     */
    public boolean ajaxValidateLoginName(String loginName) throws SQLException{
        //获得满足记录的数目是对象,返回一个整数,整数是单行单列使用ScalarHandler
        String sql ="select count(*) from t_user where loginname=?";
        Number num = (Number) qr.query(sql, new ScalarHandler(),loginName);
        int count = num.intValue();

        if(count>0){
            return true;
        }
        return false;
    }

    /***
     * 查询邮箱是否存在
     * @throws SQLException
     */
    public boolean ajaxValidateEmail(String email) throws SQLException{
        //获得满足记录的数目是对象,返回一个整数,整数是单行单列使用ScalarHandler
        String sql ="select count(*) from t_user where email=?";
        Number num = (Number) qr.query(sql, new ScalarHandler(),email);
        int count = num.intValue();
        System.out.println("count="+count);
        if(count>0){
            return true;
        }
        return false;
    }

    /***
     * 添加注册的用户
     * @throws SQLException
     */
    public void addUser(User user) throws SQLException{
        //获得满足记录的数目是对象,返回一个整数,整数是单行单列使用ScalarHandler
        String sql ="insert into  t_user values(?,?,?,?,?,?)";
        System.out.println("user="+user.toString());
        Object[] params = {user.getUid(),user.getLoginname(),user.getLoginpass(),
                user.getEmail(),user.getStatus(),user.getActivationCode()};
        qr.update(sql, params);
    }

    /*
     * 通过激活码获得用户
     * */
    public User findUserByActivationCode(String activationCode) throws SQLException{

        String sql = "select * from t_user where activationCode = ?";
        return qr.query(sql, new BeanHandler<User>(User.class),activationCode);
    }

    /*
     * 设置用户的激活状态
     * */

    public void setUserActivationCode(String uuid,int status) throws SQLException{
        String sql = "update t_user set status = ? where uid = ? ";
        qr.update(sql,status,uuid);
    }

}

我们来看业务层的代码:

package com.weiyuan.goods.user.service;

import java.io.IOException;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.management.RuntimeErrorException;

import cn.itcast.commons.CommonUtils;
import cn.itcast.mail.Mail;
import cn.itcast.mail.MailUtils;

import com.weiyuan.goods.user.dao.UserDao;
import com.weiyuan.goods.user.domian.User;

public class UserService {

 private UserDao dao = new UserDao();    

 public boolean ajaxValidateLoginName(String loginName) {

     try {
        return dao.ajaxValidateLoginName(loginName);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        throw new RuntimeException(e.getMessage());
    }

 }

public boolean ajaxValidateEmail(String email) {

     try {
        return dao.ajaxValidateEmail(email);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        throw new RuntimeException(e.getMessage());
    }

 }

//添加注册的用户
public void addUser(User user){
    //添加用户的uuid
    user.setUid(CommonUtils.uuid());
    //添加用户的激活码
    String activationCode = CommonUtils.uuid()+CommonUtils.uuid();
    user.setActivationCode(activationCode);
    //当前处于未激活的状态
    user.setStatus(0);//0表示未激活

    try {
        dao.addUser(user);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        throw new RuntimeException(e.getMessage());
    }

    //向注册的用户发送邮件
     //1读取配置文件
      Properties properties = new Properties();
      try {
        properties.load(this.getClass().getClassLoader().getResourceAsStream("email_template.properties"));
    } catch (IOException e1) {
        throw new RuntimeException(e1.getMessage());
    }

     String host = properties.getProperty("host"); //qq邮箱发送邮件的地址,端口465或者587
        //qq接受邮件服务器的地址是pop.qq.com,端口995
        String username=properties.getProperty("username"); //登陆服务器的账号
        String password=properties.getProperty("password");//这里不是客户端登陆的密码,而是授权密码一定要注意
        Session session = MailUtils.createSession(host, username, password);
        //发送邮件
        String from = properties.getProperty("from");//发件人
        String to = user.getEmail();//收件人
        String title = properties.getProperty("subject");
        String content = properties.getProperty("content");
        Object [] array = new Object[]{user.getActivationCode()};
        //替换占位符
        String formatContent = MessageFormat.format(content, user.getActivationCode());//替换占位符
        System.out.println("email content is:"+content);
        Mail mail = new Mail(from,to,title,formatContent);
        try {
            MailUtils.send(session, mail);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        } 

}

/*设置用户的激活状态*/

  public void activation(String activationCode) throws Exception{
      //1 、通过激活码查找对应的用户信息
      try {
        User user = dao.findUserByActivationCode(activationCode);
        if(user == null){
            throw new Exception("无效的激活码");//业务异常,业务失败
        }
        if(user.getStatus()== 1){
            throw new Exception("用户已经既激活,不要二次激活");//业务异常,业务失败
        }
        dao.setUserActivationCode(user.getUid(), 1); //1表示激活
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        throw new RuntimeException(e.getMessage()); // 不是业务的异常吗,而是电脑环境系统数据库的异常,直接退出线程,无法进行业务的操作了
    }

  }

}

我们来看servlet的代码

package com.weiyuan.goods.user.web.servlet;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.map.HashedMap;

import com.weiyuan.goods.user.domian.User;
import com.weiyuan.goods.user.service.UserService;

import cn.itcast.commons.CommonUtils;
import cn.itcast.servlet.BaseServlet;

/**
 * Servlet implementation class UserServlet
 */
@WebServlet("/UserServlet")
public class UserServlet extends BaseServlet{
    private static final long serialVersionUID = 1L;
    private UserService service = new UserService();
    /*
     * 用户注册页面使用ajax校验/*
     * 用户注册页面使用ajax校验用户名会调用该方法
     * *会调用该方法
     * */
    public String validateLoginname(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //首先获得用户上传的用户名
        String loginName = request.getParameter("loginname");
        boolean  flag = service.ajaxValidateLoginName(loginName);
        response.getWriter().print(flag);
        return null;
    }
    /*
     * 用户注册页面使用ajax校验邮箱会调用该方法
     * */
    public String validateEmail(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
       //获得用户上传的emai

        String email = request.getParameter("email");
        System.out.println("validateEmail is called"+email);
        boolean  flag = service.ajaxValidateEmail(email);
        response.getWriter().print(flag);
        return null;
    }

    /*
     * 用户注册页面使用ajax校验验证码会调用该方法
     * */
    public String validateVerifyCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
         //获得用户上传的verfycode
        String verifyCode  = request.getParameter("verifyCode");
        //获得session中保存的验证码
        String sessionCode = (String) request.getSession().getAttribute("vCode");
        //二者进行比较看是否相等
        System.out.println("validateVerifyCode is called"+verifyCode+":"+sessionCode);
        boolean  flag = sessionCode.equalsIgnoreCase(verifyCode);
        response.getWriter().print(flag);
        return null;
    }

    /*
     * 当用户从邮箱点击的激活的时候会调用该方法,并且把激活码传递过来
     *
     * */
    public String activation(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        String activationCode = request.getParameter("activationCode");
        System.out.println("email activationCode is :"+activationCode);
        try {
            service.activation(activationCode);
            //激活成功
             request.setAttribute("code", "success"); //msg.jsp已经code的值来显示错误信息还是正确的信息
             request.setAttribute("msg", "激活成功");
             return "f:/jsps/msg.jsp";
        } catch (Exception e) {
           //将业务操作的异常信息在msg.jsp中显示出来
            String msg = e.getMessage();
             request.setAttribute("code", "error"); //msg.jsp已经code的值来显示错误信息还是正确的信息
             request.setAttribute("msg", msg);
             return "f:/jsps/msg.jsp";

        }

    }

    /*
     * 当用户注册的时候会调用该方法
     *
     * */
    public String regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("activation is called");

        //1、将请求的参数封装成User对象
                User user = CommonUtils.toBean(request.getParameterMap(), User.class);
                //2 、对传递过来的参数进行校验,把错误的信息封装到一个hashMap中
                  Map errors = validateParams(user, request);
                  if(errors.size() > 0){//说明参数错误,跳转到注册界面提示用户输入的参数有误
                      request.setAttribute("errors", errors);
                      request.setAttribute("user", user);
                      return "f:/jsps/user/regist.jsp";
                  }
                 service.addUser(user);
                 request.setAttribute("code", "success");
                 request.setAttribute("msg", "用户注册成功,请马上到邮箱进行激活");
                  return "f:/jsps/msg.jsp";

    }

    public Map validateParams(User user,HttpServletRequest request){
        Map<String, String> map  = new HashedMap();
        //校验用户名
        String loginName = user.getLoginname();
        if(loginName == null || loginName.isEmpty()){
            map.put("loginname", "用户名不能为空");
        }
        if(loginName.length() < 3 || loginName.length() > 20){
            map.put("loginname", "用户名长度应该在3到20之间");
        }
        //校验用户名是否注册
        if(service.ajaxValidateLoginName(loginName)){
            map.put("loginname", "用户名已经被注册");
        }

        //检查登陆密码
        String loginpass = user.getLoginpass();
        if(loginpass == null || loginpass.isEmpty()){
            map.put("loginpass", "登陆密码不能为空");
        }
        if(loginpass.length() < 3 || loginpass.length() > 20){
            map.put("loginname", "登陆密码的长度应该在3到20之间");
        }

        //检查确认密码的信息
        //检查登陆密码
        String reloginpass = user.getReloginpass();
        if(reloginpass == null || reloginpass.isEmpty()){
            map.put("reloginpass", "登陆密码不能为空");
        }
        if(reloginpass.length() < 3 || reloginpass.length() > 20){
            map.put("reloginpass", "登陆密码的长度应该在3到20之间");
        }
        if(!reloginpass.equalsIgnoreCase(loginpass)){
            map.put("reloginpass", "两次输入的密码不一样");
        }

        //检查邮箱
        String email = user.getEmail();
        if(email == null || email.isEmpty()){
            map.put("email", "登陆邮箱不能为空");
        }
        //检查邮箱的格式是否正确
        if(!email.matches("^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$")){
            map.put("email", "邮箱格式不正确");
        }

        //检查验证码是否相等
        String verifyCode = user.getVerifyCode();
        //获得session中保存的验证码
        String sessionCode =(String) request.getSession().getAttribute("vCode");
        if(!verifyCode.equalsIgnoreCase(sessionCode)){
            map.put("verifyCode", "验证码不正确");
        }

        return map;

    }

}

对应激活这个操作:激活业务的结果就是:

激活成功

激活码无效

重复激活

三种结果

所以在业务层,如果是激活码无效和重复激活这两个业务操作失败的我们需要通过抛出异常,让外面的调用者servlet知道业务失败的原因,然后servlet对异常进行处理,在对应的界面msg.jsp中将业务操作的结果显示处理。

同时在业务操作的过程中,还存在其他异常导致业务操作失败,列如数据库的sql异常,但是这个异常不是业务本身的异常,而是数据库的异常,这个时候我们不想让servlet调用者知道,我们就直接在业务层中

  throw new RuntimeException(e.getMessage());抛出一个运行时的异常,直接退出程序。这就是
throw new RuntimeException(e.getMessage())和throw new Exception(e.getMessage())的区别。
时间: 2024-10-12 09:04:53

JavaWeb网上图书商城完整项目--day02-12.激活功能各层实现的相关文章

JavaWeb网上图书商城完整项目--day02-5.ajax校验功能之服务器端三层实现

regist.jsp页面中有异步请求服务器来对表单进行校验: l  校验登录名是否已注册过: l  校验Email是否已注册过: l  校验验证码是否正确. 这说明在UserServlet中需要提供相应的方法来支持前端的请求. 我们需要到数据库查询用户名.邮箱是否注册,到session中检查验证码是否正确. 在进行数据库操作之前,还需要对user表中的字段进行添加处理 因为其他页面中对用户的操作还设计到修改新的密码.确认密码.验证码等几个字段,我们需要在user表中添加下面的几个字段 packa

JavaWeb网上图书商城完整项目--day02-6.ajax校验功能之页面实现

1 .现在我们要在regist.js中实现ajax的功能,使用用户名到后台查询是否注册,邮箱是否到后台注册,验证码是否正确的功能 我们来看regist.js的代码 //该函数在html文档加载完成之后会调用 $(function() { /* * 变量所有的错误信息,调用一个方法来决定是否显示错误信息 * */ $(".errorClass").each(function() { showError($(this));//$(this)表示当前遍历的对象 }); //切换注册按钮的图片

JavaWeb网上图书商城完整项目--day02-4.regist页面提交表单时对所有输入框进行校验

1.现在我们要将table表中的输入的参数全部提交到后台进行校验,我们提交我们是按照表单的形式提交,所以我们首先需要在table表外面添加一个表单 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core&

JavaWeb网上图书商城完整项目--day03-1.图书模块功能介绍及相关类创建

1 前两天我们学习了user用户模块和图书的分类模块,接下来我们学习图书模块 图书模块的功能主要是下面的功能: 2 接下来我们创建对应的包 我们来看看对应的数据库表t_book CREATE TABLE `t_book` ( `bid` char(32) NOT NULL, `bname` varchar(200) default NULL, `author` varchar(50) default NULL, `price` decimal(8,2) default NULL, `currPr

JavaWeb网上图书商城完整项目--21.用户模块各层相关类的创建

1.现在要为user用户模块创建类 用户模块功能包括:注册.激活.登录.退出.修改密码. User类对照着t_user表来写即可.我们要保证User类的属性名称与t_user表的列名称完全相同. 我们来创建User类 package com.weiyuan.goods.user.domian; public class User { private String uid; //主键 private String loginname;// 登陆名称 private String loginpass

JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现

1.当从服务器返回的注册错误信息的时候,我们在注册界面需要将错误信息显示出来 我们需要修改regist.jsp页面的代码: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix

JavaWeb网上图书商城完整项目--day02-14.登录功能的login页面处理

1.现在注册成功之后,我们来到登录页面,登录页面在于 在登录页面.我们也需要向注册页面一样对登录的用户名.密码 验证码等在jsp页面中进行校验,校验我们单独放置一个login.js文件中进行处理,然后login.jsp加载该js文件 我们来看看login.js的代码和regist.js的代码一样,这里就不用花太多时间进行介绍 $(function() { /* * 1. 让登录按钮在得到和失去焦点时切换图片 */ $("#submit").hover( function() { $(&

JavaWeb网上图书商城完整项目--发送邮件

1.首先注册一个163邮箱 自己的邮箱地址是[email protected] 登陆的密码是[email protected]***19 使用邮箱发邮件,邮件必须开启pop和smtp服务,登陆邮件 开启pop服务,这个时候提示你必须设置授权的密码,我这里设置的是wy87**** 在代码里面必须设置成这个授权密码才能发送邮件,不能设置成登陆密码 客户端需要下面的两个jar文件 我们来看程序的代码: package com.weiyuan.test; import java.io.IOExcepti

JavaWeb网上图书商城完整项目--11.项目所需jquery函数介绍

1.下载jquery的函数包 2.强函数包添加到工程的web-root目录下 3.在jsp文件中加载js文件 <script type="text/javascript" src=" ${pageContext.request.contextPath}/jquery-1.5.1.js"> </script> 案例一:在文档加载完成后显示对话框 <%@ page language="java" import="