在上一个纯JSP模式的登陆注册系统当中,我们通过inc.jsp来保存数据库配置参数,在每一次需要调用数据库时都包含此文件,创建自己的数据库连接,然后执行不同的命令,返回相应的结果集或其他返回值,在每一次关于数据库操作的过程中我们都书写了重复的代码,进行了相似的操作,我们完全可以把这些代码抽象到JavaBean当中,在使用JSp来调用JavaBean,将会使代码的可读性增强,降低代码的重复,并且会提高系统的重用性。
首先书写JavaBean,对于一个普通的JavaBean来说,定义变量并添加getter/setter函数,也就是一个完整的JavaBean了。但是通常不仅仅包含这些,还要根据当前JavaBean的目的来添加独特的操作函数。本节课开发的DBAccess.java就是一个又各有自身目的的JavaBean,它的目的就是作为数据库操作的Javabean,不仅能够保存数据库的参数和变量,还能够进行数据库的操作。
这个模式的改变主要开发了两个JavaBean,一个是数据库处理类DBAccess.java ,另一个是业务逻辑类UserBean.java
比如,要进行数据库的操作,我们首先要创建数据库的链接,还有类似的更新SQL函数,查询SQl函数,本问题只是需要这两个就足够了。
重点修改了四个文件,
DBAccess.java
这个javaBean里面完成了所有有关数据库的操作,在UserBean.java当中的方法依次调用这里面的方法操作数据库,而那两个JSp页面依次调用UserBean的方法操作。
这样实现了对数据库操作的封装,实现了代码重用,尽量降低了jsp页面当中java代码的量以及完全消除了数据的操作,所有的st conn rs 都在DBAccess里面完成,这与老韩的还是有些不同,老韩的servlet控制器里面还是有相应的st rs conn已经关闭函数的。思路不同吧
工程训练那个项目也是采用的老韩的操作方式。
确实那些st rs conn 还有关闭函数,增删改查 try catch 都是应该在javaBean里面完成的,那样更好些
package com.gxm.jspandbean; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DBAccess { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/login"; String user = "root"; String password = "admin"; Connection conn = null; Statement st = null; ResultSet rs = null; public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Connection getConn() { return conn; } public void setConn(Connection conn) { this.conn = conn; } public Statement getSt() { return st; } public void setSt(Statement st) { this.st = st; } public ResultSet getRs() { return rs; } public void setRs(ResultSet rs) { this.rs = rs; } /* * @完成数据库的链接 * @return boolean */ public boolean creatConn(){ boolean flag = false; try{ Class.forName(driver); conn = DriverManager.getConnection(url,user,password); //也是,只有上一步正确执行之后,程序才能进入下一步 flag = true; }catch(Exception e){ e.printStackTrace(); } return flag; } /* * @更新数据库函数 * @return boolean */ public boolean update(String sql){ boolean flag = false; try{ st = conn.createStatement(); int res = st.executeUpdate(sql); if(0!=res){ flag = true; } }catch(Exception e){ e.printStackTrace(); } return flag; } /* * @完成数据库查询工作 * @return boolean */ public boolean query(String sql){ boolean flag = false; try{ st = conn.createStatement(); rs = st.executeQuery(sql); flag = true; }catch(Exception e){ e.printStackTrace(); } return flag; } /* * @结果集操作的next方法 * @return boolean */ public boolean next(){ boolean flag = false; try{ if(rs.next()) flag = true; }catch(Exception e){ e.printStackTrace(); } return flag; } /* * @当移动到目标行时,要取出某一列的值 * @param field 是字段 * @return String */ public String getValue(String field){ String value = null; try{ if(rs!=null){ value = rs.getString(field); } }catch(Exception e){ e.printStackTrace(); } return value; } public void close() { try{ if(rs!=null){ rs.close(); rs = null; } if(st!=null){ st.close(); st = null; } if(conn!=null){ conn.close(); conn = null; } }catch(Exception e){ e.printStackTrace(); } } }
UserBean.java
package com.gxm.jspandbean; //这样的话就真正的将数据库操作的步骤都交给一个文件了 //老韩那个还不是,他还是要每次都获取st rs 并且还要使用,还不是很好 public class UserBean { /* * * @param username * @param password */ public boolean isvalid(String username,String password){ boolean flag = false; DBAccess db = new DBAccess(); if(db.creatConn()){ String sql = "select * from users where username ='"+username+"' and password = '"+password+"' "; db.query(sql); if(db.next()){ flag = true; } db.close(); } return flag; } /* * @注册验证函数 检查用户名是否存在 */ public boolean isExist(String username){ boolean flag = false; DBAccess db = new DBAccess(); if(db.creatConn()){ String sql = "select * from users where username = '"+username+"'"; db.query(sql); if(db.next()){ System.out.println("查重是否有问题"); flag = true; } db.close(); } return flag; } /* * @增加一个用户 */ public boolean add(String username,String password){ boolean flag = false; DBAccess db = new DBAccess(); //每一次都要重新建立连接的 if(db.creatConn()){ String sql = "insert into users(username,password) values('"+username+"','"+password+"')"; if(db.update(sql)){ flag = true; } db.close(); } return flag; } }
registerCheck.jsp
<%@ page language="java" import="java.util.*,java.sql.*,com.gxm.jspandbean.*;" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; String email = request.getParameter("email"); String username = request.getParameter("username"); String password1 = request.getParameter("password1"); String password2 = request.getParameter("password2"); if(username == null||password1 == null|| password2 == null||!password1.equals(password2)){ response.sendRedirect("register.jsp"); } boolean flag = false; UserBean ub = new UserBean(); if(ub.isExist(username)){ //当然我们也是可以加上提示信息的 response.sendRedirect("register.jsp"); }else if(ub.add(username,password1)){ flag = true; response.sendRedirect("login.jsp"); } %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'registerCheck.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> </body> </html>
loginCheck.jsp
<%@ page language="java" import="java.util.*,java.sql.*,com.gxm.jspandbean.*;" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; String username = request.getParameter("username"); String password = request.getParameter("password"); //这就是在服务器端完成的,javascript也是可以完成这个功能的,不过就是在客户端完成的了,减轻了服务器的压力 if(username == null||password ==null){ response.sendRedirect("login.jsp"); } boolean flag = false; UserBean ub = new UserBean(); if(ub.isvalid(username,password)){ flag = true; } if(flag){ response.sendRedirect("welcome.jsp?user="+username); }else{ response.sendRedirect("login.jsp?info=error"); } %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'loginCheck.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> </body> </html>