JavaWeb实现简单登录功能

2023-05-16

创建一个web项目,配置好Tomcat,java环境,并部署到idea中,安装好MySQL并导入jar包、mysql-connector的jar包、jquery的js包、servlet-api.jar

1.首先在数据库创建一个表

CREATE TABLE `user` (
  `uid` int(11) NOT NULL COMMENT '账号',
  `uname` varchar(20) DEFAULT NULL COMMENT '用户名称',
  `password` varchar(20) DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.数据库连接方法

public class JdbcTools {

    private String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8";
    private String username = "root";
    private String password = "";

    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;


    //创造构造函数
    public JdbcTools() {
    }

    public JdbcTools(String url, String username, String password) {
        this.url = url;
        this.username = username;
        this.password = password;
    }

    //加载驱动类
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取连接
    public Connection getConnection() {
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //添加执行查询方法
    public ResultSet executeQuery(String sql, Object... item) {
        try {
            ps = (PreparedStatement) getConnection().prepareStatement(sql);
            for (int i = 0; i < item.length; i++) {
                ps.setObject(i + 1, item[i]);
            }
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

    //关闭资源
    public void close() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //添加删除方法
    public int executeUpdate(String sql, Object... item) {
        int count = 0;
        try {
            ps = (PreparedStatement) getConnection().prepareStatement(sql);  
            for (int i = 0; i < item.length; i++) {
                ps.setObject(i + 1, item[i]);
            }
            count = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        close();
        return count;
    }
    //封装集合
    public List<Map<String, Object>> select(String sql, Object... item) {
        List<Map<String, Object>> result = new LinkedList<>();
        List<String> columnList = new LinkedList<>();
        try {
            ResultSet rs = executeQuery(sql, item);
            ResultSetMetaData md = rs.getMetaData();
            for (int i = 0; i < ((ResultSetMetaData) md).getColumnCount(); i++) {
                columnList.add(md.getColumnName(i + 1));
            }
            while (rs.next()) {
                Map<String, Object> map = new LinkedHashMap<>();
                for (String column : columnList) {
                    map.put(column.toLowerCase(), rs.getObject(column));
                }
                result.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return result;
    }
    //增删改方法封装
    public int update(String sql, Object... item) {
        return executeUpdate(sql, item);
    }
    public int insert(String sql, Object... item) {
        return executeUpdate(sql, item);
    }
    public int delete(String sql, Object... item) {
        return executeUpdate(sql, item);
    }
}

3.创建一个实体类

public class User {
    /**
     * 账号
     */
    private Integer uid;

    /**
     * 用户名
     */
    private String uname;

    /**
     * 密码
     */
    private String password;
public User(int uid, String uname, String password) {
        this.uid = uid;
        this.uname = uname;
        this.password = password;
}
 public int getUid() {
        return uid;
    }

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

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
 @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", uname='" + uname + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
  public User(){

    }
}

4.创建一个LoginDao类,用于进行查询数据库内容的具体方法,该方法继承JDBCUtils工具类

private JdbcTools jt = new JdbcTools();

    /**
     * Map转User的orm映射方法
     *
     * @param map 传入的map
     * @return User对象
     */
    public User ormUser(Map<String, Object> map) {
        User user = new User();

        if (map.get("uid") != null) {
            user.setUid((int) map.get("uid"));
        }
        if (map.get("uname") != null) {
            user.setUname((String) map.get("uname"));
        }
        if (map.get("password") != null) {
            user.setPassword((String) map.get("password"));
        }
        return user;
    }

    public User login(int uid, String password){
        String sql = "select * from user where uid=? and password=? ";
        List<Map<String, Object>> list = jt.select(sql, uid, password);
        if (list.size() == 0) {
            return null;
        }
        Map<String, Object> map = list.get(0);
        return ormUser(map);
    }

5.创建一个LoginServlet,获取login.jsp页面中的用户名密码,用于验证用户登录。

@WebServlet("/LoginServlet.do")
public class LoginServlet extends HttpServlet {

    private LoginDao loginDao = new loginDao();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //这个是乱码处理 改一下字符集
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html");


        //获取操作指令
        String action = request.getParameter("action");

        //
        if (action.equals("login")){
            //登录功能
            //1.获取前端传来的数据
            String uid = request.getParameter("uid");
            String password = request.getParameter("password");
            //2.调用数据层
            User currentUser = loginDao.login(Integer.parseInt(uid), password);
            //3.判断
            if (currentUser == null) {
                //登录失败:返回登录页,提示失败原因
                request.setAttribute("message", "登录失败!账号密码有误或无权限进行操作!");
                request.getRequestDispatcher("./jsp/login.jsp").forward(request, response);
            } else {
                //登录成功,跳向操作首页
                request.getRequestDispatcher("./jsp/index.jsp").forward(request, response);
            }
        }

    }

6.创建一个登录页面login.jsp,在表单内填写用户名和密码,用post提交到LoginServlet。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入bootstrap -->
    <link rel="stylesheet" type="text/css" href="../css/bootstrap.min.css">
    <!-- 引入JQuery  bootstrap.js-->
    <script src="../js/jquery-3.2.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
    <style type="text/css">
        body {
            background: url(../images/bc2.jpg);
            background-position: top;
        }

        #login-box {
            padding: 35px;
            border-radius: 15px;
            background-color: #56666B;
            color: #fff;
        }
    </style>
</head>

<body>
<div class="container" id="body">
    <div class="row" style="margin-top: 260px; ">
        <div class="col-md-4 col-md-offset-2"><span id="message"
                                                    style="color: red;text-align: center;">${message}</span></div>
        <br>
        <div class="col-md-4 col-md-offset-2" id="login-box">
            <form class="form-horizontal" role="form" action="LoginServlet.do?action=login" id="loginForm" method="post"
                  autocomplete="off">
                <div class="form-group">
                    <label for="username" class="col-sm-3 control-label">用户</label>
                    <div class="col-sm-9">
                        <input type="text" class="form-control" id="username" placeholder="请输入名字" name="uid"
                               required>
                    </div>
                </div>
                <div class="form-group">
                    <label for="password" class="col-sm-3 control-label">密码</label>
                    <div class="col-sm-9">
                        <input type="password" class="form-control" id="password" placeholder="请输入密码"
                               name="password" required>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-offset-3 col-sm-9">
                        <button type="submit" class="btn btn-default btn-info" style="width:100%;">登录</button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
</body>
<script>
    $(document).ready(function () {
        $(".form-control").focus(function () {
            $("#message").css("display", "none");
        });
    });
</script>

</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaWeb实现简单登录功能 的相关文章

  • curl 命令详解(超详细)

    GET 请求 GET 方法是在 curl 中发出请求的默认方法 xff0c 因此不必指定任何参数 eg curl https blog ucwords com o 保存响应到文件中 curl o response tex https blo
  • Matlab 命令行显示循环显示进度条

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言一 代码二 简单说明三 测试总结 前言 闲来无事 xff0c 在用Matlab跑循环比较长的时候 xff0c 时间长 xff0c
  • Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)

    场景 Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 xff1a Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 霸道流氓气质的博客 CSDN博客 海康nv
  • C++ 为什么编写模板类时要把方法的实现写在头文件中,而不能像写普通类一样写在源文件中?

    1 回答标题的问题 这里说下我自己的理解 xff0c 如有不正确请各位大佬斧正 想要解决这个问题需要先了解C 43 43 代码的编译过程 C 43 43 将代码编译生成可执行文件的过程可以分为三步 xff1a 预编译 编译 链接 预编译时
  • 加速度计、陀螺仪工作原理

    加速度计 陀螺仪的工作原理 参考链接 xff1a https c miaowlabs com B07 html 陀螺仪 加速度计都是惯性测量元件的一种 而 MPU 6050 传感器的内部同时集成了陀螺仪和加速度传感器两种惯性测量元件 1 加
  • VsCode中运行C/C++

    VsCode中运行C C 43 43 1 插件 runCode2 配置环境 mingw64 1 插件 runCode 在 VsCode 中的扩展商店中 xff0c 下载插件 Code Runner 安装完成之后 xff0c 进行一些配置更改
  • 常见通信协议之UART、RS485

    UART 通用异步收发器一种通用的串行 异步通信总线 xff0c 该总线有两条数据线 xff0c 可以实现全双工的发送和接受并行通信和串行通信 总线传递数据的本质 高低电信号并行通信 一次性传输多个位 布线难度高 存在数据干扰串行通信 逐次
  • java的琐碎学习之串口通信与数据库与GUI

    RFID作业 xff0c 要求实现软硬结合 xff0c 全部使用自己的页面完成 xff1b 找了几个教程发现安卓我做不到 xff0c 就用了Java实现 xff1b 图书管理系统 可以通过写卡来绑定15693卡和书籍 xff0c 实现增删改
  • C++- #define 和 const 有什么区别?

    回答如下 xff1a 定义不同 xff1a define 是C 43 43 预处理器的指令 xff0c 用于定义宏 xff0c const是C 43 43 关键字 xff0c 用于定义常量 作用对象不同 xff1a define 定义的宏
  • HTTP协议:二.使用工具观察 HTTP 的请求和响应

    二 使用工具观察 HTTP 的请求和响应 1 HTTP 协议格式 HTTP 是一个文本格式的协议 可以通过 Chrome 开发者工具或者 Fiddler 抓包 分析HTTP 请求 响应的细节 2 抓包工具的下载和使用 直接去官网下载即可 f
  • Linux环境下的c语言编程

    vim编辑器编辑hello c vim编辑器中输入相应代码 编译 运行代码 运行结果 使用GDB函数调用 编译生成可执行文件 启动gdb 第十行设置断点并运行 gcc过程改为makefile管理 编写makefile文件 启动makefil
  • ubuntu下关于ssh远程和scp远程复制文件以及nfs搭建

    SSH远程 在Linux系统中 xff0c 通过客户端连接到远程服务器中 xff0c 方便代码地编写运行 xff0c ssh是一种安全协议 xff0c 主要用于给远程登录信息数据进行加密 1 安装ssh 2 启动ssh 3 创建要发送的文件
  • Linux环境下的多线程&多进程编程

    1 线程的创建与终止 创建一个 c文件 xff0c 使用vi编辑器进行多线程的创建 编译文件 在编译文件时会出现对 pthread create 未定义的引用 xff0c 这是由于pthread 库不是Linux系统默认的库 xff0c 连
  • 东北天坐标系转载体坐标系

    文章目录 1 基本概念1 1欧拉角1 2左乘右乘1 3东北天坐标系1 4载体坐标系1 5捷联惯性导航系统 2 通过ECEF转换到参考点附近的ENU坐标系上3 东北天坐标系到载体坐标系 1 基本概念 1 1欧拉角 欧拉旋转定理指出 xff1a
  • I2C驱动App

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • Qt5.14.2 编程应用

    Qt5 14 2 编程应用 什么是Qt Qt 是一个跨平台的 C 43 43 图形用户界面库 xff0c 由挪威 TrollTech 公司于 1995 年底出品 xff0c 并于 2008年6月17日被NOKIA公司收购 xff0c 以增强
  • L298N电机驱动的使用

    L298N电机驱动的使用 前言一 介绍L298N模块简介接口介绍 二 使用步骤硬件连接软件部分1 声明部分2 代码部分 总结 前言 博主为某大学电气专业大学生 xff0c 以学习为目的写下该文 xff0c 内容主要为以51单片机为例简单介绍
  • Authorization头的作用

    Authorization头的主要用作http协议的认证 Authorization的作用是当客户端访问受口令保护时 xff0c 服务器端会发送401状态码和WWW Authenticate响应头 xff0c 要求客户机使用Authoriz
  • vscode中常用的快捷键

    分享一些本人在学习前端过程中用到的一些快捷键 xff0c 需要强调的是 xff0c 这些快捷键适用的软件是VScode 因为自己初学前端用的是这个软件 其中有一些在idea中也是适用的 xff0c 已经在括号内标注 1 alt 43 W 将
  • PID算法原理及基本实现

    自动控制中 xff0c PID及其衍生出来的算法是应用最广的算法之一 各个做自动控制的厂家基本都有会实现这一经典算法 我们在做项目的过程中 xff0c 也时常会遇到类似的需求 xff0c 所以就想实现这一算法以适用于更多的应用场景 1 PI

随机推荐