【Web】Servlet有条理的实现层次分明的注册及注销
前言
暑期项目实习第四课,用IDEA写个连接Mysql实现注册及注销的层次分明的小项目。
导入必要的Jar包
首先在之前第三课的servlet的项目下,新建几个文件夹,让项目更加层次化。
将jar包放入lib文件夹。
在idea中右击jar包导入文件至Library。
紧接着在Project Structure中选择Artifacts的Fix修复添加相关东西。
设置数据库
在第二课 【JAVA】连接Mysql的简单登陆注册实例的user表基础上添加age字段。
Code
建立Model下的User实体类
写下各个属性(与MYSQL数据表字段一一对应)后,快速引用各种方法(按住键盘上的alt + insert键 或者 右键选择Generate)。
package com.zr0629.model;
public class User {
private int id;
private String name;
private String password;
private String age;
//按住键盘上的alt + insert键(或者右键选择Generate) 选择getter and setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age='" + age + '\'' +
'}';
}
}
建立util下的DBUtil方法类
含义及方法意义等参考第二课 【JAVA】连接Mysql的简单登陆注册实例。
package com.zr0629.util;
import java.sql.*;
public class DBUtil {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("连接数据库");
//创建连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/abc?useSSL=false&serverTimezone=Asia/Shanghai", "root", "root");
System.out.println("连接成功!");
return connection;
}
public static void closeAll(ResultSet rs, Statement stmt,Connection conn)throws SQLException{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if (conn!=null){
conn.close();
}
}
}
建立dao下的UserDao方法类
package com.zr0629.dao;
import com.zr0629.model.User;
import com.zr0629.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UserDao { //与数据库打交道的Dao层
public int add(User user){ //注册功能
Connection connection = null;
PreparedStatement pstmt = null;
int count = 0;
try{
connection = DBUtil.getConnection();
System.out.println("连接成功");
//获得执行sql的Statement对象
pstmt = connection.prepareStatement("insert into user (name,password,age) values (?,?,?)");
pstmt.setString(1,user.getName());
pstmt.setString(2,user.getPassword());
pstmt.setString(3,user.getAge());
//执行sql,获得结果
count = pstmt.executeUpdate();
System.out.println("insert操作:"+count);
return count;
}catch (Exception e){
e.printStackTrace();
}finally {
try {
DBUtil.closeAll(null,pstmt,connection); //由于没有结果集所以第一项为空
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return count;
}
public int del(User user){ //注销功能
Connection connection = null;
PreparedStatement pstmt = null;
int count = 0;
try{
connection = DBUtil.getConnection();
System.out.println("连接成功");
//获得执行sql的Statement对象
pstmt = connection.prepareStatement("DELETE FROM `user` WHERE name=? AND password=? AND age = ?");
pstmt.setString(1,user.getName());
pstmt.setString(2,user.getPassword());
pstmt.setString(3,user.getAge());
//执行sql,获得结果
count = pstmt.executeUpdate();
System.out.println("delete操作:"+count);
return count;
}catch (Exception e){
e.printStackTrace();
}finally {
try {
DBUtil.closeAll(null,pstmt,connection); //由于没有结果集所以第一项为空
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return count;
}
}
建立service下的UserService方法类
该层下接dao层上连servlet层,故通过dao层返回类型来编写方法。(代码量并不多,实现了结果搬运,可称为“搬运工”层)。
package com.zr0629.service;
import com.zr0629.dao.UserDao;
import com.zr0629.model.User;
public class UserService {
UserDao userDao = new UserDao();
public int add(User user){ //注册功能
System.out.println("service中add方法被调用");
return userDao.add(user);
}
public int del(User user){ //注销功能
System.out.println("service中del方法被调用");
return userDao.del(user);
}
}
建立servlet下的AddServlet方法类
package com.zr0629.servlet;
import com.zr0629.model.User;
import com.zr0629.service.UserService;
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.SQLException;
public class AddServlet extends HttpServlet {
UserService userService = new UserService(); //实例化UserService
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //重写父类HttpServlet中的doPost
System.out.println("执行了doPost");
String method = req.getParameter("method"); //获取jsp页面中的method字段的值
if(method.equals("save")){ //save只是自己定义的 如果输入save则实现功能
insert(req,resp);
}else if(method.equals("delete")){
delete(req,resp);
}
}
public void insert(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException{
//建立需要传入的变量类型的实例User
User user = new User();
//从前端传入值
String name = req.getParameter("name");
String password = req.getParameter("password");
String age = req.getParameter("age");
//将值加入实例化对象中
user.setName(name);
user.setPassword(password);
user.setAge(age);
System.out.println(user); //控制台输出看看是否达到我们的要求 后期实现功能后可删除 仅便于调试查错
//调用方法
int count = userService.add(user);
if(count>0){ //如果成功插入了 1+N 行数据
resp.sendRedirect("/index.jsp"); //成功就跳转到主页
}else {
resp.getWriter().write("<h2>failed</h2>"); //失败就显示failed
}
}
public void delete(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
//建立需要传入的变量类型的实例User
User user = new User();
//从前端传入值
String name = req.getParameter("name");
String password = req.getParameter("password");
String age = req.getParameter("age");
//将值加入实例化对象中
user.setName(name);
user.setPassword(password);
user.setAge(age);
System.out.println(user); //控制台输出看看是否达到我们的要求 后期实现功能后可删除 仅便于调试查错
//调用方法
int count = userService.del(user);
if(count>0){ //如果删除成功了 1+N 行数据
resp.sendRedirect("/index.jsp"); //成功就跳转到主页
}else {
resp.getWriter().write("<h2>failed</h2>"); //失败就显示failed
}
}
}
建立web下的index.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>登陆</h1>
<form action="/login" method="post">
name:<input name="name" type="text">
password:<input name="password" type="password">
<input type="submit" value="login">
</form>
<a href="add.jsp">注册</a>
<a href="delete.jsp">注销</a>
</body>
</html>
建立web下的add.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<h1>注册</h1>
<body>
<form action="/add?method=save" method="post"> <!-- 对应AddServlet中的if语句-->
name:<input name="name" type="text">
password:<input name="password" type="password">
age:<input name="age" type="text">
<input type="submit" value="注册" >
</form>
</body>
</html>
建立web下的delete.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注销账户</title>
</head>
<h1>注销</h1>
<body>
<form action="/del?method=delete" method="post"> <!-- 对应AddServlet中的if语句-->
name:<input name="name" type="text">
password:<input name="password" type="password">
age:<input name="age" type="text">
<input type="submit" value="注销" >
</form>
</body>
</html>
最终效果图
打开地址 http://localhost:8081/ 跳转至 index.jsp 主页,点击注册按钮。
跳转至 http://localhost:8081/add.jsp 注册页面,输入合理的数值使其插入数据库。
点击注册后返回 index.jsp 主页,并且数据库中出现该数据。
点击注销,跳转至 http://localhost:8081/delete.jsp 注销页面,输入与注册时相同的值点击注销按钮使其从数据库删除。
点击注销按钮,返回主页则为删除成功,否则显示failed页面
name = CSDNx的数据已从数据库删除
常见问题
点击注册后跳转到failed并非index的主页
经过调试找到了问题在这,”连接数据库“控制台正常输出了,但是"连接成功!"未得到输出。
查看控制台报错信息得出需要加上时区及**.cj**