servlet+jsp+mysql+数据库连接池实现注册登陆验证码功能

本文详细介绍了如何使用Servlet、JSP、MySQL和数据库连接池来实现用户注册登录及验证码功能。首先创建数据库和数据表,接着配置Eclipse的数据库连接池,包括在`context.xml`、`web.xml`和`server.xml`中的配置。然后实现DBServlet类,处理数据库操作,并创建图形验证码功能。最后,展示了注册页面`register.jsp`和登录页面`login.jsp`的代码,以及结果展示页面`result.jsp`,确保用户输入验证和数据交互的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先项目的结构及所用到的jar包如图:

主要用到jdbc和jstl的jar包,大家可自行去相应网站下载

一、数据库和数据表的创建

1.建库语句:

create database test;

2.建表语句:

CREATE TABLE `t_users` (
  `user_name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `password_md5` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

二、eclipse配置数据库连接池

首先创建一个动态web项目

1.把jdbc所用到的jar包复制到/web-inf/lib目录下,如图:

2.在meta-inf下创建一个context.xml文件,并输入以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/test" reloadable="true">
    <!-- 配置数据源 -->
    <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100"
    maxldle="30" maxWait="10000" name="jdbc/test" password="root" type="javax.sql.DataSource"
    url="jdbc:mysql://localhost:3306/test?autoReconnect=true" username="root">
    </Resource>
</Context>

 

<Resource属性说明>

1)name:指定Resource的JNDI名字。

2)auth:指定管理Resource的Manager,它有两个可选值:Container和Application。Container表示由容器来创建和管理Resource,Application表示由web应用来创建和管理Resource。

3)type: 指定Resource的Java类名。

4)username:指定连接数据库的用户名。

5)password:指定连接数据库的口令。

6)driverClassName:指定连接数据库的JDBC驱动器中的Driver实现类的名字。

7)url:指定连接数据库的URL,127.0.0.1是要连接的数据库服务器的ip,3306是数据库服务器端口,BookDB是数据库名称。

8)maxActive:指定数据库连接池中处于活动状态的数据库连接的最大数目,取值为0,表示不受限制。

9)maxIdle:指定数据库连接池中处于空闲状态的数据库连接的最大数目,取值为0,表示不受限制。

10)maxWait:指定数据库连接池中的数据库连接处于空闲状态的最长时间(以毫秒为单位),超过这一时间,将会抛出异常。取值为-1,表示可以无限期等待。

 

3.配置web.xml

在<web-app></web-app>之间加入如下代码:

  <resource-ref>
    <description>MySQL DBCP</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

 

<resource-ref>属性说明:

1)description:对所引用的资源的说明。

2)res-ref-name:指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应。

3)res-type:指定所引用资源的类名,与<Resource>元素中的type属性对应。

4)res-auth:指定管理所引用资源的Manager,与<Resource>元素中的auth属性对应。

 

4.配置server.xml文件

在tomcat\conf下找到server.xml文件,在<GlobalNamingResources></GlobalNamingResources>之间加入如下内容:

<Resource name="jdbc/test" auth="Container"
              type="javax.sql.DataSource"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/test?characterEncodering=utf-8"
              username="root"
              password="root"
              maxActive="200"
              maxIdle="50"
              maxWait="3000"/>

在<Host></Host>之间加入如下内容:

 <Context docBase="D:\eclipse-workspace\loginRegister\WebContent" 
        path="/LoginRegister" reloadable="true" source="org.eclipse.jst.j2ee.server:test">
         <ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>
        </Context>

<Context>属性说明:

1)docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径。如果Web应用采用开放目录结构,则指定Web应用的根目录;如果Web应用是个WAR文件,则指定WAR文件的路径。

2)path:指定访问该Web应用的URL入口。

3)reloadable:如果这个属性为true,Tomcat服务器会在运行状态下监视classes下文件的改动和WEB-INF/web.xml文件的改动,监测到文件被改动,服务器会自动重新加载Web应用。

4)source:

<ResourceLink>属性说明:

1)global:被连接的连接全局资源的名称。

2)name:创建的资源连接的名称,相对于java:comp/env context。

3)type:当web应用在该资源连接上进行查找时,返回的Java类名的全称。

至此数据库连接池配置完

三、实现访问数据库的DBServlet类

实现代码如下:

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;

/**
 * Servlet implementation class DBServlet
 */
@WebServlet("/DBServlet")
public class DBServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    //用于连接数据库的Connection对象
    protected Connection conn=null;
    protected ResultSet execSQL(String sql,Object... args) throws Exception{
        //建立Preparedment对象
        PreparedStatement pStmt=conn.prepareStatement(sql);
        //为pStmt对象设置SQL参数值
        for(int i=0;i<args.length;i++) {
            pStmt.setObject(i+1,args[i]);  //设置SQL参数值
        }
        pStmt.execute();  //执行SQL语句
        //返回结果集,如果执行的SQL语句不返回结果集,则返回null
        return pStmt.getResultSet();
    }
    //核对用户输入的验证

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <!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> <center> <h1>普通话水平测试报名系统</h1> <hr> <br> <br> <% //接收用户提交的参数 String username=request.getParameter("uname"); String userpassword=request.getParameter("upassword"); String userjb=request.getParameter("userjb"); //设置一个变量保存登录状态,ture表示登录成功,false表示登录失败 boolean flag=true; %> <% String driverclass="com.mysql.jdbc.Driver"; String url="jdbc:mysql://localhost:3306/atao"; String uname="root"; String upass="958672"; Connection conn=null; PreparedStatement stmt=null; ResultSet rs=null; Class.forName(driverclass); conn=DriverManager.getConnection(url,uname,upass); if(userjb.equals("1")) {stmt=conn.prepareStatement("select * from users where user_id=? and userpass=? and role=?"); stmt.setString(1,username); stmt.setString(2,userpassword); stmt.setString(3,userjb); rs=stmt.executeQuery(); if(rs.next()) { flag=false; } if(flag){ %> <script type="text/javascript" language="javascript"> alert("密码错误或无权限登录,请重新登录"); window.document.location.href="dl-index.jsp"; </script> <% } else{ request.setCharacterEncoding("UTF-8"); session.setAttribute("uname",rs.getString(1)); session.setAttribute("upassword",rs.getString(2)); session.setAttribute("userjb",rs.getString(3)); response.sendRedirect("sgly/gg-index.jsp"); rs.close(); stmt.close(); conn.close(); } } if(userjb.equals("2")) {stmt=conn.prepareStatement("select * from xxwyb where xxwy_id=? and password=? and role=?"); stmt.setString(1,username); stmt.setString(2,userpassword); stmt.setString(3,userjb); rs=stmt.executeQuery(); if(rs.next()) {session.setAttribute("id",rs.getString(1)); session.setAttribute("pd",rs.getString(7)); flag=false; } if(flag){ %> <script type="text/javascript" language="javascript"> alert("密码错误或无权限登录,请重新登录"); window.document.location.href="dl-index.jsp"; </script> <% } else{ request.setCharacterEncoding("UTF-8"); session.setAttribute("uname",rs.getString(1)); session.setAttribute("upassword",rs.getString(2)); session.setAttribute("userjb",rs.getString(3)); response.sendRedirect("sxxwy/xx-ym.jsp"); rs.close(); stmt.close(); conn.close(); } } if(userjb.equals("0")){ %> <script type="text/javascript" language="javascript"> alert("您还没有选择用户类型"); window.document.location.href="dl-index.jsp"; </script> <% } %> </center> </body> </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值