文档章节

用户注册和登录案例(服务器端:数据控制,业务层,dao层)

day戴
 day戴
发布于 2014/06/09 22:04
字数 1971
阅读 2842
收藏 9
点赞 0
评论 0

用户注册和登录案例(服务器端):

1 建立工程,搭建开发环境:
dom4j.jar
jaxen.jar

commons-beanutils.jar
commons-logging.jar

standard.jar
jstl.jar(这两个编译工具本身就有)

2建立开发需要用的包:
1 itcast.cn.domain 放置javabean   导入数据库
2 itcast.cn.dao  Dao接口
3 itcast.cn.dao.impl Dao接口的实现
4 itcast.cn.servlet  业务接口
5 itcast.cn.servlet.impl 业务接口的实现
6 itcast.web.controller.Servlet控制器
7 page.jsp  视图

把握两点:
1 先写好javabean
2 写好业务接口

 

开发步骤:
1写好javabean:
public class User implements Serializable {
 private String usename;
 private String password;
 private String email;
 private Date birthday;
 
 public String getUsename() {
  return usename;
 }
 public void setUsename(String usename) {
  this.usename = usename;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
}

2 建立xml用以存放数据,模拟数据库
<?xml version="1.0" encoding="UTF-8"?>
<Users>
 <User usename="djw" password="123" email="sada@qq.com" birthday="1991-06-11"></User>
</Users>

3建立业务接口:
public interface BusinessServlet {
 /**
  * 完成用户注册
  * @param user 用户信息
  * @throws UserExistException 当用户名已经存在时,抛出异常
  */
 void regist(User user) throws UserExistException;
 
 /**
  * 完成用户登录
  * @param usename 用户名
  * @param password  密码
  * 当帐号或者密码不正确时,返回null
  */
 void login(String usename,String password);
 
}

异常UserExistException为一个自定义类,
代码:
package itcast.cn.exception;

public class UserExistException extends Exception {

 public UserExistException() {
 }

 public UserExistException(String message) {
  super(message);
 }

 public UserExistException(Throwable cause) {
  super(cause);
 }

 public UserExistException(String message, Throwable cause) {
  super(message, cause);

 }

}

4 建立dao接口:
public interface UserDao {
 /**
  * 保存用户信息
  * @param user
  */
 void save(User user);
 /**
  * 根据用户名查找用户
  * @param usename
  * @return 如果用户名不存在,则返回null
  */
 void findUserByUsername(String usename);
 /**
  * 根据用户名和密码卡查找用户
  * @param usename
  * @param password
  * @return 如果用户名不存在,则返回null
  */
 void findUser(String usename,String password);
}

5 实现dao接口:

5.1:创建工具类:
1 dom4jUntil:
代码:
public class Dom4jUntil {
 //创建真实路径
 private static String DB_FILEPATH;
 //用类加载器解析xml文件
 static{
  //获取类加载器
  ClassLoader cl=Dom4jUntil.class.getClassLoader();
  //查找所有给定名称的资源
  URL url=cl.getResource("Users.xml");
  //获取文件的真实路径
  DB_FILEPATH=url.getPath();
 }
 //读取xml文件中的属性
 public static Document getdocument() throws Exception{
  //读取xml中的属性
  SAXReader sr=new SAXReader();
  return sr.read(DB_FILEPATH);
 }
 //将属性写入xml文件
 public static void write2xml(Document document) throws Exception, FileNotFoundException{
  OutputFormat format=OutputFormat.createPrettyPrint();
  XMLWriter xw=new XMLWriter(new FileOutputStream(DB_FILEPATH), format);
  xw.write(document);
  xw.close();
 }
}
2:WebUtil
public class WebUtil {

 public static <T>T fillBean(HttpServletRequest request,
   Class<T> class1) {
  T bean;
  try {
   bean = class1.newInstance();
   BeanUtils.populate(bean, request.getParameterMap());
   return bean;
  } catch (Exception e) {
   throw new RuntimeException();
  }
 }
 
}

5.2 实现dao接口:
public class UserDaoDom4jImpl implements UserDao {

 public void save(User user) {
  try {
   //获取节点
   Document document=Dom4jUntil.getdocument();
   //获取根元素
   Element root=document.getRootElement();
   //创建user元素
   Element UserElement=DocumentHelper.createElement("user");
   //往user元素中添加属性
   UserElement.addAttribute("username", user.getUsename());
   UserElement.addAttribute("password", user.getPassword());
   UserElement.addAttribute("email", user.getEmail());
   UserElement.addAttribute("birthday", user.getBirthday().toLocaleString());
   //添加到根元素
   root.add(UserElement);
   //将节点写回到xml
   Dom4jUntil.write2xml(document);
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }

 public User findUserByUsername(String username) {
  try {
   Document document=Dom4jUntil.getdocument();
   //获取路径
   String xpath="//user[@username='"+username+"']";
   //获取指定路径文件的节点
   Node node=document.selectSingleNode(xpath);
   //如果没有找到
   if(node==null){
    return null;
   }
   //找到了
   User user=new User();
   user.setUsename(node.valueOf("@username"));
   user.setPassword(node.valueOf("@password"));
   user.setEmail(node.valueOf("@email"));
   //将字符串解析成时间
   DateFormat df=new SimpleDateFormat();
   user.setBirthday(df.parse(node.valueOf("@birthday")));
   return user;
   
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }

 public User findUser(String username, String password) {
  try {
   Document document=Dom4jUntil.getdocument();
   //获取路径
   String xpath="//user[@username='"+username+"' and @password='"+password+"']";
   //获取指定路径文件的节点
   Node node=document.selectSingleNode(xpath);
   //如果没有找到
   if(node==null){
    return null;
   }
   //找到了
   User user=new User();
   user.setUsename(node.valueOf("@username"));
   user.setPassword(node.valueOf("@password"));
   user.setEmail(node.valueOf("@email"));
   //将字符串解析成时间
   DateFormat df=new SimpleDateFormat();
   user.setBirthday(df.parse(node.valueOf("@birthday")));
   return user;
   
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

6 实现业务接口:

public class BusinessServeltImpl implements BusinessServlet {
 UserDaoDom4jImpl dao=new UserDaoDom4jImpl();
 public void regist(User user) throws UserExistException {
   User dbUser= dao.findUserByUsername(user.getUsename());
   if(dbUser==null){
    throw new UserExistException(user.getUsename()+"已经存在");
   }
   dao.save(user);
 }

 public User login(String username, String password) {
   return dao.findUser(username, password);
 }
}


7测试类,测试dao接口和业务接口的实现
public class BusinessServletImplTest {
 BusinessServeltImpl bs=new BusinessServeltImpl();
 @Test
 public void testRegist() throws Exception {
  User user=new User();
  user.setUsename("fff");
  user.setPassword("123");
  user.setEmail("djw@qq.com");
  user.setBirthday(new Date());
  bs.regist(user);
 }

 @Test
 public void testLogin() {
  User u=bs.login("rrr", "123");
  assertNull(u);
  u=bs.login("djw", "123");
  assertNotNull(u);
 }
}

8写界面:
主页面:
 <body>
    XX网站<hr/>
    <c:if test="${sessionScope.user==null}">
     <a href="${pageContext.request.contextPath}/login.jsp">登录</a>
     <a href="${pageContext.request.contextPath}/regist.jsp">注册</a>
    </c:if>
    <c:if test="${sessionScope.user!=null}">
     <a href="${pageContext.request.contextPath}/servlet/Logout">注销</a>
    </c:if>
  </body>

 注册页面:
  <body>
    注册<hr/>
    <form action="${pageContext.request.contextPath}/servlet/RegistServlet" method="post">
     <table border="1">
      <tr>
      <th>用户名:(必须输入,3-8位字母组成)</th>
      <td><input type="text" name="username" value="${formBean.username}">${formBean.errors.username}</td>
      <tr/>
      <tr>
      <th>密码:(必须输入,3-8位数字组成)</th>
      <td><input type="password" name="password" value="">${formBean.errors.password}</td>
      <tr/>
      <tr>
      <th>确认密码:(再次输入密码)</th>
      <td><input type="password" name="password2" value="">${formBean.errors.password2 }</td>
      <tr/>
      <tr>
      <th>邮箱:(符合邮箱格式)</th>
      <td><input type="text" name="email" value="${formBean.email }">${formBean.errors.email}</td>
      <tr/>
      <tr>
      <th>出生日期:(格式:1991-06-11)</th>
      <td><input type="text" name="birthday" value="${formBean.birthday}">${formBean.errors.birthday}</td>
      <tr/>
      <tr>
      <td><input type="submit" value="注册" ></td>
      <tr/>
     </table>
    </form>
  </body>

  登录页面:
  <body>
    登录<hr/>
    <form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">
     <table border="1">
      <tr>
      <th>用户名:(必须输入,3-8位字母组成)</th>
      <td><input type="text" name="username"></td>
      <tr/>
      <tr>
      <th>密码:(必须输入,3-8位数字组成)</th>
      <td><input type="password" name="password"></td>
      <tr/>
      <tr>
      <td><input type="submit" value="登录" ></td>
      <tr/>
     </table>
    </form>
  </body>

 


注册数据控制:

RegistServlet:
public class RegistServlet extends HttpServlet {
 private BusinessServlet s=new BusinessServeltImpl();
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //编码问题
  request.setCharacterEncoding("UTF-8");
  response.setContentType("text/html;charset=UTF-8");
  //数据封装
  RegistServletFormBean formBean=WebUtil.fillBean(request,RegistServletFormBean.class);
  //验证不通过,数据回显
  if(!formBean.validate()){
   request.setAttribute("formBean", formBean);
   request.getRequestDispatcher("/regist.jsp").forward(request, response);
   return;
  }
  //数据填充模型,将formbean中的数据填充到新的user对象
  User user=new User();
  try {
   //注册类型转换器
   ConvertUtils.register(new DateLocaleConverter(), Date.class);
   BeanUtils.copyProperties(user, formBean);
  } catch (Exception e) {
   e.printStackTrace();
  }
    
  try {
   s.regist(user);
   //转向默认主页
   response.setHeader("Refresh", "2;URL="+request.getContextPath());
   response.getWriter().write("注册成功,2秒后转向主页");
  } catch (UserExistException e) {
   formBean.getErrors().put("username", "用户名已经存在");
   request.setAttribute("formBean", formBean);
   request.getRequestDispatcher("/regist.jsp").forward(request, response);
  }
 }
注册数据封装类:
public class RegistServletFormBean {
 private String username;
 private String password;
 private String password2;
 private String email;
 private String birthday;
 private Map<String, String> errors=new HashMap<String, String>();
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public String getBirthday() {
  return birthday;
 }
 public void setBirthday(String birthday) {
  this.birthday = birthday;
 }
 public Map<String, String> getErrors() {
  return errors;
 }
 public void setErrors(Map<String, String> errors) {
  this.errors = errors;
 }
 public String getPassword2() {
  return password2;
 }
 public void setPassword2(String password2) {
  this.password2 = password2;
 }
 public boolean validate(){
  //只要不满足要求的,就像errors中放消息
  
    //用户名必须输入,3~8位字母组成
    if(username==null||username.equals("")){
     errors.put("username", "请求输入用户名");
    }else{
     if(!username.matches("[a-zA-Z]{3,8}")){
      errors.put("username", "用户名必须3至8位字母组成");
     }
    }
    //密码必须输入,3~8位数字组成
    if(password==null||password.equals("")){
     errors.put("password", "请求输入密码");
    }else{
     if(!password.matches("\\d{3,8}")){
      errors.put("password", "密码必须3至8位数字组成");
     }
    }
    
    //重复密码必须和密码一致
    if(!password.equals(password2)){
     errors.put("password2", "两次密码必须一致");
    }
    //邮箱必须输入,且要符合邮箱的格式
    if(email==null||email.equals("")){
     errors.put("email", "请输入邮箱");
    }else{
     if(!email.matches("\\b^['_a-z0-9-\\+]+(\\.['_a-z0-9-\\+]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2}|aero|arpa|asia|biz|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|nato|net|org|pro|tel|travel|xxx)$\\b")){
      errors.put("email", "请输入正确的邮箱");
     }
    }
    //出生日期 必须输入,格式2001-03-18
    if(birthday==null||birthday.equals("")){
     errors.put("birthday", "请输入出生日期");
    }else{
//     DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
     try {
      //转换
      new DateLocaleConverter().convert(birthday);
     } catch (Exception e) {
      errors.put("birthday", "请输出正确的日期");
     }
    }
    
    return errors.isEmpty();
   }

}

登录数据控制:
public class LoginServlet extends HttpServlet {
 private BusinessServlet s=new BusinessServeltImpl();
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //登录
  request.setCharacterEncoding("UTF-8");
  response.setContentType("text/html;charset=UTF-8");
  PrintWriter out=response.getWriter();
  //获取到用户名和密码
  String username=request.getParameter("username");
  String password=request.getParameter("password");
  User user=s.login(username, password);
  if(user==null){
   out.write("用户名或者密码错误,2秒后转向登录页");
   response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp");
  }else{
   out.write("登录成功,2秒后转向主页");
   request.getSession().setAttribute("user", user);
   response.setHeader("Refresh", "2;URL="+request.getContextPath());
  }
 }

注销数据控制:
public class Logout extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  request.setCharacterEncoding("UTF-8");
  response.setContentType("text/html;charset=UTF-8");
  PrintWriter out=response.getWriter();
  request.getSession().removeAttribute("user");
  out.write("注销成功,2秒后转向主页");
  response.setHeader("Refresh", "2;URL="+request.getContextPath());
 }

 


 

© 著作权归作者所有

共有 人打赏支持
day戴
粉丝 0
博文 46
码字总数 42402
作品 0
南汇
程序员
yiyongfei/go-yea

go-yea YEA 使用go-yea前,请先下载yea,并且执行yea/pom.xml mvn clean install -Dmaven.test.skip=true YEA传送门 帮助传送门 概述 YEA是什么 GO-YEA是YEA的一个应用,它是一个极其容易使用...

yiyongfei ⋅ 2017/06/01 ⋅ 0

Action、Dao、Service三层的功能划分

原文地址 Action是管理业务(Service)调度和管理跳转的。 Service是管理具体的功能的。 Action只负责管理,而Service负责实施。 DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态...

木木侠 ⋅ 2017/05/14 ⋅ 0

测试驱动开发的实践经验

测试驱动开发的意义 传统开发方法 传统的开发方法的流程是: 需求分析 -> 设计 -> 编写代码 ->测试 ->回归测试 -> 修改BUG->回顾测试....... ->上线 ->修改BUG。 从整个流程可以看出来传统开...

杨武兵 ⋅ 2014/05/16 ⋅ 0

【2016-02-24】Spring的事务到底该给Dao配置还是给Service配置?

1、至于第一点说的web层事务,暂时没有接触到,需要找些案例了解下~ 2、从我们现有项目上来看,事务是控制在service层的:因为一个完整的业务操作涉及到几个service,它们之间互相调用,一个...

rathan0 ⋅ 2016/02/24 ⋅ 0

Java Web应用的代码分层最佳实践。

代码分层,对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加有利于后期的维护和升级。 从另外一...

⋅ 05/06 ⋅ 0

Java Web学习(六)

功能介绍 登录页面提供一个用户名/密码输入表单,用户填写并提交表单后,服务端检查是否有匹配的用户名/密码。若没有,则返回到登录页面,并给出提示。若匹配,则记录用户的登录日志,更新用...

kakayang2011 ⋅ 2016/03/11 ⋅ 0

JavaWeb18-HTML篇笔记(二)

1.1.1.1 搭建开发环境: 【步骤一】:引入开发jar包 【步骤二】:创建包结构: 【步骤三】:引入工具类和配置文件: 【步骤四】:编写通用的Servlet: 1.1.1.2 用户模块的代码实现: 【创建数据...

我是小谷粒 ⋅ 06/06 ⋅ 0

JSP复习笔记——第11章 JSP 构架和MVC设计模式

11.1 JSP Model I 体系结构 11.2 JSP Model II 体系结构/MVC设计模式 11.3 使用MVC设计模式改写用户注册程序 11.3.1 使用serlvet实现Controller层 11.3.2 使用jsp实现表示层 11.3.3 使用Jav...

暗之幻影 ⋅ 2014/12/18 ⋅ 0

MySQL设计软件登录模块

学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例。 大致实现的功能就是注册于登录还有就是用到了一点,分层思想。仅此而已,所以非常的适合新手...

郭璞 ⋅ 2016/04/22 ⋅ 0

JavaEE软件开发体系架构

前言 上篇文章小编提到了什么是javaEE和它的13个核心规范,本篇文章,小编带您走进JavaEE的体系结构,从两层架构,三层架构,MVC,基于JavaEE架构模式下的MVC,JavaEE的四层架构。 两层架构 ...

weienjun ⋅ 2017/12/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 16分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部