文档章节

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

day戴
 day戴
发布于 2014/06/09 22:04
字数 1971
阅读 2844
收藏 9

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

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
0
Action、Dao、Service三层的功能划分

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

木木侠
2017/05/14
0
0
【2016-02-24】Spring的事务到底该给Dao配置还是给Service配置?

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

rathan0
2016/02/24
146
0
Java Web应用的代码分层最佳实践。

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

05/06
0
0
Java Web学习(六)

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

kakayang2011
2016/03/11
51
0

没有更多内容

加载失败,请刷新页面

加载更多

JVM垃圾回收算法

1、新生代与老年代 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ) 和 老年代 ( Old )。 新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor 和 To Survivor。 Java 中的堆...

初雪之音
29分钟前
1
0
主流的消息队列MQ比较,详解MQ的4类应用场景

目前主流的MQ 1.ZeroMQ 号称最快的消息队列系统,尤其针对大吞吐量的需求场景。 扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发...

游人未归
今天
3
0
React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
今天
4
0
Jenkins使用

clean install -Dmaven.test.skip=true 系统设置 全局工具配置 其他的配置类似 构建项目配置

1713716445
今天
2
0
多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部