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

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

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());
 }

 


 

转载于:https://my.oschina.net/u/1589656/blog/277414

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值