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

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

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销毁!

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

(0)

相关推荐

  • JavaWeb搭建网上图书商城毕业设计

    以前一直接触.net相关的web开发,现在猛然使用javaWeb还是很不习惯,就连搭个框架也是第一次. 一.谈谈项目架构 一开始接触.net相关的开发所以对于.net相关的开发还是比较熟悉的,但我在学校学的java方向的开发,而我打算把这两种平台结合起来,使用java做后台也就是服务提供者,将所有业务逻辑在java平台完成并使用我比较熟悉的.net做Web端的开发.这样一来安卓app,web端就都有了.客户端统一通过分布式框架调用服务.找了很久最终选择了Hprose,这一轻量级.跨语言.跨平台.

  • javaweb图书商城设计之订单模块(5)

    这篇文章是针对javaweb图书商城中订单模块的研究, 1.创建相关类 domain: Order OrderItem dao:OrderDao service:OrderService web.servlete:OrderServlet /** * 订单条目类 */ public class OrderItem { private String iid; private int count;// 数量 private double subtotal;// 小计 private Order or

  • Java设计模块系列之书店管理系统单机版(一)

    书店管理系统: 项目练习目标 : 1.Java应用程序基本分析 2.培养面向对象编程的基本思想 3.Java基本设计模式综合应用 4.掌握分层和接口的基本设计 5.构建合理的Java应用程序包结构 6.综合应用JSE所学习的知识 7.在应用中合理使用集合框架 8.在应用中综合使用swing的常用组件 9.基本的表现层的实现机制 10.IO流和文件的基本操作 11.培养良好的Java编程习惯 12.培养调试Java程序的能力,培养改错的能力 项目功能需求 : 1.能进行操作用户的注册,修改基本信息

  • 图书管理系统java版

    本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出版日期.书号.价格字段.设计一个GUI界面进行书目管理.在该界面上有四个选项卡,分别是查询.插入.删除.修改.点击查询选项卡,出现的界面上有书名.作者.出版社.书号四个文本框,一个按钮和一个只读文本区.文本框内容可以为空,输入相应的查询信息后(例如根据书名查询可以仅输入书名),点击界面上的"查询"按钮,可以在界面

  • javaweb图书商城设计之购物车模块(3)

    本文继续为大家分享了javaweb图书商城中购物车模块,供大家参考,具体内容如下 购物车存储 保存在session中 保存在cookie中 保存在数据库中 1.创建相关类 购物车的结构: CartItem:购物车条目,包含图书和数量 Cart:购物车,包含一个Map /** * 购物车类 */ public class Cart { private Map<String,CartItem> map = new LinkedHashMap<String,CartItem>(); /*

  • 利用Java异常机制实现模拟借书系统

    本文介绍的是利用java语言实现一个控制台版的模拟借书系统,在开始本文的正式内容之前,我们先来了解一下Java异常机制. 什么是异常? 异常,不正常也.Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时. 异常会影响程序的连续性,使程序中断.在Java中,一切皆对象,所以要定义异常,也需要使用对象.异常对象里 封装了异常类型和程序发生异常时的状态. 我们经常说的抛出异常就是创建异常对象,并提交给运行系统. 异常捕获机制与try-catch 当异常

  • Java设计模块系列之书店管理系统单机版(二)

    Java-单机版的书店管理系统(练习设计模块和思想_系列 一 ): http://www.jb51.net/article/91004.htm 介绍 小提示:上面一点有一个目录,可以快速定位到自己需要看的类. 今天对前面的代码有了小小的修改,让代码更加完善了一点. 至于用户唯一标识码uuid,会在以后修改成程序内部生成的, 现在的uuid还是由用户自己设置. 今天对这个程序,添加了用户界面的表现层的一部分,增加了公共类 枚举, 下面贴出目前我写的这个程序的全部代码:我会逐渐的写完这个程序的,请大

  • java网上图书商城(4)购物车模块1

    本文实例为大家分享了购物车模块的具体代码,供大家参考,具体内容如下 使用的不是session,也不是cookie,而是表 > 添加购物条目 > 修改购物条目的数量 > 删除条目 > 批量删除条目 > 我的购物车,即按用户查询条目 > 查询勾选的条目 1.数据表 复制代码 代码如下: insert  into `t_cartitem`(`cartItemId`,`quantity`,`bid`,`uid`,`orderBy`) values ('B8939FC551314

  • javaweb图书商城设计之图书模块(4)

    本文接着上一篇图书商城分类模块进行学习,供大家参考,具体内容如下 1.创建相关类 cn.itcast.bookstore.book domain:Book dao:BookDao service :BookService web.servle:BookServlet Book public class Book { private String bid; private String bname; private double price; private String author; priv

  • 一个简陋的java图书管理系统

    本文代码为原创一个简陋的管理系统,只做功能的测试.并没有去完善所有应有的功能,只做了输入输出查找,仅供参考! 菜单部分: import java.util.Scanner; public class Menu { int Min = 1; int Max = 3; public void getMenu(){ System.out.println("1.显示/2.输入/3.查找"); } public void getFindMenu(){ System.out.println(&qu

随机推荐