在上一个纯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>