zoukankan      html  css  js  c++  java
  • 网上图书商城项目学习笔记-007登录功能实现

    一、功能流程分析

    二、代码

    1.view层

    1)login.jsp

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
     3 
     4 
     5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     6 <html>
     7   <head>
     8     
     9     <title>登录</title>
    10     
    11     <meta http-equiv="pragma" content="no-cache">
    12     <meta http-equiv="cache-control" content="no-cache">
    13     <meta http-equiv="expires" content="0">    
    14     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    15     <meta http-equiv="description" content="This is my page">
    16     <meta http-equiv="content-type" content="text/html;charset=utf-8">
    17     <!--
    18     <link rel="stylesheet" type="text/css" href="styles.css">
    19     -->
    20     <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/user/login.css'/>">
    21     <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>
    22     <script type="text/javascript" src="<c:url value='/jsps/js/user/login.js'/>"></script>
    23     <script src="<c:url value='/js/common.js'/>"></script>
    24     <script>
    25       $(function(){/*Map<String(Cookie名称),Cookie(Cookie本身)>*/
    26           var loginname = "${requestScope.user.loginname}" ? "${requestScope.user.loginname}" : window.decodeURI("${cookie.loginname.value}");
    27           $("#loginname").val(loginname);
    28       });
    29     </script>
    30   </head>
    31   
    32   <body>
    33     <div class="main">
    34       <div><img src="<c:url value='/images/logo.gif'/>" /></div>
    35       <div>
    36         <div class="imageDiv"><img class="img" src="<c:url value='/images/zj.png'/>"/></div>
    37         <div class="login1">
    38           <div class="login2">
    39             <div class="loginTopDiv">
    40               <span class="loginTop">会员登录</span>
    41               <span>
    42                 <a href="<c:url value='/jsps/user/regist.jsp'/>" class="registBtn"></a>
    43               </span>
    44             </div>
    45             <div>
    46               <form target="_top" action="<c:url value='/UserServlet'/>" method="post" id="loginForm">
    47                 <input type="hidden" name="method" value="login" />
    48                   <table>
    49                     <tr>
    50                       <td width="50"></td>
    51                       <td><label class="error" id="msg">${msg }</label></td>
    52                     </tr>
    53                     <tr>
    54                       <td width="50">用户名</td>
    55                       <td><input class="input" type="text" name="loginname" id="loginname" /></td>
    56                     </tr>
    57                     <tr>
    58                       <td height="20">&nbsp;</td>
    59                       <td><label id="loginnameError" class="error">${errors.loginname }</label></td>
    60                     </tr>
    61                     <tr>
    62                       <td>密 码</td>
    63                       <td><input class="input" type="password" name="loginpass" id="loginpass" value="${user.loginpass }"/></td>
    64                     </tr>
    65                     <tr>
    66                       <td height="20">&nbsp;</td>
    67                       <td><label id="loginpassError" class="error">${errors.loginpass }</label></td>
    68                     </tr>
    69                     <tr>
    70                       <td>验证码</td>
    71                       <td>
    72                         <input class="input yzm" type="text" name="verifyCode" id="verifyCode" value="${user.verifyCode }"/>
    73                         <img id="vCode" src="<c:url value='/VerifyCodeServlet'/>"/>
    74                         <a id="verifyCode" href="javascript:_change()">换张图</a>
    75                       </td>
    76                     </tr>
    77                     <tr>
    78                       <td height="20px">&nbsp;</td>
    79                       <td><label id="verifyCodeError" class="error">${errors.verifyCode }</label></td>
    80                     </tr>
    81                     <tr>
    82                       <td>&nbsp;</td>
    83                       <td align="left">
    84                         <input type="image" id="submit" src="<c:url value='/images/login1.jpg'/>" class="loginBtn"/>
    85                       </td>
    86                     </tr>                                                                                
    87                  </table>
    88               </form>
    89             </div>
    90           </div>
    91         </div>
    92       </div>
    93     </div>
    94   </body>
    95 </html>
    96     

    2)login.js

      1 $(function() {
      2     /*
      3      * 1. 让登录按钮在得到和失去焦点时切换图片
      4      */
      5     $("#submit").hover(
      6         function() {
      7             $("#submit").attr("src", "/goods/images/login2.jpg");
      8         },
      9         function() {
     10             $("#submit").attr("src", "/goods/images/login1.jpg");
     11         }
     12     );
     13     
     14     /*
     15      * 2. 给注册按钮添加submit()事件,完成表单校验
     16      */
     17     $("#loginForm").submit(function(){
     18         $("#msg").text("");
     19         var bool = true;
     20         $(".input").each(function() {
     21             var inputName = $(this).attr("name");
     22             if(!invokeValidateFunction(inputName)) {
     23                 bool = false;
     24             }
     25         });
     26         return bool;
     27     });
     28     
     29     /*
     30      * 3. 输入框得到焦点时隐藏错误信息
     31      */
     32     $(".input").focus(function() {
     33         var inputName = $(this).attr("name");
     34         $("#" + inputName + "Error").css("display", "none");
     35     });
     36     
     37     /*
     38      * 4. 输入框推动焦点时进行校验
     39      */
     40     $(".input").blur(function() {
     41         var inputName = $(this).attr("name");
     42         invokeValidateFunction(inputName);
     43     })
     44 });
     45 
     46 /*
     47  * 输入input名称,调用对应的validate方法。
     48  * 例如input名称为:loginname,那么调用validateLoginname()方法。
     49  */
     50 function invokeValidateFunction(inputName) {
     51     inputName = inputName.substring(0, 1).toUpperCase() + inputName.substring(1);
     52     var functionName = "validate" + inputName;
     53     return eval(functionName + "()");    
     54 }
     55 
     56 /*
     57  * 校验登录名
     58  */
     59 function validateLoginname() {
     60     var bool = true;
     61     $("#loginnameError").css("display", "none");
     62     var value = $("#loginname").val();
     63     if(!value) {// 非空校验
     64         $("#loginnameError").css("display", "");
     65         $("#loginnameError").text("用户名不能为空!");
     66         bool = false;
     67     } else if(value.length < 3 || value.length > 20) {//长度校验
     68         $("#loginnameError").css("display", "");
     69         $("#loginnameError").text("用户名长度必须在3 ~ 20之间!");
     70         bool = false;
     71     }
     72     return bool;
     73 }
     74 
     75 /*
     76  * 校验密码
     77  */
     78 function validateLoginpass() {
     79     var bool = true;
     80     $("#loginpassError").css("display", "none");
     81     var value = $("#loginpass").val();
     82     if(!value) {// 非空校验
     83         $("#loginpassError").css("display", "");
     84         $("#loginpassError").text("密码不能为空!");
     85         bool = false;
     86     } else if(value.length < 3 || value.length > 20) {//长度校验
     87         $("#loginpassError").css("display", "");
     88         $("#loginpassError").text("密码长度必须在3 ~ 20之间!");
     89         bool = false;
     90     }
     91     return bool;
     92 }
     93 
     94 /*
     95  * 校验验证码
     96  */
     97 function validateVerifyCode() {
     98     var bool = true;
     99     $("#verifyCodeError").css("display", "none");
    100     var value = $("#verifyCode").val();
    101     if(!value) {//非空校验
    102         $("#verifyCodeError").css("display", "");
    103         $("#verifyCodeError").text("验证码不能为空!");
    104         bool = false;
    105     } else if(value.length != 4) {//长度不为4就是错误的
    106         $("#verifyCodeError").css("display", "");
    107         $("#verifyCodeError").text("错误的验证码!");
    108         bool = false;
    109     } else {//验证码是否正确
    110         $.ajax({
    111             cache: false,
    112             async: false,
    113             type: "POST",
    114             dataType: "json",
    115             data: {method: "validateVerifyCode", verifyCode: value},
    116             url: "/goods/UserServlet",
    117             success: function(flag) {
    118                 if(!flag) {
    119                     $("#verifyCodeError").css("display", "");
    120                     $("#verifyCodeError").text("错误的验证码!");
    121                     bool = false;                    
    122                 }
    123             }
    124         });
    125     }
    126     return bool;
    127 }

    2.servlet层

    1)UserServlet.java

     1 public String login(HttpServletRequest request, HttpServletResponse response) throws IOException {
     2         /*
     3          * 1. 封装表单数据到User
     4          * 2. 校验表单数据
     5          * 3. 使用service查询,得到User
     6          * 4. 查看用户是否存在,如果不存在:
     7          *   * 保存错误信息:用户名或密码错误
     8          *   * 保存用户数据:为了回显
     9          *   * 转发到login.jsp
    10          * 5. 如果存在,查看状态,如果状态为false:
    11          *   * 保存错误信息:您没有激活
    12          *   * 保存表单数据:为了回显
    13          *   * 转发到login.jsp
    14          * 6. 登录成功:
    15          *   * 保存当前查询出的user到session中
    16          *   * 保存当前用户的名称到cookie中,注意中文需要编码处理。
    17          */
    18         
    19         // 1. 封装表单数据到user
    20         User formUser = CommonUtils.toBean(request.getParameterMap(), User.class);
    21         
    22         // 2. 校验
    23         Map<String, String> errors = validateLogin(formUser, request.getSession());
    24         if(errors.size() > 0) {
    25             request.setAttribute("errors", errors);
    26             request.setAttribute("user", formUser);
    27             return "f:/jsps/user/login.jsp";
    28         }
    29         
    30         // 3. 调用userService#login()方法
    31         User user = userService.login(formUser);
    32         
    33         //  4. 开始判断
    34         if(user == null) {
    35             request.setAttribute("msg", "用户名或密码错误!");
    36             request.setAttribute("user", formUser);
    37             return "f:/jsps/user/login.jsp";
    38         }
    39         if(!user.isStatus()) {
    40             request.setAttribute("msg", "您还没有激活!");
    41             request.setAttribute("user", formUser);
    42             return "f:/jsps/user/login.jsp";    
    43         }
    44         // 保存用户到session
    45         request.getSession().setAttribute("sessionUser", user);
    46         // 获取用户名保存到cookie中
    47         String loginname = URLEncoder.encode(user.getLoginname(), "utf-8");
    48         Cookie cookie = new Cookie("loginname", loginname);
    49         cookie.setMaxAge(24 * 60 * 60 * 10);//保存10天
    50         response.addCookie(cookie);
    51         return "r:/index.jsp";
    52     }
    53 
    54     /**
    55      * 登录校验方法,内容待完成
    56      * @param formUser
    57      * @param session
    58      * @return
    59      */
    60     private Map<String, String> validateLogin(User formUser, HttpSession session) {
    61         Map<String, String> errors = new HashMap<String, String>();
    62         // 1. 校验登录名
    63         String loginname = formUser.getLoginname();
    64         if(loginname == null || loginname.trim().isEmpty()) {
    65             errors.put("loginname", "用户名不能为空!");
    66         } else if(loginname.length() < 3 || loginname.length() > 20) {
    67             errors.put("loginname", "用户名长度必须在3~20之间!");
    68         } 
    69         
    70         // 2. 校验登录密码
    71         String loginpass = formUser.getLoginpass();
    72         if(loginpass == null || loginpass.trim().isEmpty()) 
    73             errors.put("loginpass", "密码不能为空!");
    74         else if(loginpass.length() < 3 || loginpass.length() > 20)
    75             errors.put("loginpass", "密码长度必须在3~20之间!");
    76         
    77         // 3. 验证码校验
    78         String verifyCode = formUser.getVerifyCode();
    79         String vCode = (String) session.getAttribute("vCode");
    80         if(verifyCode == null || verifyCode.trim().isEmpty()) {
    81             errors.put("verifyCode", "验证码不能为空!");
    82         } else if(!verifyCode.equalsIgnoreCase(vCode)) {
    83             errors.put("verifyCode", "验证码错误!");
    84         }
    85         
    86         return errors;
    87     }

    3.service层

    1)userService.java

     1     /**
     2      * 登录功能
     3      * @param user
     4      * @return
     5      */
     6     public User login(User user) {
     7         try {
     8             return userDao.findByLoginnameAndLoginpass(user.getLoginname(), user.getLoginpass());
     9         } catch (SQLException e) {
    10             throw new RuntimeException(e);
    11         }
    12     }

    4.dao层

    1)UserDao.java

     1     /**
     2      * 按用户名和密码查询
     3      * @param loginname
     4      * @param loginpass
     5      * @return
     6      * @throws SQLException
     7      */
     8     public User findByLoginnameAndLoginpass(String loginname, String loginpass) throws SQLException {
     9         String sql = "select * from t_user where loginname=? and loginpass=?";
    10         return qr.query(sql, new BeanHandler<User>(User.class), loginname, loginpass);
    11     }
  • 相关阅读:
    html/form表单常用属性认识
    css复杂动画(animation属性)
    css样式水平居中和垂直居中的方法
    css简单动画(transition属性)
    html/css中map和area的应用
    html/css弹性布局的几大常用属性详解
    webpack优化配置
    webpack配置详解
    使用Node.js搭建一个简单的web服务器(二):搭建一个简单的服务器
    使用Node.js搭建一个简单的web服务器(一):Node.js入门
  • 原文地址:https://www.cnblogs.com/shamgod/p/5159750.html
Copyright © 2011-2022 走看看