服务器搭建:servlet+dao+javabean+jsp实现简单的用户登录(二)

上一篇我们谈到把用户登录时用的登录名输出到控制台,但是并没有对用户的合法性进行验证,下面我们将把程序链接到数据库,然后再数据库里面查询是否有这个用户,然后再判断是否让这个用户登录。

java链接数据库的jar包和servelt的包已经在上篇文章中给大家了,大家也可以自行到官网中下载。

在开始下面的阅读之前,请先自行安装配置好mysql。如果之前对mysql不了解可以先到这个网站去学习一下。http://www.runoob.com/mysql/mysql-tutorial.html

(一):建立用户信息数据表

下面是我建的数据库和里面的几条数据:
我新建的数据库名称是learn,表的名称是t_learn_user.大家可以自行命名。
这里写图片描述

(二):构建servlet+dao+javabean的框架

在java源文件里我们新建以下几个包,建好的包如图所示:
这里写图片描述

(三):填充具体内容
在data包里面新建User持久化类,这是用户数据类,类的内容和数据库里面用户数据表的内容是一一相对的。
User.java源码:

package com.xue.database.data;

import java.io.Serializable;

/**
 * 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
 * 持久化的主要应用是将内存中的对象存储在关系型的数据库中,
 * 当然也可以存储在磁盘文件中、XML数据文件中等等
 *
 */
public class User implements Serializable{

    /**
     * User里面的内容是和数据库表的列相对应的
     */
    private int userId;
    private String userName;
    private String userPassword;
    private String userRole;//用户角色信息
    private String userEmail;
    private String userPhone;

    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    public String getUserRole() {
        return userRole;
    }
    public void setUserRole(String userRole) {
        this.userRole = userRole;
    }
    public String getUserEmail() {
        return userEmail;
    }
    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }
    public String getUserPhone() {
        return userPhone;
    }
    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }
}

我们的用户数据类已经建立好了,下面开始建立数据库链接类。
在dao下面创建一个名称为DataSource.java的文件。这个文件的作用的打开数据库,并返回数据库连接

DataSource.java源码:

package com.xue.database.dao;

import java.sql.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class DataSource {

    private static String url = "jdbc:mysql://localhost:3306/learn";  //连接路径
    private static String user = "root"; //用户名
    private static String password = "zxj341204"; //密码

    /**
     * 打开并返回数据库连接
     */
    public static Connection getConnection() {
        try {
            //创建Mysql数据源对象
            MysqlDataSource dataSource = new MysqlDataSource();
            //设置连接属性
            dataSource.setUrl(url);
            dataSource.setUser(user);
            dataSource.setPassword(password);
            //打开并返回连接
            return dataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

数据库连接类已经建立好了,但是如果我们想用数据库里面的数据,还需要建立数据库连接类。下面我们现在dao下面建立数据库服务类的接口UserDaoService.java

UserDaoService.java源码:

package com.xue.database.dao;

import com.xue.database.data.User;

/**
 * 我们可以在这个接口里面定义数据库的增删查改函数原型,
 * 现在我只是定义了用户的登录验证所用的函数
 *
 */
public interface UserDaoService {

    /**
     * 根据用户的昵称和密码查询用户
     * @param userName
     * @param userPassword
     * @return
     * @throws Exception
     */
    public User check(String userName,String userPassword) throws Exception;

}

定义过服务类的接口,下面我们将要具体把它实现。在dao下面新建包,命名为impl。我们在impl新建一个具体服务类:UserDaoServer.java

UserDaoServer.java源码

package com.xue.database.dao.impl;

import java.sql.ResultSet;
import java.sql.Statement;

import com.mysql.jdbc.Connection;
import com.xue.database.dao.DataSource;
import com.xue.database.dao.UserDaoService;
import com.xue.database.data.User;

public class UserDaoServer implements UserDaoService{

    /**
     * 在这里我们写出具体是怎么查询
     */
    @Override
    public User check(String userName, String userPassword) throws Exception {
        // TODO Auto-generated method stub
        Connection conn = (Connection) DataSource.getConnection();//取得数据库链接
        Statement stm = conn.createStatement();//创建数据库操作的语句对象

        //查询数据库返回结果集
        ResultSet rs = stm.executeQuery("select * from t_learn_user"
                + " where user_name='"+userName+"' and user_password='"+userPassword+"'");

        User user = null;
        //遍历结果集,封装用户数据
        if(rs.next()) {
            //创建用户对象
            user = new User();
            //设置用户的属性值
            user.setUserId(rs.getInt("user_id"));
            user.setUserName(rs.getString("user_name"));
            user.setUserPassword(rs.getString("user_password"));
            user.setUserRole(rs.getString("user_role"));
            user.setUserEmail(rs.getString("user_email"));
            user.setUserPhone(rs.getString("user_telphone"));
        }
        //关闭连接
        conn.close();
        return user;//如果没有查询到此用户,那么将返回空指针
    }

}

servlet+dao+javabean+jsp架构是客户端提交数据给servlet,servlet把提交的内容转发给javabean,javabean进行与数据库的具体交互工作。下面开始写javabean

在service包下新建java接口类:LoginService.java

LoginService.java源码:

package com.xue.service;

import javax.servlet.http.HttpServletRequest;

public interface LoginService {

    //调用数据库服务类,具体查询
    public String login(HttpServletRequest request) throws Exception;

}

在service包下新建impl包,里面是服务接口的具体实现,然后再impl包里面新建LoginServer.java.

LoginServer.java源码

package com.xue.service.impl;

import javax.servlet.http.HttpServletRequest;
import com.xue.database.dao.UserDaoService;
import com.xue.database.dao.impl.UserDaoServer;
import com.xue.database.data.User;
import com.xue.service.LoginService;

public class LoginServer implements LoginService {

    private UserDaoService dao = new UserDaoServer(); //定义数据访问Dao对象
    @Override
    public String login(HttpServletRequest request) throws Exception {

        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        //通过Dao接口,访问数据库,用户名与密码为条件查询用户数据
        User user = dao.check(userName, password);
        //验证登录是否成功
        if(user!=null) { //成功
            System.out.println("userName= "+userName+" userPassword= "+password);
            request.setAttribute("userName", userName);
            return "/main.jsp";
        } else { //失败
            //请求中添加错误信息
            System.out.println("用户名或密码错误!");
            request.setAttribute("error", "用户名或密码错误!");
            return "/login.jsp";
        }
    }

}

在上一篇文章中,我们是直接在servlet里面输出用户的用户名称。但是在现在的这种架构中,servlet的作用的转发请求,所以我们要更改我们的servlet的内容。
下面是更改后的代码:

package com.xue.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xue.service.LoginService;
import com.xue.service.impl.LoginServer;


@WebServlet("/LoginServlet")//不要更改
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//      System.out.println("name" + request.getParameter("userName"));//这里填写的是我们在html文件里面写的名字

        LoginService service = new LoginServer();//新建bean服务类
        //设置请求中数据的编码格式
        request.setCharacterEncoding("utf-8"); //解决中文乱码问题,只支持post模式
        try {
            String path = service.login(request);//访问业务Bean,验证登录
            request.getRequestDispatcher(path).forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

(四):更改静态页面为动态页面,实现与服务器的数据交互
把login.html更改为login.jsp
更改后的代码为:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta charset="utf-8">
        <title>用户登录</title>
        <style type="text/css">
            dd,dt{
                margin:0;
            }
        </style>
    </head>
    <body>
        <div id="login" style="margin:300px auto auto auto;width:300px;border: 3px solid red" >
            <form id="form1" name="form1" method="post" action="LoginServlet"><!-- 先空着action,后面我们需要填写对应的servlet-->
                <dl>
                    <dt style="text-align: center;margin-bottom: 15px;" >用户登录</dt>
                    <dd style="text-align: center;margin-bottom: 10px;"><input type="text" name="userName" placeholder="请输入用户名" required="required" autofocus="autofocus" class="input-size" /></dd>
                    <dd style="text-align: center;"><input type="password" name="password" placeholder="请输入密码" required="required" class="input-size" /></dd>
                    <dd style="text-align: center; color:red;">${error}</dd>
                    <dd style="text-align: center;margin-top: 15px;"><input type="submit" value="登 录" class="btn-submit" /></dd>
                </dl>
            </form>

        </div>
    </body>
</html>

因为我们已经更改了登录的界面,所以我们把web.xml里面的欢迎文件列表也要个改成现在的.jsp。如图
这里写图片描述

新建main.jsp作为登录后的显示界面,下面是main.jsp的源码

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>欢迎界面</title>
</head>
<body>
        <p style="margin-top: 200px;color:red;text-align: center;font-size:xx-large;">欢迎:${userName}</p>
</body>
</html>

数据库里面存储的内容

登录测试,当错误的时候
这里写图片描述
这里写图片描述

当输入正确的用户时,小明:123456.成功登录
这里写图片描述

控制台输出
这里写图片描述

整个工程的目录结构:
这里写图片描述

这是用浏览器实现用户登录的,后面我将会补充上android端用户登录。

  • 5
    点赞
  • 19
    收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 4

打赏作者

军临城下

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值