javaweb图书商城设计之用户模块(1)
作者:Android-Dev 发布时间:2023-10-30 09:22:57
标签: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" %>
<!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
用户登录
流程:/jsps/user/login.jsp -> UserServlet#login() -> index.jsp
用户退出
流程:top.jsp -> UserServlet#quit() -> login.jsp
quit():把session销毁!


猜你喜欢
- 一、代理模式代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机
- 因为支持csv,所以就一块写上了Workbook,Worksheet using Aspose.Cells(第三方)把Excel读取到属性对
- 一.mybatis的配置1.1 添加相应的jar包在lib文件夹下面添加mybatis的核心jar包以及依赖的jar包同在lib文件夹下面加
- using System;using System.Collections;using System.Text;using Sy
- 关于[Cannot determine value type from string ‘xxx’]的
- 实现的功能1.导入非xls和xlsx格式的文件2.导入空数据的excel文件3.数据缺失4.导入的excel文件中有重复的数据5.导入的ex
- 代码很简单,功能也很简单,这里就不多废话了#include<stdio.h>int main(){ char ku[16]={&
- 导言目前截屏的方法很多,root不适用,要么其他方法就是有局限性,而其中官方给出的方案最好—MediaProjection介绍Android
- 效果展示单选版可看上篇博文 用flutter封装一个点击菜单工具栏组件本文是CHeckbox多选版效果如图所示,点击选项回调选中的
- 概述不知道大家在各自项目中是如何写提供代码的commit message, 我们项目有的同事写的很简单,压根不知道提交了什么内容,是新功能还
- 目录1、创建 Android 库2、上传aar包至Maven * 3、其他项目使用4、QA1、创建 Android 库按以下步骤在项目中创建新
- 前言taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cl
- Google在Android 4.4版本加入了半透明的界面样式,在Android 5.0的时候推出了Material Design的概念。这
- 在上一篇《Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能》里,已经带着大家学习如何使用SwipeMenuListView这
- 1 前言在前文中,已经讲述了 AOP 的后置处理器使用和方法,在本文中继续分享增强信息相关的源码,这里才是 AOP 的核心代码。2 spri
- 在Android开发中,我们不光可以使用已有的实现方式,而且,我们还可以利用Android这个智能手机平台,实现一些比较有特色的功能。本篇文
- 本文实例讲述了java实现图片裁切的工具类。分享给大家供大家参考,具体如下:package com.yanek.util;import ja
- 1、AOP基本总结连接点(JoinPoint):连接点是程序运行的某个阶段点,如方法调用、异常抛出等切入点(Pointcut):切入点是Jo
- 我先解释一下什么叫IO流:I:指的是InputStream,这是一个抽象类,最常用的子类是FileInputStreamO:值得是Outpu
- 下面随笔说明函数指针用法。函数指针的定义:定义形式:存储类型 数据类型 (*函数指针名)()含义:函数指针指向的是程序代码存储区函数指针的典