YangMVC教程-如何实现用户登录

登录逻辑

为了实现登陆功能,应当弄清楚一下问题:其一,用户如何将他的用户名和密码提供给系统。其二,系统如何接受用户发来的信息。其三,如何通过数据库查询进行账户的验证。其四,如何使得系统记住登陆状态。其五,登陆后如何获取当前登陆用户的信息。下面将逐一解决上述问题。

  • 其一,对于Web应用,一般使用一个表单(Form)收集用户的信息。在用户访问登陆网页时,提供一个表单给用户,允许用户输入用户名和密码,这个表单还包含一个提交按钮。用户点击提交按钮时,信息就会自动的发送给标签的action属性指定的网页中。提交方式由的method属性决定,一般为Post方式。

  • 其二,用户发来Post请求后,JSP页面可以通过request.getParameter函数获取表单的值。该函数要求一个参数,这个参数就是表单中标签的name属性制定的。对于YangMVC来说,使用param、paramInt等函数都可以获取参数。

  • 其三,YangMVC通过Model和DBTool可以方便的进行数据库查询。首先在用户表中查找与用户名相匹配的记录,如果找不到说明用户名不存在。如果找到了,匹配用户在表单中传来的密码和数据库中的密码是否一致。如果一致说明登陆成功,否则说明密码失败。

  • 其四,在Web应用中,通常使用Session来存储登陆信息。Session相当于一个Map,可以向其中放入一个映射如 session.setAttribute(“uid”,”3333”); 这条语句在session中存储了用户id为3333。以此记录用户信息。

  • 其五,在上述例子中,uid这个session中的键值对在程序中只有登陆成功时才会写入,也就是说,如果没登陆则这个值应不存在或为null。那么判断这个值是否为空就可以判断出用户是否登录。如果登陆了,因为session中存储了用户的id,这样就可以通过查询数据库的方式获取该用户所有信息。在页面上显示一个登陆用户的用户名就是个很简单的问题了。

解决完上述五个问题,登陆就很容易实现了。

登陆表单

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
    <title>登陆</title>
    <meta charset='utf-8' />
    <style type="text/css">
        html,body{
            width:100%;
            height:100%;
            margin:0px;
            padding:0px;
        }
        body{
            display: flex;
            justify-content:center;
            align-items:center;
        }
        .box{
            width:400px;
            height:300px;
            display:flex;
            flex-direction:column;
            align-items:center;
        }
        .txt{
            display: block;
            width:400px;
            height:60px;
            margin:0px;
            border: 2px solid #8AC007;
            margin-bottom: 10px;
            border-radius:10px;
            padding-left: 10px;
            font-size:20px;
            color:green;
        }
        .sb{
            display: block;
            width:100%;
            height:60px;
            margin:0px;
            border-radius:10px;
            font-size:30px;
        }
        .title{
            font-size:40px;
        }
    </style>
</head>
<body>
<div class='box'>
    <div class='title'>登陆</div>
<div>${msg}</div>
    <form action="" method="post">
        <input class='txt' type='text' placeholder="用户名" name="usr" value="${usr }">
        <input class='txt' type='password' placeholder="密码" 
         name="pwd"  value="${pwd }">
        <input class='sb' type='submit' value="确定">     
    </form>
</div>
</body>
</html>

在org.demo中建立UsrController类,内容如下。

package org.demo;
import org.docshare.mvc.Controller;
public class UsrController extends Controller {
    public void login(){
        render();
    }
}

数据库的用户表

数据库是以实体(或称对象)来划分数据表的,不是以动作划分的。所以,不应有什么注册表、登录表等表格。用户的登陆、注册、修改个人信息、修改密码、取回密码等操作都应当是针对用户表的。在mvc_demo这个数据库中加入用户表,该表创建语句如下:

CREATE TABLE `usr` (
  `id` int(11) NOT NULL auto_increment,
  `uname` varchar(50) default NULL,
  `pwd` varchar(50) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

该表有三个字段,分别为自动增长的主键id,字符串类型的用户名pwd,字符串类型的密码。真正项目中用户表会有很多其他字段,诸如生日、所在地、性别等信息,但这些信息都和登陆无关,所以这里做了简化处理,用户可以自行添加需要的字段。

随后,添加若干条记录。
为了加速查询,可以为uname字段建立索引。

ALTER TABLE `usr`
ADD INDEX `uname` (`uname`);

至此数据库准备完毕。

提交处理

因为表单中action为空,那么就要用登陆页面同URL的页面来处理请求。如上述页面的访问地址是 http://localhost:8080/usr/login ,所以仍然提交给这个页面。整个登陆过程是两次请求和响应。第一次是Get请求,服务器响应为一个登陆表单,第二次是用户点击登录按钮触发,浏览器发出了Post请求,服务器收到该请求后,处理登陆并返回结果。
在本例中,使用UsrController的login方法来处理这两个不同功能的请求,那么就要进行区分。YangMVC提供了一个isPost方法判断是否为Post请求,如果是则返回真,否则返回假。那么将login代码改为:


package org.demo;

import java.util.List;

import org.docshare.mvc.Controller;
import org.docshare.orm.DBTool;
import org.docshare.orm.Model;

public class UsrController extends Controller {
    public void login(){
        if(isPost()){
            DBTool tool = Model.tool("usr");
            String uname = param("usr");
            String pwd = param("pwd");
            List<Model> list = tool.all().eq("uname", uname)
.toArrayList();
            if(list.size() == 0){
                put("usr", uname);
                put("pwd", pwd);
                put("msg","用户名不存在");
            }else{
                Model model = list.get(0);
                if(pwd!=null && pwd.equals(model.get("pwd"))){
                    //succ
                    sess("uid",""+model.get("id"));
                    jump("home");
                    return;
                }else{
                    put("usr", uname);
                    put("pwd", "");
                    put("msg","密码不正确");
                }
            }
        }
        render();
    }
    public void home(){
        output("this is homepage ,todo");
    }
}

首先使用param获取表单中的用户名和密码,使用DBTool查询数据库中用户名为相应用户名的记录,如果不存在则使用put函数将“用户不存在”这个消息加入request域。这个分支随后会执行render函数。 如果存在该用户,则进行密码匹配,如果匹配则使用sess函数将该用户的主键id写入Session,并跳转到当前目录的home页。需要注意的是,下面有一个return语句,表示直接退出程序。如果没有这一句,会继续执行render函数,这样就会引发错误。 如果密码不匹配,则将该字符串put到request域。在jsp中,${msg}将输出这个信息,用户停留在登陆页上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值