这是login.html的代码:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>用户登录</title>
</head><body>
<center>
<form action="login.jsp" method="post">
<input type="text" name="uid" maxlength="8" style="width:150" /><br />
<input type="password" name="upwd" maxlength="8" style="width:150" /><br />
<input type="submit" value="登录" />
<input type="reset" value="取消" /></center>
</body>
</html>
这是login.jsp的代码<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<jsp:useBean id="connection" scope="page" class="db.ConnectionToAccess"/>
<%--<jsp:useBean id="ggg" scope="session"--%>
<%
 /*String struid=(String)request.getAttribute("uid");
 String strupwd=(String)request.getAttribute("upwd");*/
 
 String struid=new String(request.getParameter("uid").getBytes("ISO8859_1"),"GBK");
  String strupwd=new String(request.getParameter("upwd").getBytes("ISO8859_1"),"GBK"); 
 String sql ="select * from check where name ='"+struid+"'";
        sql+="and password='"+strupwd+"'";
/*String sql="select * from check where name=aaa and password=aaa";*/
try{
ResultSet result = connection.executeQuery(sql);
out.println("66666");
out.println(struid);
out.println(strupwd);
if(result.next())
{
out.println("77777");
session.setAttribute("login","ok");
session.setMaxInactiveInterval(-1);
out.println("77777");
}
} catch(Exception e)
{
e.printStackTrace();

 }
 finally
 {
 /*result.close();*/
 out.println("88888");
 }
 %>
 login.jsp里面的out.println()输出都是临时性的,用于判断是否访问正常执行其它语句,结果我发现
if(result.next())
{
out.println("77777");
session.setAttribute("login","ok");
session.setMaxInactiveInterval(-1);
out.println("77777");
}
这里面不进去执行的,因为它没有输入77777,就是没有执行out.println("77777");
另外再贴出login.jsp用到的db.ConnectionToAccess的代码:
// Java Document
package db;
import java.sql.*;
public class ConnectionToAccess{
 String sDBDriver ="sun.jdbc.odbc.JdbcOdbcDriver";
 String sConnStr="jdbc:odbc:check";
 Connection conn = null;
 ResultSet rs = null;
 public ConnectionToAccess()
 {
   try{
        Class.forName(sDBDriver);
   }
   catch( java.lang.ClassNotFoundException e)
   {
      System.out.println(e.getMessage());
   }
 }
 public ResultSet executeQuery(String sql)
 {
    try{
   conn=DriverManager.getConnection(sConnStr,"","");
   Statement stmt = conn.createStatement();
   rs=stmt.executeQuery(sql);
}
catch(SQLException ex)
{
    System.out.println(ex.getMessage());
}
catch(Exception e)
{
e.printStackTrace();
}
 return rs;
 }
}我用的是ACCESS数据库,数据源和名称都设置好了,没有问题
为了验证是否问题出在这,我写了一个测试程序:
import java.sql.*;public class Test{
 
 public static void main(String[] args){
  String sDBDriver ="sun.jdbc.odbc.JdbcOdbcDriver";
 String sConnStr="jdbc:odbc:check";
 Connection conn = null;
 ResultSet rs = null;
 
   try{
        Class.forName(sDBDriver);
   conn=DriverManager.getConnection(sConnStr,"","");
   Statement stmt = conn.createStatement();
   rs=stmt.executeQuery("select * from check");
   while(rs.next())
   {
     System.out.println(rs.getString(1));
     System.out.println(rs.getString(2));
     //System.out.println(rs.getint());
  }
  rs.close();
  conn.close();
}
catch(Exception ex)
{
    ex.printStackTrace();
}
 }
}结果是可以返回查询结果,所以问题我都不知道出错在哪,哪位好心人帮忙解决吧,谢谢了!
就是说,为何不执行
if(result.next())
{
out.println("77777");
session.setAttribute("login","ok");
session.setMaxInactiveInterval(-1);
out.println("77777");
}
这个里面的才是我想要的,用户名和密码在ACCESS有保存,当登陆时判断存在就执行这个:
session.setAttribute("login","ok");
session.setMaxInactiveInterval(-1);
可是它不跳进去执行,如何是好,大家帮帮忙,十分感谢!

解决方案 »

  1.   

    循环时,尝试把if 改成while看看。
      

  2.   

    看你jsp中java脚本已经不少了,这句
    <jsp:useBean id="connection" scope="page" class="db.ConnectionToAccess"/>
    先不用看看, 把db.ConnectionToAccess类的代码直接写到页面上吧
      

  3.   

    sql+="and password='"+strupwd+"'";
    这句改成
    sql+=" and password='"+strupwd+"'";试试
    另外提醒你,验证登陆身份最好不要这样写SQL,防止sql注入,
    应该先查库里有没有对应的用户,不要验证密码,如果有这个用户,再把库里这个用户的密码取出来与输入的密码比较,看是否匹配,这样安全一点
      

  4.   

    你可以在
    /*String sql="select * from check where name=aaa and password=aaa";*/
    句话之后把sql打印出来看看有没有问题
    out.println(sql);
    应该是少了个空格,
    sql="select * from check where name=aaaand password=aaa"
                                           ~
    也就是我上面说的
      

  5.   

    String sql ="select * from check where name ='"+struid+"'";
            sql+="and password='"+strupwd+"'";
    不明白你为何要这样写,为了换行?这样写就调出你的sql在数据库里执行一下,
    这样写的末尾和开头最好加上空格
      

  6.   

    PowerJason() 
    我用while也不行,无法执行里面的语句
    afengonline(我是阿风) 
    这样是为了测试是不是连接数据库有问题,可是我下面写了一个测试连接语句的Test的类,结果是可以正常返回
    tenghongc(洋锅)
    我用了你说的方法来调试,却依然无法进入IF判断语句执行,
    我的ACCESS数据库里面有一个用户aaa,密码也是aaa
    我把/*String sql="select * from check where name=aaa and password=aaa";*/
    的注释去掉,把原来的
    String struid=new String(request.getParameter("uid").getBytes("ISO8859_1"),"GBK");
      String strupwd=new String(request.getParameter("upwd").getBytes("ISO8859_1"),"GBK");
    注释掉
    然后用
    out.println(sql);
    打印显示
    输出内容如下:
    select * from check where name=aaa and password=aaa 
    这样应该说明SQL语句没有错误了,
    又因为我数据库里面已经有相应的用户和密码,按里说应该进入IF判断了,可是仍然无法进入,就是说没有7777这几个数字输出
    到底问题在哪?
      

  7.   

    huazi4995(華仔) 
    我就算写成一个语句如:
    String sql="select * from check where name=aaa and password=aaa";
    也一样无法进入IF语句
    我数据库的确有一个用户名和密码均为aaa的
    可就是不进入执行
    问题出在哪?
      

  8.   

    不是没有进入if语句,是没有查到记录,所以才不会执行的啊
    你输入的内容和你数据库的内容不匹配
    你数据库里的aaa两边是不是有空格只类的?比如在sqlserver里面如果是char类型的你插入的数据后面会有空格补满长度的,是不是你出了类似这样的问题?
    都是字母, 肯定不会是编码问题,程序也没错,看看数据库吧
    如果你程序无法运行可能是别的问题,但你说只有if语句里面不能运行,那明显是你的语句没有查到数据啊
      

  9.   

    啊,我发现个问题
    String sql="select * from check where name=aaa and password=aaa";你是字符型的数据,aaa要加''的
    select * from check where name='aaa' and password='aaa'
      

  10.   

    另外你直接用这个就可以了,不需要用你多加编码的那个
     /*String struid=(String)request.getAttribute("uid");
     String strupwd=(String)request.getAttribute("upwd");*/
      

  11.   

    现在找到了问题,我把连接数据库代码按照 afengonline(我是阿风) 的建议入到了login.jsp
    执行,结果执行到
    catch(SQLException ex)
    {
        out.println(ex.getMessage());
    }
    抛出异常,内容如下:[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序可是我不明白,这是怎么回事,我明明指定了数据源为check,驱动:sun.jdbc.odbc.JdbcOdbcDriver
    却有这样的提示?
    而我用同样的代码,用一个类Test来测试却没有问题,可以返回访问到的数据,这是怎么了?
    奇怪,谁能帮帮我,十分感谢!!!
      

  12.   

    我把整理了的login.jsp源码贴出来,请大家帮帮忙<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,java.sql.*" errorPage="" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <%--<jsp:useBean id="conn" scope="page" class="db.ConnectionToAccess"/>--%>
    <%--<jsp:useBean id="ggg" scope="session"--%>
    <%
    String sDBDriver ="sun.jdbc.odbc.JdbcOdbcDriver";
     String sConnStr="jdbc:odbc:check";
     Connection conn = null;
     ResultSet rs = null;
     String sql="select * from check";
       try{
            Class.forName(sDBDriver);
    out.println("Class.forName(sDBDriver);");
       }
       catch( java.lang.ClassNotFoundException e)
       {
          out.println(e.getMessage());
      out.println("java.lang.ClassNotFoundException e");
       }
         try{
       conn=DriverManager.getConnection(sConnStr,"","");
       Statement stmt = conn.createStatement();
       rs=stmt.executeQuery(sql);
    }
    catch(SQLException ex)
    {
        out.println(ex.getMessage());
    out.println("ex.getMessage()");
    }

    out.println(sql);
    try{
    out.println("66666");
    while(rs.next())
    {
    out.println(rs.getString(1));
    out.println("77777");
    session.setAttribute("login","ok");
    session.setMaxInactiveInterval(-1);
    out.println("77777");
    }
    } catch(Exception e)
    {
    e.printStackTrace();

     }
     finally
     {
     out.println("88888");
     }
     %>
      

  13.   

    你的ODBC源连接的数据库的密码设了没有了,检查一下,密码要一直,这种问题只有自己解答
      

  14.   

    你把JBuilder关掉,在把它的配置文件全部删掉,在打开。如果还不可以的话,就只有重新启动机器了。
      

  15.   

    看你现在贴出来的代码,初步分析是查询的结果为空,有以下几种可能:
    1 出现异常:当while(rs.next())出现异常
    2 SQL书写错误
    3 建议你最好在JB或eclipse环境中调试下
      

  16.   

    不行啊,我重启电脑,重启TOMCAT,由WIN2003的开发环境换成WINXP,都是不行,还是如我上面的回复一样:
    现在找到了问题,我把连接数据库代码按照 afengonline(我是阿风) 的建议入到了login.jsp
    执行,结果执行到
    catch(SQLException ex)
    {
        out.println(ex.getMessage());
    }
    抛出异常,内容如下:[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序可是我不明白,这是怎么回事,我明明指定了数据源为check,驱动:sun.jdbc.odbc.JdbcOdbcDriver
    却有这样的提示?
    而我用同样的代码,用一个类Test来测试却没有问题,可以返回访问到的数据,这是怎么了?
    奇怪,谁能帮帮我,十分感谢!!!
      

  17.   

    你的第二个问题我也遇到了!
    一直没解决!
    第一个问题我建议你把页面显示代码和java代码分开
    再测试!
    要注意数据库中的字符类型和程序中的要一直!特别注意编码方式!
      

  18.   

    谢谢各位朋友,问题依旧,到底错在哪?
    zouzhiqiangzzq() 朋友,你说的注意编码方式是哪种方式,我的代码里面用的都是gb2312
      

  19.   

    你可以把页面里的程序都放到BEAN里去完成。这样子就不用过多的调试页面。