热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

javaweb图书商城设计之用户模块(1)

这篇文章主要介绍了javaweb图书商城设计之用户模块的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文主要为大家分析了图书商城的用户模块,具体内容如下

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" %>




 

 

 
 
  
 
 
 
 

 

 
 

注册

<%-- 1. 显示errors --> 字段错误 2. 显示异常错误 3. 回显 --%>

${msg }

" method="post"> 用户名: ${errors.username }
密 码: ${errors.password }
邮 箱: ${errors.email }

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&#63;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 errors = new HashMap();
  /*
   * 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=&#63;";
   return qr.query(sql, new BeanHandler(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=&#63;";
   return qr.query(sql, new BeanHandler(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(&#63;,&#63;,&#63;,&#63;,&#63;,&#63;)";
   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=&#63;";
   return qr.query(sql, new BeanHandler(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=&#63; where uid=&#63;";
   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销毁!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
哲玲旭辉9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有