图书商城:用户模块

这里写图片描述

用户模块

1、用户模块的相关类创建

  • domain:User
  • dao:UserDao
  • service:UserDao
  • web.servlet:UserServlet

2、用户注册

2.1 注册流程

/jsps/user/regist.jsp -> UserServlet#regist() -> msg.jsp

2.2 注册页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>注册</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  <h1>注册</h1>
  <%--
  1. 显示errors --> 字段错误
  2. 显示异常错误
  3. 回显
   --%>
<p style="color: red; font-weight: 900">${msg }</p>
<form action="<c:url value='/UserServlet'/>" method="post">
    <input type="hidden" name="method" value="regist"/>
    用户名:<input type="text" name="username" value="${form.username }"/>
    <span style="color: red; font-weight: 900">${errors.username }</span>
    <br/>
    密 码:<input type="password" name="password" value="${form.password }"/>
    <span style="color: red; font-weight: 900">${errors.password }</span>
    <br/>
    邮 箱:<input type="text" name="email" value="${form.email }"/>
    <span style="color: red; font-weight: 900">${errors.email }</span>
    <br/>
    <input type="submit" value="注册"/>
</form>
  </body>
</html>

2.3 UserServlet

User

/**
 * User的领域对象
 */
public class User {
    /*
     * 对应数据库表
     */
    private String uid;// 主键
    private String username;// 用户名
    private String password;// 密码
    private String email;// 邮箱
    private String code;// 激活码
    private boolean state;// 状态(已激活和未激活)

BaseServlet

public class BaseServlet extends HttpServlet {
    /*
     * 它会根据请求中的method,来决定调用本类的哪个方法
     */
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        res.setContentType("text/html;charset=utf-8");
        try {
            // 例如:http://localhost:8080/demo1/xxx?m=add
            String method = req.getParameter("method");// 它是一个方法名称
            Class c = this.getClass();
            Method m = c.getMethod(method, HttpServletRequest.class,
                    HttpServletResponse.class);
            String result = (String) m.invoke(this, req, res);
            if(result != null && !result.isEmpty()) {
                req.getRequestDispatcher(result).forward(req, res);
            }
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
}

UserServlet

/**
 * User表述层
 */
public class UserServlet extends BaseServlet {
    private UserService userService = new UserService();

    /**
     * 退出功能
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String quit(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.getSession().invalidate();
        return "r:/index.jsp";
    }

    public String login(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 1. 封装表单数据到form中
         * 2. 输入校验(不写了)
         * 3. 调用service完成激活
         *   > 保存错误信息、form到request,转发到login.jsp
         * 4. 保存用户信息到session中,然后重定向到index.jsp
         */
        User form = CommonUtils.toBean(request.getParameterMap(), User.class);
        try {
            User user = userService.login(form);
            request.getSession().setAttribute("session_user", user);
            /*
             * 给用户添加一个购物车,即向session中保存一Cart对象
             */
            request.getSession().setAttribute("cart", new Cart());
            return "r:/index.jsp";
        } catch (UserException e) {
            request.setAttribute("msg", e.getMessage());
            request.setAttribute("form", form);
            return "f:/jsps/user/login.jsp";
        }
    }

    /**
     * 激活功能
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String active(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 1. 获取参数激活码
         * 2. 调用service方法完成激活
         *   > 保存异常信息到request域,转发到msg.jsp
         * 3. 保存成功信息到request域,转发到msg.jsp
         */
        String code = request.getParameter("code");
        try {
            userService.active(code);
            request.setAttribute("msg", "恭喜,您激活成功了!请马上登录!");
        } catch (UserException e) {
            request.setAttribute("msg", e.getMessage());
        }
        return "f:/jsps/msg.jsp";
    }

    /**
     * 注册功能
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String regist(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 1. 封装表单数据到form对象中
         * 2. 补全:uid、code
         * 3. 输入校验
         *   > 保存错误信息、form到request域,转发到regist.jsp
         * 4. 调用service方法完成注册
         *   > 保存错误信息、form到request域,转发到regist.jsp
         * 5. 发邮件
         * 6. 保存成功信息转发到msg.jsp
         */
        // 封装表单数据
        User form = CommonUtils.toBean(request.getParameterMap(), User.class);
        // 补全
        form.setUid(CommonUtils.uuid());
        form.setCode(CommonUtils.uuid() + CommonUtils.uuid());
        /*
         * 输入校验
         * 1. 创建一个Map,用来封装错误信息,其中key为表单字段名称,值为错误信息
         */
        Map<String,String> errors = new HashMap<String,String>();
        /*
         * 2. 获取form中的username、password、email进行校验
         */
        String username = form.getUsername();
        if(username == null || username.trim().isEmpty()) {
            errors.put("username", "用户名不能为空!");
        } else if(username.length() < 3 || username.length() > 10) {
            errors.put("username", "用户名长度必须在3~10之间!");
        }

        String password = form.getPassword();
        if(password == null || password.trim().isEmpty()) {
            errors.put("password", "密码不能为空!");
        } else if(password.length() < 3 || password.length() > 10) {
            errors.put("password", "密码长度必须在3~10之间!");
        }

        String email = form.getEmail();
        if(email == null || email.trim().isEmpty()) {
            errors.put("email", "Email不能为空!");
        } else if(!email.matches("\\w+@\\w+\\.\\w+")) {
            errors.put("email", "Email格式错误!");
        }
        /*
         * 3. 判断是否存在错误信息
         */
        if(errors.size() > 0) {
            // 1. 保存错误信息
            // 2. 保存表单数据
            // 3. 转发到regist.jsp
            request.setAttribute("errors", errors);
            request.setAttribute("form", form);
            return "f:/jsps/user/regist.jsp";
        }

        /*
         * 调用service的regist()方法
         */
        try {
            userService.regist(form);
        } catch (UserException e) {
            /*
             * 1. 保存异常信息
             * 2. 保存form
             * 3. 转发到regist.jsp
             */
            request.setAttribute("msg", e.getMessage());
            request.setAttribute("form", form);
            return "f:/jsps/user/regist.jsp";
        }

        /*
         * 发邮件
         * 准备配置文件!
         */
        // 获取配置文件内容
        Properties props = new Properties();
        props.load(this.getClass().getClassLoader()
                .getResourceAsStream("email_template.properties"));
        String host = props.getProperty("host");//获取服务器主机
        String uname = props.getProperty("uname");//获取用户名
        String pwd = props.getProperty("pwd");//获取密码
        String from = props.getProperty("from");//获取发件人
        String to = form.getEmail();//获取收件人
        String subject = props.getProperty("subject");//获取主题
        String content = props.getProperty("content");//获取邮件内容
        content = MessageFormat.format(content, form.getCode());//替换{0}

        Session session = MailUtils.createSession(host, uname, pwd);//得到session
        Mail mail = new Mail(from, to, subject, content);//创建邮件对象
        try {
            MailUtils.send(session, mail);//发邮件!
        } catch (MessagingException e) {
        }


        /*
         * 1. 保存成功信息
         * 2. 转发到msg.jsp
         */
        request.setAttribute("msg", "恭喜,注册成功!请马上到邮箱激活");
        return "f:/jsps/msg.jsp";
    }
}

2.4 UserService

/**
 * User业务层
 */
public class UserService {
    private UserDao userDao = new UserDao();

    /**
     * 注册功能
     * @param form
     */
    public void regist(User form) throws UserException{

        // 校验用户名
        User user = userDao.findByUsername(form.getUsername());
        if(user != null) throw new UserException("用户名已被注册!");

        // 校验email
        user = userDao.findByEmail(form.getEmail());
        if(user != null) throw new UserException("Email已被注册!");

        // 插入用户到数据库
        userDao.add(form);
    }

    /**
     * 激活功能
     * @throws UserException 
     */
    public void active(String code) throws UserException {
        /*
         * 1. 使用code查询数据库,得到user
         */
        User user = userDao.findByCode(code);
        /*
         * 2. 如果user不存在,说明激活码错误
         */
        if(user == null) throw new UserException("激活码无效!");
        /*
         * 3. 校验用户的状态是否为未激活状态,如果已激活,说明是二次激活,抛出异常
         */
        if(user.isState()) throw new UserException("您已经激活过了,不要再激活了,除非你想死!");

        /*
         * 4. 修改用户的状态
         */
        userDao.updateState(user.getUid(), true);
    }

    /**
     * 登录功能
     * @param form
     * @return
     * @throws UserException 
     */
    public User login(User form) throws UserException {
        /*
         * 1. 使用username查询,得到User
         * 2. 如果user为null,抛出异常(用户名不存在)
         * 3. 比较form和user的密码,若不同,抛出异常(密码错误)
         * 4. 查看用户的状态,若为false,抛出异常(尚未激活)
         * 5. 返回user
         */
        User user = userDao.findByUsername(form.getUsername());
        if(user == null) throw new UserException("用户名不存在!");
        if(!user.getPassword().equals(form.getPassword()))
            throw new UserException("密码错误!");
        if(!user.isState()) throw new UserException("尚未激活!");

        return user;
    }
}

2.5 UserDao

这里写图片描述

/**
 * User持久层
 */
public class UserDao {
    private QueryRunner qr = new TxQueryRunner();

    /**
     * 按用户名查询
     * @param username
     * @return
     */
    public User findByUsername(String username) {
        try {
            String sql = "select * from tb_user where username=?";
            return qr.query(sql, new BeanHandler<User>(User.class), username);
        } catch(SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 按email查询
     * @param email
     * @return
     */
    public User findByEmail(String email) {
        try {
            String sql = "select * from tb_user where email=?";
            return qr.query(sql, new BeanHandler<User>(User.class), email);
        } catch(SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 插入User
     * @param user
     */
    public void add(User user) {
        try {
            String sql = "insert into tb_user values(?,?,?,?,?,?)";
            Object[] params = {user.getUid(), user.getUsername(), 
                    user.getPassword(), user.getEmail(), user.getCode(),
                    user.isState()};
            qr.update(sql, params);
        } catch(SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 按激活码查询
     * @param code
     * @return
     */
    public User findByCode(String code) {
        try {
            String sql = "select * from tb_user where code=?";
            return qr.query(sql, new BeanHandler<User>(User.class), code);
        } catch(SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 修改指定用户的指定状态
     * @param uid
     * @param state
     */
    public void updateState(String uid, boolean state) {
        try {
            String sql = "update tb_user set state=? where uid=?";
            qr.update(sql, state, uid);
        } catch(SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

3、用户激活

流程:用户的邮件中 -> UserServlet#active() -> msg.jsp

这里写图片描述

4、用户登录

流程:/jsps/user/login.jsp -> UserServlet#login() -> index.jsp

这里写图片描述

5、用户退出

流程:top.jsp -> UserServlet#quit() -> login.jsp

quit():把session销毁!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值