账号注册、登录、注销---网上商城Web

前面我说过会以业务的形式去分析网上商城这个Web项目,那么今天我以第一个业务作为该系列的开头。事实上我们从名字上可以看到这事实上是三个业务,但是它们相关性大,我将这些三个业务归拢为一个业务


1. 账号注册
注册账号事实上就是在数据库上添加一个User记录,重要的是如何涉及User表。

create table user
(
    uid       varchar(50) not null
        primary key,
    username  varchar(20) not null,
    password  varchar(20) null,
    name      varchar(20) null,
    email     varchar(30) null,
    telephone varchar(20) null,
    birthday  varchar(20) null,
    sex       varchar(10) null,
    state     int         null,
    code      varchar(64) null
)
    charset = utf8;

这些字段根据它们的名字其实很容易找到它们的意思,需要特别注意state这个字段表示是这个账号是否激活

所以我们需要封装一个与User表一致的实体类,类的属性就是User中的字段

import java.util.Date;

public class User {

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

    private String username;
    private String password;
//    ---
    private String uid;
    private String name;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    private String email;
    private String telephone;
    private Date birthday;
    private String sex;
    private int state;//是否激活
    private String code;//验证码

}

前端register.jsp把form表单提交后台
在这里插入图片描述
注册页面register.jsp

获取到提交的表单数据

//获得表单数据
Map<String, String[]> parameterMap = request.getParameterMap();

把获取到数据封装到User类中,需要注意的时间这个字段需要由String转成Date

User user = new User();
        try {
            //String转Date
            ConvertUtils.register(new Converter() {
                @Override
                public Object convert(Class aClass, Object value) {
                    //将string转成Date
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    Date parse =null;
                    try {
                        parse = format.parse(value.toString());
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    return parse;
                }
            }, Date.class);
            //映射封装
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
//        private String uid;
        user.setUid(CommonsUtils.getUid());
//        private String telephone;
        user.setTelephone(CommonsUtils.getTelephone());
//        private int state;//是否激活
        user.setState(0);
//        private String code;//验证码
//        user.setCode(CommonsUtils.getUid());
        String activeCode = CommonsUtils.getUid();
        user.setCode(activeCode);

此时我们已经封装好了需要添加的User数据记录,接下来把封装好的数据传到Service层
(该项目也是三层架构模型,servlet层–service层–dao层)

  • servlet层:表示层,处理请求与响应
  • service层:业务逻辑层,接收表示层传来的参数,并把参数提交到数据访问层
  • dao层:数据访问层,与数据库进行交互
  //将user传递给service层
 UserService service = new UserService();
boolean isRegisterSuccess=service.register(user);

接收servlet层传来的参数,并把参数提交到dao层
(返回值是由dao层传来的,service层需要再把数据传回给servlet层,再由servlet层决定)

    public boolean register(User user) {
        UserDao dao = new UserDao();
        int row = 0;
        try {
            row = dao.register(user);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  row>0?true:false;
    }

dao层接收参数,并与数据库交互

public int register(User user) throws SQLException{
        QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
        int update=runner.update(sql,user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode());
        return update;
    }

返回了update,update表示数据库更新记录条数。如果注册成功,则更新一条记录,把update传回给service层,service层判断后回传给servlet层

在servlet层判断是否注册成功

//判断是否注册成功
        if(isRegisterSuccess){
            //注册成功
            //发送激活邮件
            String message = "注册成功,注意激活!"+ "<a>链接</a>"
                    + "http://localhost:8080/MallWeb_war_exploded/active?activeCode="+activeCode;
            try {
                MailUtils.sendMail(user.getEmail(),message);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
            //重定向
            response.sendRedirect(request.getContextPath()+"/registerSuccess.jsp");
        }
        else {
            //注册失败
            response.sendRedirect(request.getContextPath()+"/registerFail.jsp");
        }

其中MailUtils是注册发送邮件,可参考我的另外一篇文章

2. 账号登录
把注册的账号信息登录到网站上
在这里插入图片描述
我们这里先不讲自动登录,后面会以一个专门的业务点去讲

获取账号密码

HttpSession session = request.getSession();
String username = request.getParameter("username"); //得到jsp页面传过来的参数
 String password = request.getParameter("password");

传到service层

UserService service = new UserService();
user = service.login(username,password);

service层处理传过来的账号密码,并提交到dao层

 public LoginUser login(String username, String password) throws SQLException{
        UserDao dao = new UserDao();
        return dao.login(username,password);
    }

dao层交互数据库

    public LoginUser login(String username, String password) throws SQLException{
        QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from user where username =? and password =?";
//        return runner.query(sql,new BeanHandler<User>(User.class),username,password);
        return runner.query(sql,new BeanHandler<LoginUser>(LoginUser.class),username,password);
    }

dao层把登录的信息回传给service层,service层再把数据回传给servlet层。由servlet层去判断数据库中是否存在该用户,存在则把用户信息保存到session中,不存在给予提示

servlet层判断

if(user!=null){
			session.setAttribute("user",user);
            session.setAttribute("cartuser",newUser);
            //重定向
            response.sendRedirect(request.getContextPath());
            }
        else {
            //登录失败,转发到登录页面
            request.setAttribute("logininfo","用户名或密码失败");
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }

3. 账号注销
账号注销实在就是账号退出登录,就是把session域中user对象删除掉
在这里插入图片描述
这块直接在servlet层就可以处理

HttpSession session = request.getSession();
session.removeAttribute("user");

转发到登录页面

request.setAttribute("logininfo", "重新登录");
request.getRequestDispatcher("login.jsp").forward(request, response);

代码地址,记得给我点上小星星

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值