jsp+servlet+jdbc+mysql实现登录

LoginServlet类

import com.sun.net.httpserver.HttpServer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;


public class LoginServlet extends HttpServlet {
    
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        String username = req.getParameter("username" );
        String password = req.getParameter("password");
//        System.out.println("name :"+username);
//        System.out.println("password :"+password);
        try {
    
    
            //第一步:加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //sql包里的Connection
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3308/数据库名称","数据库连接","数据库的密码");
            String sql = "SELECT * FROM user WHERE username=? AND password=? ";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            ResultSet resultSet = preparedStatement.executeQuery();
//            while(resultSet.next()){
    
    
//                System.out.println("登录成功");
//            }
            if(resultSet.next()){
    
    
                req.setAttribute("username",username);
                req.getRequestDispatcher("/index.jsp").forward(req,resp);
            }else {
    
    
                req.setAttribute("username",username);
                System.out.println("用户名密码错误");
                String error = "用户名或密码错误";
                req.setAttribute("error",error);
                req.getRequestDispatcher("/").forward(req,resp);
            }
        } catch (ClassNotFoundException e) {
    
    
            e.printStackTrace();
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
        //根据用户名查询数据库,如果没有结果,说明用户名不存在
        //若果查询到了,在对比密码,密码不对,返回错误提示
        //admin admin
//        if("admin".equals(username)&&"admin".equals(password)){
    
    
//            req.setAttribute("username",username);
//            req.getRequestDispatcher("/index.jsp").forward(req,resp);
//        }else{
    
    
//            req.setAttribute("username",username);
//            System.out.println("用户名密码错误");
//            String error = "用户名或密码错误";
//            req.setAttribute("error",error);
//            req.getRequestDispatcher("/").forward(req,resp);
//        }
    }
}

需要注意的是,加载驱动程序行为属于单例模式,也就是说,整个数据库应用中,只需要加载一次就可以了。

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: 12526
  Date: 2020/12/14
  Time: 23:45
  To change this template use File | Settings | File Templates.
--%>
<% String path = request.getContextPath(); %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>系统登录</title>
</head>
<body>
<form method="post" id="form" action="<%=path%>/loginServlet">
    <input type="text" id="username" name="username" value="${username}" placeholder="用户名" />
    <input type="password" id="password" name="password" placeholder="密码" />
    <button type="button" name="loginButton" onclick="loginVerify()">登录</button>
    ${
    
    error}
</form>
</body>
</html>
<script>
    function loginVerify(){
    
    
        var username = document.getElementById("username").value;
        var password = document.getElementById("password").value;
        if(username == ''){
    
    
            alert('用户名不能为空,请输入用户名');
            return;
        }
        if(password==''){
    
    
            alert('密码不能为空,请输入密码');
            return;
        }
        //调用后端servlet,并将数据进行传递
        document.getElementById("form").submit();
    }
</script>

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 12526
  Date: 2020/12/14
  Time: 23:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  欢迎您 ${
    
    username}!
  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
</web-app>

若加载驱动程序成功,系统会将驱动程序注册到DriverManager类中。如果加载失败,将抛出ClassNotFoundException异常。

由于数据库的不同,驱动程序的形式和内容也不相同,主要体现在获得连接的方式和相关参数的不同。因此,在JDBC项目中,根据面向对象的设计思想,一般把连接管理设计成为一个类——连接管理器类,主要负责连接的获得和关闭。

默认的ResultSet对象
ResultSet对象可由3中Statement语句来创建,分别需要调用Connection接口的方法创建。以下为3种方法的核心代码:

Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
PreparedStatement pstmt = connection.prepateStatement(sql);
ResultSet rs = pstmt.executeQuery();
CallableStatement cstmt = connection.prepareCall(sql);
ResultSet rs = cstmt.executeQuery();

ResultSet对象的常用方法主要包括行操作和列操作方法,这些方法可以让用户程序方便地遍历结果集中所有数据元素。

(1)boolean next()行操作方法系列:将游标从当前位置向前移一行,当无下一行是返回false。游标的初始位置在第一行前面,所以要访问结果集数据,首先要调用该方法。
(2)getXXX(int columnIndex)列方法系列:获取所在行指定列的值。“XXX”实际上与列(字段)的数据类型有关,若列为String 类型,则方法为getString();若为int型,则方法为getInt()。columnIndex表示列号,其值从1开始编号,如为第2列,则值为2.
(3)getXXX(String columnName)列方法系列:获取所在行指定列的值。columnName表示列明(字段名)。如getString(“name”)表示得到当前行字段名为name的列值。

猜你喜欢

转载自blog.csdn.net/weixin_45394002/article/details/111191845
今日推荐