1.登录业务的完善
1.1后端控制页面跳转
if (rs.next()) {
System.out.println("登陆成功");
request.setAttribute("name", username);
request.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(request, response);
} else {
System.out.println("登录失败,密码或用户名错误");
request.setAttribute("msg", "用户名密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
1.2 前端给出提示信息
<h5>${msg}</h5> <br> //JSTL表达式的运用
2.注册业务的实现
2.1 后端
package controller;
import java.io.IOException;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用户注册
*
* @author 路飞
*
*/
@WebServlet("/register")
public class RegisterController extends HttpServlet {
private static final String DRIVENAME = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/qianli?useUnicode=true&characterEncoding=UTF-8";
private static final String USER = "root";
private static final String PASSWORD = "123456";
private static ResultSet rs = null;
private static Connection conn = null;
private static PreparedStatement ps = null;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
try {
Class.forName(DRIVENAME).newInstance();
conn = DriverManager.getConnection(URL, USER, PASSWORD);
String sql = "INSERT INTO users VALUES(DEFAULT,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
int index = ps.executeUpdate();
if (index > 0) {
System.out.println("注册成功");
request.setAttribute("msg", "注册成功");
request.getRequestDispatcher("login.jsp").forward(request, response); //请求转发
} else {
System.out.println("登录失败");
request.setAttribute("msg", "登录失败");
request.getRequestDispatcher("register.jsp").forward(request, response);
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2 前端
注册页面
<h1>用户注册</h1>
<form action="${pageContext.request.contextPath}/register" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>${msg}
主页
<h1> ${name}登陆成功</h1>
2.3 讲解WEB-INF文件夹和WebContent文件夹
3.连接池
3.1 作用
正常访问数据库的过程中,每次访问都需要创建新的连接,这会消耗大量的资源;连接池的就是为数据库连接建立一个“缓冲区”,预先在缓冲池中放入一定数量的连接对象,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去;且连接池允许多个客户端使用缓存起来的连接对象,这些对象可以连接数据库,它们是共享的、可被重复使用的;使用连接池可以节省大量资源,提高程序运行速度。
3.2原理
先初始化一定的数据库连接对象,并且把这些连接保存在连接池中。这些数据库连接的数量是由最小数据库连接数来设定的。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。当程序需要访问数据库的时候,如果连接池中有空闲的连接,可直接得到一个连接;如果连接池对象中没有空闲的连接,且连接数没有达到最大,会创建一个新的连接从连接池中取出一个连接,数据库操作结束后,再把这个用完的连接重新放回连接池。
3.3常用连接池
JDBC,C3P0,Druid,Tomcat,Hikari(号称最强,springboot默认连接池)
3.4 连接池的使用
配置properties文件
# 数据库驱动|不填写druid会自动识别
driverClassName=com.mysql.jdbc.Driver
# 访问数据库连接
url=jdbc:mysql://localhost:3306/qianli?useUnicode=true&characterEncoding=UTF-8
# 数据库用户名
username=root
# 数据库密码
password=123456
#初始化连接数
initialSize=5
#最大连接池数量
maxActive=10
#获取连接时最大等待时间,单位毫秒
maxWait=3000
创建DruidUtils数据库连接工具类
package com.itql.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/**
* Druid数据库连接池工具类的设计
* @author 路飞
*
*/
public class DruidUtils {
private static ResultSet rs = null;
private static PreparedStatement ps = null;
private static Connection connection;
private static DataSource dataSource = null;
static {
try {
Properties p = new Properties();
p.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
DruidDataSourceFactory druidDataSourceFactory = new DruidDataSourceFactory();
dataSource = druidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static void close(Connection connection, PreparedStatement ps, ResultSet resultSet) {
// 代码的严谨性
try {
if (resultSet != null) {
resultSet.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
加入log4j配置文件
log4j.rootCategory=DEBUG, CONSOLE ,LOGFILE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %p %m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=F:/qianli.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n
使用方法
DruidUtils.getConnection() //创建连接
DruidUtils.close(conn, ps, rs); //关闭连接