jsp实例(一)

本文介绍了一个使用JSP、Servlet、Filter、Listener、JDBC和MySQL实现的用户登录系统,强调了用户只能在一个地方登录的功能。通过创建数据库、设置项目结构、编写POJO类和JDBC工具类,然后实现登录业务逻辑,包括登录验证、session管理和异常处理。文章还详细讲解了如何处理HttpSession超时销毁的异常,以及添加验证码功能来增强安全性,最后介绍了用户退出登录的实现方式。
摘要由CSDN通过智能技术生成

需求

实现用户登录与退出登录功能,要求一个用户只能在一处登录。 完成对用户表的 CRUD 操作。
使用技术: JSP、Servlet、Filter、Listener、JDBC、MySQL

实现项目

创建数据库

CREATE TABLE `user3` ( `userid` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) DEFAULT NULL, `userpwd` varchar(30) DEFAULT NULL, `usersex` varchar(2) DEFAULT NULL, `phonenumber` varchar(30) DEFAULT NULL, `qqnumber` varchar(20) DEFAULT NULL, PRIMARY KEY (`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

搭建项目

创建项目

在这里插入图片描述
在这里插入图片描述

添加jar包

在这里插入图片描述
添加的jar包:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加 jstl 标签库的约束文件

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

在这里插入图片描述
在这里插入图片描述

创建包

在这里插入图片描述

创建 POJO用户类

package com.bjsxt.pojo;

public class Users{
   
    private int userid;
    private String username;
    private String userpwd;
    private String usersex;
    private String phonenumber;
    private String qqnumber;

    public Users(int userid, String username, String userpwd, String usersex, String phonenumber, String qqnumber) {
   
        this.userid = userid;
        this.username = username;
        this.userpwd = userpwd;
        this.usersex = usersex;
        this.phonenumber = phonenumber;
        this.qqnumber = qqnumber;
    }
    public Users(){
   
        super();
    }
    @Override
    public String toString() {
   
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", userpwd='" + userpwd + '\'' +
                ", usersex='" + usersex + '\'' +
                ", phonenumber='" + phonenumber + '\'' +
                ", qqnumber='" + qqnumber + '\'' +
                '}';
    }

    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 getUserpwd() {
   
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
   
        this.userpwd = userpwd;
    }

    public String getUsersex() {
   
        return usersex;
    }

    public void setUsersex(String usersex) {
   
        this.usersex = usersex;
    }

    public String getPhonenumber() {
   
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
   
        this.phonenumber = phonenumber;
    }

    public String getQqnumber() {
   
        return qqnumber;
    }

    public void setQqnumber(String qqnumber) {
   
        this.qqnumber = qqnumber;
    }

}

创建 JDBC 工具类

db.properties:
这个db文件,要放到src的目录下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3307/test?useUnicode=true&charac terEncoding=utf8
jdbc.username=root
jdbc.password=1234567

创建JdbcUtils工具类
放到commons文件夹内:

package com.bjsxt.commons;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class JdbcUtils {
   
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    static {
   
        try{
   
            ResourceBundle bundle = ResourceBundle.getBundle("db");
            driver = bundle.getString("jdbc.driver");
            url = bundle.getString("jdbc.url");
            username = bundle.getString("jdbc.username");
            password = bundle.getString("jdbc.password");
            Class.forName(driver);
        }catch (ClassNotFoundException e) {
   
            e.printStackTrace();
        }
    }
    //获取连接方法
    public static Connection getConnection(){
   
        Connection conn = null;
        try {
   
            conn = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
   
            e.printStackTrace();
        }
        return conn;
    }
    //关闭连接
    public static void closeConnection(Connection conn){
   
        try {
   
            conn.close();
        } catch (SQLException e) {
   
            e.printStackTrace();
        }
    }
}

注意:

在实践的过程内,出现了报错:at java.lang.Class.forName()
本次问题是因为mysql的jar包出现了问题
解决方法:
点击跳转链接
在这里插入图片描述

实现业务

用户登录

导入登录页面的js,css以及图片文件夹
在这里插入图片描述
在这里插入图片描述

创建登录页面

创建名为login.jsp的登录页面:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>欢迎登录后台管理系统</title>
    <link href="css/style.css" rel="stylesheet" type="text/css" />
    <script language="JavaScript" src="js/jquery.js"></script>
    <script src="js/cloud.js" type="text/javascript"></script>

    <script language="javascript">
        $(function(){
   
            $('.loginbox').css({
   'position':'absolute','left':($(window).width()-692)/2});
            $(window).resize(function(){
   
                $('.loginbox').css({
   'position':'absolute','left':($(window).width()-692)/2});
            })
        });
    </script>

</head>

<body style="background-color:#1c77ac; background-image:url(images/light.png); background-repeat:no-repeat; background-position:center top; overflow:hidden;">

<div id="mainBody">
    <div id="cloud1" class="cloud"></div>
    <div id="cloud2" class="cloud"></div>
</div>

<div class="logintop">
    <ul>
        <li><a href="#">回首页</a></li>
        <li><a href="#">帮助</a></li>
        <li><a href="#">关于</a></li>
    </ul>
</div>

<div class="loginbody">

    <div class="loginbox loginbox2">
        <form action="login.do" method="post">
            <ul>
                <li><input name="username" type="text" class="loginuser" value="admin" onclick="JavaScript:this.value=''"/></li>
                <li><input name="userpwd" type="text" class="loginpwd" value="密码" onclick="JavaScript:this.value=''"/></li>
                <li class="yzm">
                    <span><input name="" type="text" value="验证码" onclick="JavaScript:this.value=''"/></span><cite>X3D5S</cite>
                </li>
                <li><input name="" type="submit" class="loginbtn" value="登录"  onclick="javascript:window.location='main.html'"  /></li>
            </ul>
        </form>

    </div>

</div>

</body>
</html>

创建登录业的务持久层

在dao包内创建一个接口UserLoginDao

package com.bjsxt.dao;

import com.bjsxt.pojo.Users;

public interface UserLoginDao {
   
    public Users selectUsersByUserNameAndUserPwd(String username, String userpwd);
}

在dao包下的impl文件夹下,创建一个实现接口UserLoginDao的实现类 – UserLoginDaoImpl类

package com.bjsxt.dao.impl;

import com.bjsxt.commons.JdbcUtils;
import com.bjsxt.dao.UserLoginDao;
import com.bjsxt.pojo.Users;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 对于用户登录的数据库查询
 */
public class UserLoginDaoImpl implements UserLoginDao {
   
    @Override
    public Users selectUsersByUserNameAndUserPwd(String username, String userpwd) {
   
        Users user = null;
        Connection conn = null;
        try {
   
            conn = JdbcUtils.getConnection();
            PreparedStatement ps = conn.prepareStatement("select * from user3 where username = ? and userpwd = ?");
            ps.setString(1,username);
            ps.setString(2,userpwd);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()){
   
                user = new Users();
                user.setUsersex(resultSet.getString("usersex"));
                user.setUserpwd(resultSet.getString("userpwd"));
                user.setUsername(resultSet.getString("username"));
                user.setUserid(resultSet.getInt("userid"));
                user.setPhonenumber(resultSet.getString("phonenumber"));
                user.setQqnumber(resultSet.getString("qqnumber"));
            }
        } catch (SQLException e) {
   
            e.printStackTrace();
        }finally {
   

        }
        return user;
    }
}

创建登录页的业务层

创建自定义异常的类,用于对于出现的异常进行自定义处理

package com.bjsxt.service;

/**
 * 异常包,用于自定义异常
 */
public class UserNotFoundException extends RuntimeException{
   
    public UserNotFoundException() {
   

    }
    public UserNotFoundException(String message) {
   
        super(message);
    }
    public UserNotFoundException(String message, Throwable cause) {
   
        super(message, cause);
    }
}

创建一个接口:

package com.bjsxt.service;

import com
顺序如下: 1、多种字体大小显示 2、c:out标记输出 3、获取当前时间 4、include包含语句 5、建立错误处理页面的范例程序 6、jsp:forward 7、简单计数器 8、设置页面属性 9、使用GB2312编码 10、使用Big5编码 11、c:catch的用法 12、<c:forEach> begin、end和step的用法 13 、 <c:forEach> 循环 14、<c:forEach> varStatus 的四种属性 15、<c:forEach> 的用法 16、从客户端传送数据至服务端 17、使用Unicode转义字符 18、使用朝鲜语字符集 19、JSP中最简单的国际化程序 20、错误检测 21、抛出异常 22、<c:if> 的用法 23、<c:set>和<c:remove> 的用法 24、<c:import> 的用法 25、jsp-include的用法 26、汉字处理 27、网页重定向 28、自动更新网页 29、存取session 30、<c:redirect> 的用法 31、单选型列表框 32、jsp文件中定义类 33、取得 JSP Container 版本 34、javax.servlet.jsp.JspWriter - out 对象 35、page 隐含对象 36、application 对象 37、PageContext 对象 38、Page范围 - pageContext 39、测试要显示的中文 40、IF控制符的操作 41、HttpServletRequest 接口所提供的方法 42、 网上测验 43、HttpSession - session 对象 44、 多选型列表框 45、解决浏览器 cache 的问题 46、使用 EL、JSTL 处理表单数据 47、 EL隐含对象 param、paramValues 48、EL隐含对象 pageContext 49、EL算术运算符 50、EL关系运算符 51、EL的运算符 52、选择钮的使用 53、检查框的使用 54、群组检查框的使用 55、数字、货币、百分数格式化 56、日期格式化 57、JSTL设置语言地区 58、Cookie数据的存取 59、session有效时间的设置与取得 60、session时间与ID 61、Cookie有效时间的设置 62、利用隐藏字段传送数据 63、JSP 使用 JavaBean 的方法 64、JSP 使用 JavaBean 65、范围为 Page 的 JavaBean范例程序 66、范围为 Request的 JavaBean 67、范围为 Session 的 JavaBean 68、范围为 Application 的 JavaBean 69、删除 JavaBean 70、url重组 71、Switch语句 72、环境变量 73、forward重定向 74、文件的建立与删除 75、取得文件属性 76、取得目录中的文件 77、目录的建立与删除 78、自Cookie存取日期/时间数据 79、管理Session变量 80、数据库中的记录数与记录指针位置 81、利用absolute方法设置记录位置 82、使用jsp指令生成Word文档 83、JSP网页模板 84、判断是否空白文件 85、cookie 用户登录次数 86、获取用户的真实IP地址 87、获取用户的浏览器信息 88、在客户端进行数据检查 89、在JSP中获取当前绝对路径 90、读取表单中所有参数 91、分行写入数据 92、显示请求URL 93、判断session是否过期 94、参数式查询数据库 95、取得数据库中各栏名称 96、使用JavaBean、设置和获取Bean的属性 97、设置Bean的一个属性与输入参数关联 98、实现基于数据库的站内搜索 99、DOM读取XML文档 100、SAX读取XML文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值