书城第二阶段——用户注册和登录2

简介: 书城第二阶段——用户注册和登录2

6、编写 UserService和测试

UserService

package com.atguigu.service;
import com.atguigu.pojo.User;
public interface UserService {
    /**
     * 注册用户
     * @param user
     */
    public void registUser(User user);
    /**
     * 登录用户
     * @param user
     * @return 如果返回null,说明登录失败,返回有值,是登录成功
     */
    public User login(User user);
    /**
     * 检查用户名是否可用
     * @param username
     * @return 返回true表示用户名已存在,返回false表示用户名可用
     */
    public boolean existUsername(String username);
}

UserServiceImpl

package com.atguigu.service.impl;
import com.atguigu.dao.UserDao;
import com.atguigu.dao.impl.UserDaoImpl;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
public class UserServiceImpl implements UserService {
    private UserDao userDao=new UserDaoImpl();
    @Override
    public void registUser(User user) {
        userDao.saveUser(user);
    }
    @Override
    public User login(User user) {
        return userDao.queryUserByUsernameAndPassword(user.getUsername(),user.getPassword());
    }
    @Override
    public boolean existUsername(String username) {
        if (userDao.queryUserByUsername(username)==null){
            //等于null,说明没查到,没查到表示可用
            return false;
        }
        return true;
    }
}

UserServiceTest

package com.atguigu.test;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;
import org.junit.Test;
public class UserServiceTest {
    UserService userService =new UserServiceImpl();
    @Test
    public void registUser() {
        userService.registUser(new User(null,"bbj168","666666","bbj168@qq.com"));
        userService.registUser(new User(null,"abc168","666666","abc168@qq.com"));
    }
    @Test
    public void login() {
        System.out.println(userService.login(new User(null,"wzg168","123456",null)));
    }
    @Test
    public void existUsername() {
        if (userService.existUsername("wzg16888")){
            System.out.println("用户名已存在!");
        }else {
            System.out.println("用户名可用!");
        }
    }
}

7、编写web层

7.1 实现用户注册的功能


regist.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>尚硅谷会员注册页面</title>
    <!--写base标签,永远固定相对路径跳转的结果-->
    <base href="http://localhost:8080/book">
    <link type="text/css" rel="stylesheet" href="static/css/style.css">
    <script type="text/javascript" src="static/script/jquery.js"></script>
    <script type="text/javascript">
        //页面加载完成之后
        $(function () {
            //给注册绑定单击事件
            $("#sub_btn").click(function () {
                //验证用户名:必须由字母,数字下划线组成,并且长度为5到12位
                //1获取用户名输入框里的内容
                var usernameText=$("#username").val();
                //2创建正则表达式对象
                var usernamePatt=/^\w{5,12}$/;
                //3使test方法验证
                if(!usernamePatt.test(usernameText)){
                    //4提示用户结果
                    $("span.errorMsg").text("用户名不合法!");
                    return false;
                }
                //验证密码:必须由字母,数字下划线组成,并且长度为5到12位
                //1获取用户名输入框里的内容
                var passwordText=$("#password").val();
                //2创建正则表达式对象
                var passwordPatt=/^\w{5,12}$/;
                //3使test方法验证
                if(!passwordPatt.test(passwordText)){
                    //4提示用户结果
                    $("span.errorMsg").text("密码不合法!");
                    return false;
                }
                //验证确认密码:和密码相同
                //1获取确认密码内容
                var repwdText=$("#repwd").val();
                //2和密码相比较
                if (repwdText!=passwordText){
                    //3提示用户
                    $("span.errorMsg").text("确认密码和密码不一致!");
                    return false;
                }
                //邮箱验证:xxxxx@xxx.com
                //1获取邮箱里的内容
                var emailText=$("#email").val();
                //2创建正则表达式对象
                var emailPatt=/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/;
                //3使test方法验证
                if(!emailPatt.test(emailText)){
                    //4提示用户结果
                    $("span.errorMsg").text("邮箱格式不合法!");
                    return false;
                }
                //验证码现在只需要验证用户已输入。因为还没讲到服务器。验证码生成。
                var codeText=$("#code").val();
                //去掉验证码前后空格
                alert("去空格前["+codeText+"]");
                codeText=$.trim(codeText);
                alert("去空格后["+codeText+"]");
                if (codeText==null||codeText==""){
                    //提示用户结果
                    $("span.errorMsg").text("验证码不能为空");
                    return false;
                }
                $("span.errorMsg").text("");
            });
        });
    </script>
    <style type="text/css">
        .login_form {
            height: 420px;
            margin-top: 25px;
        }
    </style>
</head>
<body>
<div id="login_header">
    <img class="logo_img" alt="" src="static/img/logo.gif">
</div>
<div class="login_banner">
    <div id="l_content">
        <span class="login_word">欢迎注册</span>
    </div>
    <div id="content">
        <div class="login_form">
            <div class="login_box">
                <div class="tit">
                    <h1>注册尚硅谷会员</h1>
                    <span class="errorMsg"></span>
                </div>
                <div class="form">
                    <form action="registServlet" method="post">
                        <label>用户名称:</label>
                        <input class="itxt" type="text" placeholder="请输入用户名"
                               autocomplete="off" tabindex="1" name="username" id="username"/>
                        <br/>
                        <br/>
                        <label>用户密码:</label>
                        <input class="itxt" type="password" placeholder="请输入密码"
                               autocomplete="off" tabindex="1" name="password" id="password"/>
                        <br/>
                        <br/>
                        <label>确认密码:</label>
                        <input class="itxt" type="password" placeholder="确认密码"
                               autocomplete="off" tabindex="1" name="repwd" id="repwd"/>
                        <br/>
                        <br/>
                        <label>电子邮件:</label>
                        <input class="itxt" type="text" placeholder="请输入邮箱地址"
                               autocomplete="off" tabindex="1" name="email" id="email"/>
                        <br/>
                        <br/>
                        <label>验证码:</label>
                        <input class="itxt" type="text" name="code" style="..." id="code"/>
                        <img alt="" src="static/img/code.bmp" style="...">
                        <br/>
                        <br/>
                        <input type="submit" value="注册" id="sub_btn"/>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>

regist_success.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>尚硅谷会员注册页面</title>
    <!--写base标签,永远固定相对路径跳转的结果-->
    <base href="http://localhost:8080/book">
    <link type="text/css" rel="stylesheet" href="static/css/style.css">
    <style type="text/css">
    h1{
        text-align: center;
        margin-top: 200px;
    }
    h1 a {
        color: red;
    }
    </style>
</head>
<body>
    <div id="header">
        <img class="logo_img" alt=""  src="static/img/logo.gif">
        <span class="wel_word"></span>
        <div>
            <span>欢迎<span class="um_span">韩总</span>光临尚硅谷书城</span>
            <a href="../order/order.html">我的订单</a>
            <a href="../../index.html">注销</a>
            <a href="../../index.html">返回</a>
        </div>
    </div>
    <div id="main">
        <h1>注册成功!<a href="../../index.html">转到主页</a></h1>
    </div>
</body>
</html>

RegistServlet

package com.atguigu.web;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegistServlet extends HttpServlet {
    private UserService userService=new UserServiceImpl();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1、获取请求的参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        String code = req.getParameter("code");
//        2、检查验证码是否正确 ===写死,要求验证码为:abcde
        if ("abcde".equalsIgnoreCase(code)){
//          3、检查用户名是否可用
            if (userService.existUsername(username)){
                System.out.println("用户名["+username+"]已存在!");
//              跳回注册页面
                req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);
            }else {
//                          可用  调用Service保存到数据库
                userService.registUser(new User(null,username,password,email));
//                                  跳到注册成功束面regist_success.html
                req.getRequestDispatcher("/pages/user/regist_success.html").forward(req,resp);
            }
        }else {
            System.out.println("验证码["+code+"]错误,");
            req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);
        }
    }
}

在web.xml中配置

<servlet>
        <servlet-name>RegistServlet</servlet-name>
        <servlet-class>com.atguigu.web.RegistServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegistServlet</servlet-name>
        <url-pattern>/registServlet</url-pattern>
    </servlet-mapping>

7.2 IDEA中Debug调试的使用

7.2.1 Debg调试代码,首先需要两个元素;断点+Debug启动服务器

1、断点,只需要在代码需要停的行的左边上单击,就可以添加和取消

2、Debug启动Tomcat运行代码:


7.2.2 测试工具栏:



7.2.3 变量窗口

变量窗口:可以查看当前方法范围内的所有有效的变量。

其他常用调试相关按钮



7.3 用户登录功能的实现


login.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>尚硅谷会员登录页面</title>
    <!--马base标签,永远固定相对路径跳转的结果-->
     <base href= "http://localhost:8080/book/">
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
</head>
<body>
    <div id="login_header">
        <img class="logo_img" alt="" src="static/img/logo.gif" >
    </div>
        <div class="login banner">
            <div id="l_content">
                <span class="login_word">欢迎登录</span>
            </div>
            <div id="content">
                <div class="login_form">
                    <div class="login_box">
                         <div class="tit">
                            <h1>尚硅谷会员</h1>
                             <a href="pages/user/regist.html">立即注册</a>
                         </div>
                        <div class="msg_cont">
                            <b></b>
                            <span class="errorMsg">请输入用户名和密码</span>
                        </div>
                        <div class="form">
                            <form action="loginServlet" method="post">
                                <label>用户名称:</label>
                                <input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username"/>
                                <br/>
                                <br/>
                                <label>用户密码:</label>
                                <input class="itxt" type="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password"/>
                                <br/>
                                <br/>
                                <input type="submit" value="登录" id="sub_btn"/>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
</body>
</html>

login_success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>尚硅谷会员登录</title>
    <style type="text/css">
        h1{
            text-align: center;
            margin-top: 200px;
        }
        h1 a {
            color: red;
        }
    </style>
</head>
<body>
    <div id="main">
        <h1>登录成功!<a href="../../index.html">转到主页</a></h1>
    </div>
</body>
</html>

LoginServlet

package com.atguigu.web;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
    private UserService userService=new UserServiceImpl();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取请求的参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //2、调用XxxService.xxx()处理业务
        User loginUser = userService.login(new User(null, username, password, null));
        //如果等于null,说明登录失败
        if (loginUser==null){
            //   跳回登录页面
            req.getRequestDispatcher("/pages/user/login.html").forward(req,resp);
        }else {
            //    成功
            //    跳到成功页面login_success.html
            req.getRequestDispatcher("/pages/user/login_success.html").forward(req,resp);
        }
    }
}

web.xml中的配置

 <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.atguigu.web.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
相关文章
|
物联网 开发工具
物联网平台实用技巧:设备端检测自己是否在线
基于MQTT接入的设备靠心跳保活,但心跳是周期性的、且自动收发和超时重连,这些特性给主动检测设备端是否在线带来了一定难度。本文提供通过消息收发是否正常判定设备是否在线的原理、流程、实现方式。
4972 1
|
设计模式 数据安全/隐私保护
【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
1240 0
【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
|
存储 人工智能 架构师
ChatGPT 与软件架构 (2) - 基于 Obsidian 和 GPT 实现解决方案架构自动化
ChatGPT 与软件架构 (2) - 基于 Obsidian 和 GPT 实现解决方案架构自动化
459 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的疫情防控自动售货机系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的疫情防控自动售货机系统附带文章源码部署视频讲解等
290 2
|
安全 存储 网络安全
信息安全管理与评估DCST-6000B-Pro神州数码堡垒机沙箱连接教程
信息安全管理与评估DCST-6000B-Pro神州数码堡垒机沙箱连接教程
信息安全管理与评估DCST-6000B-Pro神州数码堡垒机沙箱连接教程
|
前端开发
uniapp 实现退出登录 清除Token
uniapp 实现退出登录 清除Token
472 0
|
人工智能 异构计算
PAI GU系列机型发布,高性价比引领AI应用新潮流
PAI GU系列机型发布,高性价比引领AI应用新潮流 随着人工智能技术的不断发展,AI应用已经渗透到了我们生活的方方面面。为了满足广大用户对于AI应用的多元化需求,我国知名AI平台PAI近期推出了全新的General Unit(简称GU)系列规格,首发GU30系列机型。与PAI传统的实例规格相比,同等性能的实例规格价格优惠近45%,并适配不同复杂程度的模型。这一举措将极大地推动AI技术在各个领域的应用与发展。
554 1
|
网络协议 安全 Linux
如何修复 SSH Client_loop: send disconnect: Broken pipe Error
如何修复 SSH Client_loop: send disconnect: Broken pipe Error
4958 1
|
存储 SQL NoSQL
什么是云数据库?它与传统数据库有什么不同之处?
什么是云数据库?它与传统数据库有什么不同之处?
817 0
为什么注册商标还要申请版权登记?
本文将与您探讨注册商标后申请版权登记的好处
673 0
为什么注册商标还要申请版权登记?