A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2019-7-4 09:39 编辑

注册功能分析:
流程图解:
file://C:\Users\Administrator\Desktop\%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE1\img\regist.png?lastModify=1561861248
实现思路:
首先声明:如果熟练功能的思路,则实现功能没有固定流程,可以先写页面,也可以先写后台。
现阶段:我们一般采用从页面出发。先写页面,然后根据请求地址去编写负责响应的Servlet,进而就是Servlet处理业务需要的Service类,最后是Service操作数据库所有需要的Dao类。
1.register.html
注意:由于资料中已经提供html页面编写。我们将不再负责编写页面,我们需要在页面上使用javaScript和Jquery技术来实现前端代码和服务器之间的数据交互。
<script>
    /*
        表单校验:
        1.用户名:单词字符,长度8到20位
        2.密码:单词字符,长度8到20位
        3.email:邮件格式
        4.姓名:非空
        5.手机号:手机号格式
        6.出生日期:非空
        7.验证码:非空
    */

    //校验用户名
    //单词字符,长度8到20位
   
[Java] 纯文本查看 复制代码
 function checkUsername() {
        //1.获取用户名值
        var username = $("#username").val();
        //2.定义正则
        var reg_username = /^\w{8,20}$/;
​
        //3.判断,给出提示信息
        var flag = reg_username.test(username);
        if(flag){
            //用户名合法
            $("#username").css("border","");
        }else{
            //用户名非法,加一个红色边框
            $("#username").css("border","1px solid red");
        }
​
        return flag;
    }
​
    //校验密码
    function checkPassword() {
        //1.获取密码值
        var password = $("#password").val();
        //2.定义正则
        var reg_password = /^\w{8,20}$/;
​
        //3.判断,给出提示信息
        var flag = reg_password.test(password);
        if(flag){
            //密码合法
            $("#password").css("border","");
        }else{
            //密码非法,加一个红色边框
            $("#password").css("border","1px solid red");
        }
​
        return flag;
    }
​
    //校验邮箱
    function checkEmail(){
        //1.获取邮箱
        var email = $("#email").val();
        //2.定义正则        [url=mailto:itcast@163.com]itcast@163.com[/url]
        var reg_email = /^\w+@\w+\.\w+$/;
​
        //3.判断
        var flag = reg_email.test(email);
        if(flag){
            $("#email").css("border","");
        }else{
            $("#email").css("border","1px solid red");
        }
​
        return flag;
    }
​
    $(function () {
        //当表单提交时,调用所有的校验方法
        $("#registerForm").submit(function(){
            //1.发送数据到服务器
            if(checkUsername() && checkPassword() && checkEmail()){
                //校验通过,发送ajax请求,
                //$(this).serialize(): jquery的方法。把表单项序列化成提交的数据格式。
                // 提交表单的数据   username=zhangsan&password=123
                $.post("user/regist",$(this).serialize(),function(data){
                    //处理服务器响应的数据  data  {flag:true,errorMsg:"注册失败"}
                    if(data.flag){
                        //注册成功,跳转成功页面
                        location.href="register_ok.html";
                    }else{
                        //注册失败,给errorMsg添加提示信息
                        $("#errorMsg").html(data.errorMsg);
                    }
                });
            }
            //2.不让页面跳转
            return false;
            //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
        });
​
        //当某一个组件失去焦点是,调用对应的校验方法
        $("#username").blur(checkUsername);
        $("#password").blur(checkPassword);
        $("#email").blur(checkEmail);
    });
    
</script>

2.RegistUserServlet
编写思路(必读):
1.由于存在验证码的校验,因此首先获取页面传递过来的验证码数据。
2.判断验证码是否正确。验证码不正确就直接返回数据:”验证码错误“使用json格式返回。
3.验证码通过后再次获取页面提交的其它注册信息,然后交个service去完成注册业务。
4.根据service返回的boolean值来判断注册是否成功。然后根据成功与否来响应信息给页面。
[Java] 纯文本查看 复制代码
@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
​
        //验证校验
        String check = request.getParameter("check");
        //从sesion中获取验证码
        HttpSession session = request.getSession();
        String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
        session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
        //比较
        if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
            //验证码错误
            ResultInfo info = new ResultInfo();
            //注册失败
            info.setFlag(false);
            info.setErrorMsg("验证码错误");
            //将info对象序列化为json
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(info);
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);
            return;
        }
​
        //1.获取数据
        Map<String, String[]> map = request.getParameterMap();
​
        //2.封装对象
        User user = new User();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
​
        //3.调用service完成注册
        UserService service = new UserServiceImpl();
        boolean flag = service.regist(user);
        ResultInfo info = new ResultInfo();
        //4.响应结果
        if(flag){
            //注册成功
            info.setFlag(true);
        }else{
            //注册失败
            info.setFlag(false);
            info.setErrorMsg("注册失败!");
        }
​
        //将info对象序列化为json
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(info);
​
        //将json数据写回客户端
        //设置content-type
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(json);
    }

}3.UserServiceImpl
编写思路:(必读)
1.servlet调用了我的方法regist(User user)让我来帮他处理注册的业务。此时我能得到的数据资源就是通过参数传递过来的User对象。对象中就有页面提交过来的注册用户的信息。
2.我需要根据注册信息的用户名来查询数据库中是否有重名的用户。如果有就直接返回注册失败。
3.如果查不到重名的用户,我就调用dao的保存用户方法。将用户信息保存到数据库。至此完成注册功能。
[Java] 纯文本查看 复制代码
public class UserServiceImpl implements UserService {
​
    //用户操作数据库的dao实现类对象
    private UserDao userDao = new UserDaoImpl();
   
    //注册用户方法
    @Override
    public boolean regist(User user) {
        //1.根据用户名查询用户对象
        User u = userDao.findByUsername(user.getUsername());
        //判断u是否为null
        if(u != null){
            //用户名存在,注册失败
            return false;
        }
        //用户不存在可以去注册用户了。保存用户信息到数据库。
        userDao.save(user);
        return true;
    }
}

4.UserDaoImpl
编写思路:(必读)
1.service业务层要想跟数据库打交道,需要调用Dao层的代码。因此Dao实现类的作用就是专门负责操作数据库,所以dao中一般写的都是操作数据库的增删改查方法。尽量不涉及业务逻辑,这样可以得到不同业务层的复用。

[Java] 纯文本查看 复制代码
public class UserDaoImpl implements UserDao {
​
    //用户操作数据库的工具类对象:JdbcTemplate: 该类封装了jdbc的增删改查原始操作。
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
​
    //根据用户名查询用户的方法。
    @Override
    public User findByUsername(String username) {
        User user = null;
        try {
            //1.定义sql
            String sql = "select * from tab_user where username = ?";
            //2.执行sql
            user = template.queryForObject(sql, new BeanPropertyRowMapper<User>                     (User.class), username);                 
        } catch (Exception e) {
           //这里无须打印日志,因为整个异常是因为查不到数据抛出的。不算是程序错误。
        }
        return user;
    }
​
    //保存用户的方法
    @Override
    public void save(User user) {
        //1.定义sql
        String sql = "insert into                                                               tab_user(username,password,name,birthday,sex,telephone,email,status,code)               values(?,?,?,?,?,?,?,?,?)";
        
        //2.执行sql
        template.update(sql,user.getUsername(),
                    user.getPassword(),
                user.getName(),
                user.getBirthday(),
                user.getSex(),
                user.getTelephone(),
                user.getEmail(),
                user.getStatus(),
                user.getCode()
                );
    }
​
}


1 个回复

倒序浏览
楼主很棒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马