开启我的博客之路
第一篇博文,可能写的不好,各位看官请随意。
我正在做的事一个数据库课程设计
首先来看下登陆界面
还可以吧!其实这个界面是网上down下来的,jqury不怎么会用,做出来的界面不怎么样,所以就down一下,改了一部分。
然后我输入一个数据库中不存在的用户名密码,转到的是这个界面
直接给了一个看起来不怎么人性化的提示,刚开始学习不要介意!
确定了之后返回到登陆界面,输入一个正确的密码,跳转到如下界面
逻辑上超级简单,肯定有小伙伴吐槽题主有病!
其实不然,就这个东西我做了两天,不要笑,确实是有一个问题一直没有解决,后来才领会到。下面我就来说说我遇到的问题,希望对初学者有帮助,不要再犯我这样的错误了。先看看连接数据库的代码:
package jdbcConnection;
import java.sql.*;
public class JDBCconnection {
private final static String dbDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private final String url="jdbc:sqlserver://localhost:1433;DatabaseName=ProSaleManager";
private final String user="sa";
private final String paw="你自己的数据库登陆密码";
protected Connection con=null;
protected Statement stmt;
protected ResultSet rs;
public Connection getConnection() {
try {
Class.forName(dbDriver);
con=DriverManager.getConnection(url,user,paw);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public boolean executeUpdate(String sql){
int result=0;
if(con==null){
getConnection();
}
try{
Statement stmt=con.createStatement();
result=stmt.executeUpdate(sql);
if(result>0)
return true;
else
return false;
}catch(SQLException ex){
ex.printStackTrace();
System.out.println("executeUpdateerror!");
return false;
}
}
public ResultSet executeQuery(String sql){
try{
if(con==null)
getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
try{
rs=stmt.executeQuery(sql);
}catch(SQLException e){
System.out.print(e.getMessage());
e.printStackTrace();
}
}catch(SQLException e){
System.out.print(e.getMessage());
System.out.print("exceuteQueryerrot");
}
return rs;
}
public void closeAll(Connection conn, Statement stmt, ResultSet rs) {
// 若结果集对象不为空,则关闭
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若Statement对象不为空,则关闭
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若数据库连接对象不为空,则关闭
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
public static void main(String[] args) {
JDBCconnection con=new JDBCconnection();
con.getConnection();
ResultSet rs=null;
try{
rs=con.executeQuery("select * from Manager;");
while(rs.next()){
System.out.println(rs.getString("admin"));
System.out.println(rs.getString("password"));
}
}catch(SQLException e){
e.printStackTrace();
}
}
*/
}
这是把数据库的连接,增删查改,关闭封装成一个类。仔细一点就没问题了(一定要把jdbc包导入到项目中),这里也没什么好说的,就是要尝试写一个主函数测试一下,书上面这样提示,我觉得很有必要。然后就是测试之前一定要把数据库的服务打开,不然就算你代码再正确的也会报错。
然后我写了一个检查后台数据库数据返回给前台的一个类
package Login;
import salesDao.UserDao;
import jdbcConnection.JDBCconnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CheckUser extends UserActionForm implements UserDao {
public UserActionForm usercheck(String user, String psw) {
JDBCconnection Factory = new JDBCconnection();
Connection con = Factory.getConnection();
UserActionForm users = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "select * from Manager where admin=? and password=?";
ps = con.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, psw);
rs = ps.executeQuery();
if (rs.next()) {
users = new UserActionForm();
users.Setusername(user);
users.Setpassword(psw);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Factory.closeAll(con, ps, rs);
}
return users;
}
}
}
看到黑框框中的代码了吗?之前我把这段代码写进try里面了,后来想各种办法测试页面都会报错,为什么会这样呢?我在本页面写了一个主函数,测试后台数据库内的数据是否给到了users,这里是没有错误的,可是当我把user对象传到jsp页面验证和前台输入的是否一致时就会出错。这里我认为不要把这段代码写在try中,因为之前我们已经把连接数据库程序给封装起来了,如果连接出现问题,自然会有Exception抛出来,这里没有必要再多此一举。之前没有注意到这里,只是觉得这样写没有错,try里面的内容就不一定会被执行,程序没有跑到try中,如果users对象没有被创建,而返回了users,程序会怎样,所以应该写进try里面的内容要写进try中,但是也不是所有内容统统写进try中。
接下来再看看jsp中的代码:
<%@ page import="salesDao.UserDao" %>
<%@ page import="Login.CheckUser" %>
<%@ page import="Login.UserActionForm" %>
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="utf-8"%>
<%/*
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
*/
%>
登陆页面
<%
String Loginname=request.getParameter("username");
String Loginpaw=request.getParameter("password");
CheckUser check=new CheckUser();
UserActionForm user1=check.usercheck(Loginname,Loginpaw);
if(user1==null){
%>
<%
}else{
%>
<%
}
%>
这里也非常好理解,注意一定要把该导入的javal类或者包导入。好了,希望能给到小伙伴们一点帮助。