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的列值。