总体思想
前言
在我第一次进行jsp连接数据库时,第一步不知道怎么下手,例如,怎么连接,如何判断,又怎么把判断的结果返回,又是怎么处理判断结果等等,遂总结如下。
文件路径如下
src/
└── com/
└── humc/
├── controller/ # 控制器层
│ ├── LoginServlet # 登录控制器
│ ├── LogoutServlet # 登出控制器
│ └── RegisterServlet # 注册控制器
│
├── dao/ # 数据访问层
│ ├── UserDao # 用户数据访问接口
│ └── impl/ # 实现类子包
│ └── UserDaoImpl # UserDao接口实现
│
├── model/ # 数据模型
│ └── User # 用户实体类
│
└── util/ # 工具类
├── DBUtil # 数据库工具类
└── db.properties # 数据库配置文件
内容准备
1.登录注册界面
对下面这个登录注册界面进行数据库连接
登录页面
<h3>登录界面</h3>
<form method="POST" action="LoginServlet">
<div>
<label>账号:</label>
<input type="text" name="username" placeholder="请输入用户名">
</div>
<div>
<label>密码:</label>
<input type="password" name="password" placeholder="请输入密码">
</div>
<div>
<input type="submit" value="登录">
<button type="button" id="registerBtn">注册</button>
</div>
</form>
注册界面
<form action="RegisterServlet" method="post">
<div>
<label>用户名</label>
<input type="text" name="username" required placeholder="请输入用户名">
</div>
<div>
<label for="password">密码</label>
<input type="password"name="password" required placeholder="请输入密码(至少6位)">
</div>
<div>
<label>确认密码</label>
<input type="password" name="confirmPassword" required placeholder="请再次输入密码">
</div>
<button type="submit">立即注册</button>
</form>
1.数据库连接文件
1. db.properties文件
存储数据库的相关信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/root?useSSL=false&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
三个root分别为数据库名,MySql用户名,密码
2. 读取文件进行连接
public class DBUtil {
private static String url;
private static String username;
private static String password;
static {
try (InputStream is =
DBUtil.class.getClassLoader().getResourceAsStream("db.properties"))
{
Properties props = new Properties();
props.load(is);
url = props.getProperty("jdbc.url");
username = props.getProperty("jdbc.username");
password = props.getProperty("jdbc.password");
Class.forName(props.getProperty("jdbc.driver"));
} catch (Exception e) {
throw new RuntimeException("数据库配置加载失败", e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.登录界面判断
这个界面的主要作用是获取登录界面的信息,然后将它们交给数据库相应的代码进行判断,等待判断完成后,再进行接收返回的判断结果,然后进行相应判断结果的界面跳转。UserDao是一个接口,里面包括登录数据判断的函数,以及在注册时使用的名称查找方法。
1.获取数据
使用getParameter获取POST请求返回的表单数据。
String username = request.getParameter("username");
String password = request.getParameter("password");
2.对页面数据进行数据库判断。
定义UserDao,调用UserDaoImpl文件中的findByUsername方法进行查找昵称并返回,使得show.jsp页面获取并显示。
UserDao userDao = new UserDaoImpl();
定义isValid,调用UserDaoImpl文件中的validateUser方法,目的是判断获取页面的username和password是否和数据库的相匹配,并返回布尔值(true/false)以供下面判断
boolean isValid = userDao.validateUser(username,password);
if判断,如果为真,将查找到的usernsme存入到user中,并通过session方法存入到username中,最后返回相应页面。
if(isValid) {
User user = userDao.findByUsername(username);
HttpSession session = request.getSession();
session.setAttribute("username", user);
// 跳转到主页
request.getRequestDispatcher("/index.jsp").forward(request,response);
}else {
System.out.println("Invalid username or password");
}
4. 注册界面判断
同登录界面一样,获取数据,判断结果进行页面跳转,三个处理函数在同一个类中,没什么别的不同
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
UserDao userDao = new UserDaoImpl();
boolean isaddUser = userDao.addUser(username,password);
if(isaddUser) {
request.getRequestDispatcher("/index.jsp").forward(request,response);
}else{
}
}
}
5. 处理登录界面数据
先定义一个登录的sql语句,然后判断数据库连接,预编译sql语句,没有问题就try,否则就catch出去,里面就是使用PreparedStatementAPI的函数setString对数据库的中的数据对应,以ResultSet类型调用executeQuery函数,并返回到rs中,最后使用next()返回布尔值。
public boolean validateUser(String username, String password) {
String sql = "SELECT id FROM tb_user WHERE username = ? AND password = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
6.处理注册界面数据
同登录界面的判断类似,就是sql语句不同,不过在这个判断使用的是executeUpdate函数执行插入操作,返回整数值,通过判断返回整数是否大于0进行布尔返回
public boolean addUser(String username, String password) {
String sql = "INSERT INTO tb_user(username, password) VALUES(?,?)";
UserDao userDao = new UserDaoImpl();
User result = userDao.findByUsername(username);
if(result != null) {
return false;
}else{
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, username);
stmt.setString(2, password);
int affectedRows = stmt.executeUpdate();
return affectedRows > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
总结
对数据库的操作本质还是在JAVA文件中插入sql语句进行执行,对于我第一次连接时,迷茫的主要是需要准备什么来进行连接,几个文件,文件路径等等