myeclipse编写的一个简单登陆程序

来源:互联网 发布:游戏帧数显示软件 编辑:程序博客网 时间:2024/06/06 03:07

 开启我的博客之路

第一篇博文,可能写的不好,各位看官请随意。

我正在做的事一个数据库课程设计

首先来看下登陆界面

还可以吧!其实这个界面是网上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+"/";
*/
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>登陆页面</title>

 </head>
 
<body>
<%
    String Loginname=request.getParameter("username");
 String Loginpaw=request.getParameter("password");
 CheckUser check=new CheckUser();
 UserActionForm user1=check.usercheck(Loginname,Loginpaw);
 if(user1==null){

%>
<script type="text/javascript">
 alert("用户名密码错误!请重新输入");
 open("../ProductSaleManagement/Login.jsp","_self");
</script>
 
<%
 }else{
  
%>
 <jsp:forward page="Managerpage.jsp"/>
<%
}
%>

</body>
</html>
 
这里也非常好理解,注意一定要把该导入的javal类或者包导入。好了,希望能给到小伙伴们一点帮助。


1 0