目标
登陆界面输入用户名和密码后可以根据数据库的用户名和密码来判断用户名和密码是否正确
如果正确
进入登陆成功界面、否则进入登陆失败界面
先创建servlet界面代码
import bean.User;
import dao.UserDAOImpl;
import javax.servlet.RequestDispatcher;
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 java.io.IOException;
import java.sql.SQLException;
/*
* 处理用户登录的Servlet
*
* */
@WebServlet(name = "MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用post");
// 获取用户名密码
String username = request.getParameter("username");
String userpassword = request.getParameter("userpassword");
UserDAOImpl userDAO = new UserDAOImpl();
System.out.println(username);
System.out.println(userpassword);
// 调用UserDAOImpl中的验证方法
User user = null;
try {
user = userDAO.checkUsernameAndPassword(username, userpassword);
//用户名和密码正确(建议成功重定向,失败转发)
if (user != null) response.sendRedirect("pages/successful.html");
else {
// 用户名密码不正确(转发到登录页面)
RequestDispatcher requestDispatcher = request.getRequestDispatcher("pages/fail.html");
// 请求转发
requestDispatcher.forward(request,response);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
之后写登陆界面代码
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2020/10/5
Time: 15:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆界面</title>
<style type="text/css">
body{
background-color: cornflowerblue;
}
</style>
</head>
<body>
<h1>欢迎登陆</h1>
<form action="MyServlet" method="post">
用户名称:<input type="text" name="username"><br>
用户密码:<input type="password" name="userpassword"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
创建JDBC工具类
package utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
/**
* 获取连接和释放连接的工具类
*
*/
public class JDBCUtils {
private static DataSource dataSource;
static {
// 把配置文件的数据加载到Properties对象中
Properties properties = new Properties();
try {
properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//释放连接
public static void releaseConnection(Connection connection) throws SQLException {
if (connection != null){
connection.setAutoCommit(true);
connection.close();
}
}
}
之后,写bean类bean类的属性一定要和数据库中的对应
package bean;
public class User {
private int id;
private String username;
private String password;
private String email;
public User() { // 必须要有无参构造
}
public User(int id, String userName, String password, String email) {
this.id = id;
this.username = userName;
this.password = password;
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return username;
}
public void setUserName(String userName) {
this.username = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
写基础工具类
package dao;
import utils.JDBCUtils;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
/*
* DAO:Data Access Object 数据访问接口和相关的类
*
* 把各个DAO的实现类的相同的代码提取出来
*
*
* 新API
* java.sql.ResultSetMetaData类型:结果集的元数据类型(描述数据的数据)
* */
public class BasicDAO {
// 增删改查
public int update(String sql,Object...args) throws SQLException {
// 增删改的代码类似
Connection connection = JDBCUtils.getConnection(); // 获取一个连接
// 使用SQL
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 传?
if (args != null && args.length >=1 ){
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i+1,args[i]);
}
}
// 执行SQL
int i = preparedStatement.executeUpdate();
// 关闭
preparedStatement.close();
JDBCUtils.releaseConnection(connection);
return i;
}
public <T> ArrayList<T> getAll(Class<T> tClass,String sql,Object...args) throws SQLException, IllegalAccessException, InstantiationException, NoSuchFieldException { //获取全部对象
// 获取一个连接
Connection connection = JDBCUtils.getConnection();
// 使用SQL
// 创建PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 为?赋值
if (args != null && args.length >=1){
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i+1,args[i]);
}
}
// 查询
ResultSet resultSet = preparedStatement.executeQuery();
// 获取结果集的元数据描述,有对该结果集数据描述的相关信息
ResultSetMetaData metaData = resultSet.getMetaData();
// 获取结果集列数
int columnCount = metaData.getColumnCount();
// 创建ArrayList集合
ArrayList<T> arrayList = new ArrayList<>();
if (resultSet.next()){
// 创建T对象
T t = tClass.newInstance();
for (int i = 0; i < columnCount; i++) {
// 通过反射设置属性值
// 获取属性对象
String filedName = metaData.getColumnName(i+1);
Field declaredField = tClass.getDeclaredField(filedName);
// 设置属性值可以被访问
declaredField.setAccessible(true);
// 添加属性值
declaredField.set(t,resultSet.getObject(i+1));
}
arrayList.add(t);
}
JDBCUtils.releaseConnection(connection);
resultSet.close();
return arrayList;
}
}
以及User工具类接口
package dao;
import bean.User;
import java.sql.SQLException;
public interface UserDAO { // 返回一个对象,如果密码和用户名对应
User checkUsernameAndPassword(String username , String password) throws SQLException, NoSuchFieldException, InstantiationException, IllegalAccessException;// 根据用户名密码从数据库中查询
}
写User对应工具类
package dao;
import bean.User;
import java.sql.SQLException;
import java.util.ArrayList;
public class UserDAOImpl extends BasicDAO implements UserDAO{
@Override
public User checkUsernameAndPassword(String username, String password) throws SQLException, NoSuchFieldException, InstantiationException, IllegalAccessException {
String sql = "select * from users";
ArrayList<User> all = getAll(User.class, sql);
for (User user : all
) {
if (username.equals(user.getUserName()) && password.equals(user.password)){
return user;
} else {
return null;
}
}
return null;
}
}
先做个测试
package test;
import jdk.jfr.StackTrace;
import org.junit.Test;
import utils.JDBCUtils;
import java.sql.Connection;
import java.sql.SQLException;
public class ConnectionTest {
@Test
public void test() throws SQLException {
Connection connection = JDBCUtils.getConnection();
System.out.println(connection);
}
}
package test;
import bean.User;
import dao.UserDAOImpl;
import java.sql.SQLException;
public class Test {
public static void main(String[] args) throws SQLException, InstantiationException, IllegalAccessException, NoSuchFieldException {
UserDAOImpl userDAO = new UserDAOImpl();
User user = userDAO.checkUsernameAndPassword("陈云佳", "cyj360");
System.out.println(user);
}
}
结果全都正常
之后用tomcat运行
切记
一定要把jar包导入到tomcat的lib中,否则会报错
更新
学了JavaScript后,将index.jsp进行更改
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2020/10/5
Time: 15:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆界面</title>
<style type="text/css">
body{
background-color: cornflowerblue;
}
</style>
<script type="text/javascript" src="Jquery/jquery-1.7.2(1).js"></script>
<script type="text/javascript">
$(function () {
// 给文本框绑定focus事件
$("#us").focus(function () {
// 将显示错误信息的文本置空
$("#span").text("");
/*
* text方法用来获取或设置成对出现的标签中文本值
* 对象.text():获取文本值
* 对象.text("new value"):设置文本值
*
* */
} );
// 给按钮绑定单击事件
/*
* val方法:获取或设置input标签中的属性值
* 对象.val()获取value属性
* 对象.val("new value"):设置value属性值
*/
$("#sub").click(function () {
//获取用户输入名
var username = $("#us").val()
if (username == ""){
alert("用户名不能为空");
return false;
}
var password = $("#psw").val()
if (password == ""){
alert("密码不能为空")
return false;
}
})
});
</script>
</head>
<body>
<h1>欢迎登陆</h1>
<form action="MyServlet" method="post">
用户名称:<input type="text" name="username" id="us"><span style="color:red" id="span">${requestScope.get("msg")}</span> <br>
用户密码:<input type="password" name="userpassword" id="psw"><br>
<input type="submit" id="sub" value="提交">
</form>
</body>
</html>
添加注册功能,并且修改了一下之前的逻辑问题
package servlet;
import dao.UserDAOImpl;
import javax.servlet.RequestDispatcher;
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 java.io.IOException;
import java.sql.SQLException;
/*
* 处理用户登录的Servlet
*
* */
@WebServlet(name = "MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用post");
// 获取用户名密码
String username = request.getParameter("username");
String userpassword = request.getParameter("userpassword");
UserDAOImpl userDAO = new UserDAOImpl();
System.out.println(username);
System.out.println(userpassword);
// 调用UserDAOImpl中的验证方法
try {
boolean b = userDAO.checkUsernameAndPassword(username, userpassword);
//用户名和密码正确(建议成功重定向,失败转发)
if (b) {
response.sendRedirect("pages/successful.jsp");
} else {
// 用户名密码不正确(转发到登录页面)
request.setAttribute("msg","用户名或密码错误");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("index.jsp");
// 请求转发
requestDispatcher.forward(request,response);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户名和密码
String username = request.getParameter("username");
String userpassword = request.getParameter("userpassword");
System.out.println(username);
System.out.println(userpassword);
// 查询用户名是否被注册过
UserDAOImpl userDAO = new UserDAOImpl();
boolean user = false;
try {
boolean b = userDAO.checkUsername(username);// true 表示被调用
if (b){// 如果被调用
request.setAttribute("beused","该用户名已被调用");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("registered.jsp");
// 请求转发
requestDispatcher.forward(request,response);
}
if (!b){ //如果未被调用
user = userDAO.addUser(username, userpassword);
if (user){// 创建成功
request.setAttribute("successful","创建成功");
response.sendRedirect("index.jsp" );
}else {
System.out.println("创建失败");
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
起始网页
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2020/10/5
Time: 15:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆界面</title>
<style type="text/css">
body{
background-color: cornflowerblue;
}
</style>
<script type="text/javascript" src="Jquery/jquery-1.7.2(1).js"></script>
<script type="text/javascript">
$(function () {
// 设置格式(用户名格式 例如必须包含a)
// 给文本框绑定focus事件
$("#us").focus(function () {
// 将显示错误信息的文本置空
$("#span").text("");
/*
* text方法用来获取或设置成对出现的标签中文本值
* 对象.text():获取文本值
* 对象.text("new value"):设置文本值
*
* */
} );
// 给按钮绑定单击事件
/*
* val方法:获取或设置input标签中的属性值
* 对象.val()获取value属性
* 对象.val("new value"):设置value属性值
*/
$("#sub").click(function () {
//获取用户输入名
var username = $("#us").val()
if (username == ""){
alert("用户名不能为空");
return false;
}
var password = $("#psw").val()
if (password == ""){
alert("密码不能为空")
return false;
}
})
});
</script>
</head>
<body>
<h1>欢迎登陆</h1>
<form action="MyServlet" method="post">
用户名称:<input type="text" name="username" id="us"><span style="color:red" id="span">${requestScope.get("msg")}</span> <br>
用户密码:<input type="password" name="userpassword" id="psw"><br>
<input type="submit" id="sub" value="提交"><br>
<a href="registered.jsp">如无账号,请点击</a>
</form>
</body>
</html>
注册网页
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2020/10/10
Time: 15:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>欢迎注册</title>
<script type="text/javascript" src="Jquery/jquery-1.7.2(1).js"></script>
<script type="text/javascript">
$(function () {
// 给文本框绑定focus事件
$("#usn").focus(function () {
// 将显示错误信息的文本置空
$("#span1").text("");
/*
* text方法用来获取或设置成对出现的标签中文本值
* 对象.text():获取文本值
* 对象.text("new value"):设置文本值
* */
} );
$("#span2").text("");
// 给按钮绑定单击事件
/*
* val方法:获取或设置input标签中的属性值
* 对象.val()获取value属性
* 对象.val("new value"):设置value属性值
*/
$("#subm").click(function () {
//获取用户输入名
var username = $("#usn").val()
if (username == ""){
alert("用户名不能为空");
return false;
}
var userReg = /a/; //是否包含a
var flag = userReg.test(username)
if (!flag){
alert("请输入包含a的用户名")
return false
}
var password = $("#psw").val()
var repassword = $("#repsw").val()
if (password == "" || password != repassword){
alert("密码不能为空且两次输入密码应相等")
return false;
}
})
});
</script>
</head>
<body>
<h1>欢迎注册</h1>
<form action="MyServlet" method="get">
请输入用户名称:<input type="text" name="username" id="usn"><br>
请输入用户密码:<input type="password" name="userpassword" id="psw"><br>
请确认密码:<input type="password" name="userpassword" id="repsw"><br>
<input type="submit" value="提交信息" id="subm"><br>
<span style="color:red" id="span1">${requestScope.get("beused")}</span>
<span style="color:blue" id="span2">${requestScope.get("successful")}</span>
</form>
</body>
</html>
User工具类
一定一定要分清while和if的逻辑关系
package dao;
import bean.User;
import java.sql.SQLException;
import java.util.ArrayList;
public class UserDAOImpl extends BasicDAO implements UserDAO{
@Override
public boolean checkUsernameAndPassword(String username, String password) throws SQLException, NoSuchFieldException, InstantiationException, IllegalAccessException {
String sql = "select * from users";
BasicDAO basicDAO = new BasicDAO();
ArrayList<User> all = basicDAO.getAll(User.class, sql);
for (User u : all // 遍历
) {
while (username.equals(u.getUserName()) && password.equals(u.getPassword())){// 当用户名和密码都相同
return true;
}
}
return false;
}
// 注册之检验用户名是否被调用
public boolean checkUsername(String username) throws SQLException, NoSuchFieldException, InstantiationException, IllegalAccessException {
String sql = "select * from users";
ArrayList<User> all = getAll(User.class, sql);
for (User user : all) {
while (username.equals(user.getUserName())){
return true;// false表示未被调用
}
}
return false;
}
@Override
// 注册之添加用户到数据库
public boolean addUser(String username, String password) throws SQLException {
BasicDAO basicDAO = new BasicDAO();
String sql = "insert users(username,password) value(?,?);";
int update = basicDAO.update(sql, username, password);
if (update>0){
return true;
}else {
return false;
}
}
}