最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javaweb圖書商城設(shè)計(jì)之用戶模塊(1)

 更新時(shí)間:2016年11月11日 11:02:52   作者:Android-Dev  
這篇文章主要介紹了javaweb圖書商城設(shè)計(jì)之用戶模塊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文主要為大家分析了圖書商城的用戶模塊,具體內(nèi)容如下

1、用戶模塊的相關(guān)類創(chuàng)建

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

2、用戶注冊(cè)

2.1 注冊(cè)流程

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

2.2 注冊(cè)頁(yè)面

<%@ 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>注冊(cè)</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>注冊(cè)</h1>
 <%--
 1. 顯示errors --> 字段錯(cuò)誤
 2. 顯示異常錯(cuò)誤
 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="注冊(cè)"/>
</form>
 </body>
</html>

2.3 UserServlet

User

/**
 * User的領(lǐng)域?qū)ο?
 */
public class User {
 /*
  * 對(duì)應(yīng)數(shù)據(jù)庫(kù)表
  */
 private String uid;// 主鍵
 private String username;// 用戶名
 private String password;// 密碼
 private String email;// 郵箱
 private String code;// 激活碼
 private boolean state;// 狀態(tài)(已激活和未激活)

BaseServlet

public class BaseServlet extends HttpServlet {
 /*
  * 它會(huì)根據(jù)請(qǐng)求中的method,來(lái)決定調(diào)用本類的哪個(gè)方法
  */
 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");// 它是一個(gè)方法名稱
   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. 封裝表單數(shù)據(jù)到form中
   * 2. 輸入校驗(yàn)(不寫了)
   * 3. 調(diào)用service完成激活
   * > 保存錯(cuò)誤信息、form到request,轉(zhuǎn)發(fā)到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);
   /*
    * 給用戶添加一個(gè)購(gòu)物車,即向session中保存一Cart對(duì)象
    */
   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. 獲取參數(shù)激活碼
   * 2. 調(diào)用service方法完成激活
   * > 保存異常信息到request域,轉(zhuǎn)發(fā)到msg.jsp
   * 3. 保存成功信息到request域,轉(zhuǎn)發(fā)到msg.jsp
   */
  String code = request.getParameter("code");
  try {
   userService.active(code);
   request.setAttribute("msg", "恭喜,您激活成功了!請(qǐng)馬上登錄!");
  } catch (UserException e) {
   request.setAttribute("msg", e.getMessage());
  }
  return "f:/jsps/msg.jsp";
 }

 /**
  * 注冊(cè)功能
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String regist(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /*
   * 1. 封裝表單數(shù)據(jù)到form對(duì)象中
   * 2. 補(bǔ)全:uid、code
   * 3. 輸入校驗(yàn)
   * > 保存錯(cuò)誤信息、form到request域,轉(zhuǎn)發(fā)到regist.jsp
   * 4. 調(diào)用service方法完成注冊(cè)
   * > 保存錯(cuò)誤信息、form到request域,轉(zhuǎn)發(fā)到regist.jsp
   * 5. 發(fā)郵件
   * 6. 保存成功信息轉(zhuǎn)發(fā)到msg.jsp
   */
  // 封裝表單數(shù)據(jù)
  User form = CommonUtils.toBean(request.getParameterMap(), User.class);
  // 補(bǔ)全
  form.setUid(CommonUtils.uuid());
  form.setCode(CommonUtils.uuid() + CommonUtils.uuid());
  /*
   * 輸入校驗(yàn)
   * 1. 創(chuàng)建一個(gè)Map,用來(lái)封裝錯(cuò)誤信息,其中key為表單字段名稱,值為錯(cuò)誤信息
   */
  Map<String,String> errors = new HashMap<String,String>();
  /*
   * 2. 獲取form中的username、password、email進(jìn)行校驗(yàn)
   */
  String username = form.getUsername();
  if(username == null || username.trim().isEmpty()) {
   errors.put("username", "用戶名不能為空!");
  } else if(username.length() < 3 || username.length() > 10) {
   errors.put("username", "用戶名長(zhǎng)度必須在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", "密碼長(zhǎng)度必須在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格式錯(cuò)誤!");
  }
  /*
   * 3. 判斷是否存在錯(cuò)誤信息
   */
  if(errors.size() > 0) {
   // 1. 保存錯(cuò)誤信息
   // 2. 保存表單數(shù)據(jù)
   // 3. 轉(zhuǎn)發(fā)到regist.jsp
   request.setAttribute("errors", errors);
   request.setAttribute("form", form);
   return "f:/jsps/user/regist.jsp";
  }

  /*
   * 調(diào)用service的regist()方法
   */
  try {
   userService.regist(form);
  } catch (UserException e) {
   /*
    * 1. 保存異常信息
    * 2. 保存form
    * 3. 轉(zhuǎn)發(fā)到regist.jsp
    */
   request.setAttribute("msg", e.getMessage());
   request.setAttribute("form", form);
   return "f:/jsps/user/regist.jsp";
  }

  /*
   * 發(fā)郵件
   * 準(zhǔn)備配置文件!
   */
  // 獲取配置文件內(nèi)容
  Properties props = new Properties();
  props.load(this.getClass().getClassLoader()
    .getResourceAsStream("email_template.properties"));
  String host = props.getProperty("host");//獲取服務(wù)器主機(jī)
  String uname = props.getProperty("uname");//獲取用戶名
  String pwd = props.getProperty("pwd");//獲取密碼
  String from = props.getProperty("from");//獲取發(fā)件人
  String to = form.getEmail();//獲取收件人
  String subject = props.getProperty("subject");//獲取主題
  String content = props.getProperty("content");//獲取郵件內(nèi)容
  content = MessageFormat.format(content, form.getCode());//替換{0}

  Session session = MailUtils.createSession(host, uname, pwd);//得到session
  Mail mail = new Mail(from, to, subject, content);//創(chuàng)建郵件對(duì)象
  try {
   MailUtils.send(session, mail);//發(fā)郵件!
  } catch (MessagingException e) {
  }


  /*
   * 1. 保存成功信息
   * 2. 轉(zhuǎn)發(fā)到msg.jsp
   */
  request.setAttribute("msg", "恭喜,注冊(cè)成功!請(qǐng)馬上到郵箱激活");
  return "f:/jsps/msg.jsp";
 }
}

2.4 UserService

/**
 * User業(yè)務(wù)層
 */
public class UserService {
 private UserDao userDao = new UserDao();

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

  // 校驗(yàn)用戶名
  User user = userDao.findByUsername(form.getUsername());
  if(user != null) throw new UserException("用戶名已被注冊(cè)!");

  // 校驗(yàn)email
  user = userDao.findByEmail(form.getEmail());
  if(user != null) throw new UserException("Email已被注冊(cè)!");

  // 插入用戶到數(shù)據(jù)庫(kù)
  userDao.add(form);
 }

 /**
  * 激活功能
  * @throws UserException 
  */
 public void active(String code) throws UserException {
  /*
   * 1. 使用code查詢數(shù)據(jù)庫(kù),得到user
   */
  User user = userDao.findByCode(code);
  /*
   * 2. 如果user不存在,說(shuō)明激活碼錯(cuò)誤
   */
  if(user == null) throw new UserException("激活碼無(wú)效!");
  /*
   * 3. 校驗(yàn)用戶的狀態(tài)是否為未激活狀態(tài),如果已激活,說(shuō)明是二次激活,拋出異常
   */
  if(user.isState()) throw new UserException("您已經(jīng)激活過(guò)了,不要再激活了,除非你想死!");

  /*
   * 4. 修改用戶的狀態(tài)
   */
  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的密碼,若不同,拋出異常(密碼錯(cuò)誤)
   * 4. 查看用戶的狀態(tài),若為false,拋出異常(尚未激活)
   * 5. 返回user
   */
  User user = userDao.findByUsername(form.getUsername());
  if(user == null) throw new UserException("用戶名不存在!");
  if(!user.getPassword().equals(form.getPassword()))
   throw new UserException("密碼錯(cuò)誤!");
  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);
  }
 }

 /**
  * 插入U(xiǎn)ser
  * @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);
  }
 }

 /**
  * 修改指定用戶的指定狀態(tài)
  * @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銷毀!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過(guò)程詳解

    Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過(guò)程詳解

    本文將通過(guò)Java后端程序代碼展示如何實(shí)現(xiàn)將PPT幻燈片轉(zhuǎn)成OFD格式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下
    2022-01-01
  • Java中synchronized鎖的深入理解

    Java中synchronized鎖的深入理解

    這篇本文主要對(duì)Java中synchronized鎖進(jìn)行深入理解,文中通過(guò)synchronized的優(yōu)化,synchronized的實(shí)現(xiàn)原理及synchronized的升級(jí)過(guò)程來(lái)介紹Java中synchronized鎖,感興趣的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)
    2023-05-05
  • Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例

    Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例

    這篇文章主要介紹了Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能,結(jié)合完整實(shí)例形式分析了java觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設(shè)計(jì)原則與適用場(chǎng)合,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04
  • MyBatis update標(biāo)簽詳解

    MyBatis update標(biāo)簽詳解

    這篇文章主要介紹了MyBatis update標(biāo)簽,使用 Map 傳遞參數(shù)會(huì)導(dǎo)致業(yè)務(wù)可讀性的喪失,繼而導(dǎo)致后續(xù)擴(kuò)展和維護(hù)的困難,所以在實(shí)際應(yīng)用中我們應(yīng)該果斷廢棄該方式,需要的朋友可以參考下
    2023-10-10
  • java分頁(yè)攔截類實(shí)現(xiàn)sql自動(dòng)分頁(yè)

    java分頁(yè)攔截類實(shí)現(xiàn)sql自動(dòng)分頁(yè)

    這篇文章主要為大家詳細(xì)介紹了java分頁(yè)攔截類可以實(shí)現(xiàn)sql自動(dòng)分頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 深入理解Java中的接口

    深入理解Java中的接口

    下面小編就為大家?guī)?lái)一篇深入理解Java中的接口。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • 源碼解析帶你了解LinkedHashMap

    源碼解析帶你了解LinkedHashMap

    大多數(shù)情況下,只要不涉及線程安全問(wèn)題,Map基本都可以使用HashMap,不過(guò)HashMap有一個(gè)問(wèn)題,就是迭代HashMap的順序并不是HashMap放置的順序,也就是無(wú)序。HashMap的這一缺點(diǎn)往往會(huì)帶來(lái)困擾,所以LinkedHashMap就閃亮登場(chǎng)了,這篇文章通過(guò)源碼解析帶你了解LinkedHashMap
    2021-09-09
  • java實(shí)現(xiàn)遍歷Map的方法

    java實(shí)現(xiàn)遍歷Map的方法

    這篇文章主要介紹了java實(shí)現(xiàn)遍歷Map的方法,以簡(jiǎn)單實(shí)例形式分析了java針對(duì)HashMap的遍歷技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 解決SpringBoot下Redis序列化亂碼的問(wèn)題

    解決SpringBoot下Redis序列化亂碼的問(wèn)題

    這篇文章主要介紹了解決SpringBoot下Redis序列化亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java編程小白進(jìn)階包的作用詳解

    java編程小白進(jìn)階包的作用詳解

    這篇文章主要為大家介紹了java編程中包的作用詳解,文中通過(guò)示例分析方便大家更容易理解包的作用,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論

拜泉县| 灵川县| 东兰县| 镇平县| 青龙| 昆山市| 新宾| 宽城| 通江县| 西青区| 尚志市| 新干县| 德庆县| 丹巴县| 筠连县| 万州区| 渝中区| 施秉县| 开阳县| 汶川县| 邢台县| 澜沧| 胶南市| 灵璧县| 榆树市| 三都| 密云县| 松潘县| 西城区| 东莞市| 公主岭市| 万源市| 二手房| 长寿区| 民勤县| 宁都县| 策勒县| 上饶市| 黔西县| 长乐市| 大方县|