Java EE开发技术(Servlet整合JDBC银行管理系统-上)
目录
一、建库建表
二、创建web项目并创建包结构
三、User实体类
四、JDBCUtil工具类
五、测试
实例:基于Servlet技术实现银行管理系统
用户注册功能实现
撰写表单
撰写业务逻辑
业务逻辑校验通过第四部分撰写
服务端
dao包
效果
用户登录功能实现
撰写表单
撰写业务逻辑
服务端
dao包
效果
查询所有用户功能实现
撰写表单
撰写业务逻辑
服务端
dao包
一、建库建表
二、创建web项目并创建包结构
三、User实体类
对应user数据表,编写实体类,提供getter/setter方法,重写toString方法(生成即可)
四、JDBCUtil工具类
在com.tianshi.util包中创建JDBCutil工具类,简化JDBC开发过程
封装获取数据库连接方法如下:
package com.tianshi.util;import java.sql.*;/*
开发步骤:
* 1.私有化构造方法,防止实例化
* 2.提供公共的静态方法,可以通过类名直接调用
*
* 工具方法有两个:
* 1.获取数据库连接对象:getConnection()
* 2.释放资源:close()
*/
public class JDBCUtil {private JDBCUtil() {}//私有化构造方法,防止实例化//获取数据库连接对象public static Connection getConnection() {//外置生命Connection对象Connection conn = null;try{Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动//指定连接数据库的url 用户名 密码String url = "jdbc:mysql://127.0.0.1:3306/bank3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";String user = "root";String password = "123456";//获取连接对象赋值给connconn = DriverManager.getConnection(url, user, password);}catch(Exception e){e.printStackTrace();}return conn;}//释放资源public static void close(ResultSet rs, PreparedStatement ps, Connection conn){try {if (ps != null) ps.close();if (rs != null) rs.close();if (conn != null) conn.close();}catch (SQLException e){e.printStackTrace();}finally {rs = null;ps = null;conn = null;}}
}
五、测试
package com.tianshi.test;import com.tianshi.util.JDBCUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*
* 测试JDBCUtil类是否正常
* 业务需求:查询id为1的用户信息
*/
public class testJDBCUtil {public static void main(String[] args) {//声明对象Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try{//1.获取数据库连接conn = JDBCUtil.getConnection();//2.传输sql语句ps = conn.prepareStatement("SELECT * from User WHERE ID = ?");ps.setInt(1,1);//因为id是int类型,所以调用setInt方法//3.执行sql语句rs = ps.executeQuery();//4.处理结果集while(rs.next()){//获取当前便利的数据int id = rs.getInt("id");String name = rs.getString("username");String password = rs.getString("password");System.out.println(id+","+name+","+password);}} catch (SQLException e) {throw new RuntimeException(e);}finally {//5.释放资源JDBCUtil.close(rs,ps,conn);}}
}
注意jar包版本与Mysql的对应关系,版本不同连接方法有区别,低版本这样写:
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
//指定连接数据库的url 用户名 密码
String url = "jdbc:mysql://127.0.0.1:3306/bank3?useUnicode=true&characterEncoding=utf-8&useSSL=false";
实例:基于Servlet技术实现银行管理系统
用户注册功能实现
- 在项目web目录下创建regist.jsp注册页面,编写表单,要求包含注册信息(用户名、密码、确认密码、注册按钮)
- 在src目录下创建com.tianshi.web包
-
在com.tianshi.web包下创建RegistServlet类,映射请求路径为/regist,实现注册功能
-
获取注册表单请求参数;
-
校验参数非空,如参数为空则直接响应“注册数据不能为空!”提示信息;
-
校验两次密码是否一致,如不一致则直接响应”两次密码不一致!”提示信息;
-
参数校验通过,则编写JDBC代码实现用户注册数据插入mysql数据库;
-
注册成功后,请求重定向到登录页面
撰写表单
撰写业务逻辑
trim()会移除字符串两端的空格,进行校验时使用
package com.tianshi.servlet;import com.tianshi.service.UserService;
import com.tianshi.service.UserServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/regist")
public class RegistServlet extends HttpServlet {//创建service对象private UserService service = new UserServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// GET请求跳转到注册页面resp.sendRedirect(req.getContextPath() + "/regist.jsp");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 0、设置请求、响应的编码-防止中文乱码问题req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");// 1、获取注册表单请求参数String username = req.getParameter("username");String password = req.getParameter("password1");String password2 = req.getParameter("password2");System.out.println("请求参数:"+username+","+password+","+password2);// 2、参数校验if(username==null||username.trim().equals("")||password==null||password.trim().equals("")||password2==null||password2.trim().equals("")){resp.getWriter().write("不能为空");return;}if(!password.equals(password2)){resp.getWriter().write("两次密码不一致");return;}//3、boolean flag = service.regist(username,password);if(flag){//4、数据保存成功,则创建成功--重定向resp.sendRedirect(req.getContextPath()+"/login.jsp");}else{resp.getWriter().write("注册失败!");}}
}
业务逻辑校验通过第四部分撰写
注意:搞清楚业务逻辑的主线,抓住主干对分支进行完善,而不是先写服务端自主定义的函数
服务端
一般来说先,根据面现象对象编程的思想,先写接口,不关心具体怎么实现,但是编译器可以自动生成,所以依次建立两个文件在service包下即可,使用接口后点击让编译器自动在UserService中生成方法,本质是多态,和下面的同步创建
dao包
dao包中封装了对数据储存系统的访问操作,用于隔离数据的变化,因此数据在数据库的插入操作要在这里实现,和上面的同步创建
效果
成功跳转到下一个逻辑,不成功如下
用户登录功能实现
- 在项目web包下创建login.jsp页面,编写表单,包含用户信息(用户名、密码、登录按钮)
- 在com.tianshi.web包下创建LoginServlet类,映射请求路径为/login,实现登录功能
- 获取登录表单请求参数;
- 校验参数非空,如参数为空则直接响应“登录用户信息不能为空!”提示信息;
- 参数校验通过,则编写JDBC代码实现根据用户名和密码查询用户信息;
- 如步骤(3)未查询到数据,则说明用户信息不正确,通过请求转发到login.jsp登录页面;
- 如步骤(3)查询到数据,则说明用户信息正确,通过请求重定向到index.jsp系统首页。
撰写表单
撰写业务逻辑
服务端
dao包
效果
成功跳转到下一个逻辑,不成功重定向到登录页面
查询所有用户功能实现
在项目web目录下index.jsp首页添加超链接按钮,点击按钮后向/showUsers发起请求
在com.tianshi.service包下创建ShowUsersServlet类,实现查询所有用户信息功能,要求将所有用户信息显示到浏览器网页中。
- 编写JDBC代码实现查询所有用户信息
- 遍历结果集,获取用户信息
- 将用户信息显示到浏览器网页中