这是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);
可是它不跳进去执行,如何是好,大家帮帮忙,十分感谢!
<%@ 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);
可是它不跳进去执行,如何是好,大家帮帮忙,十分感谢!
<jsp:useBean id="connection" scope="page" class="db.ConnectionToAccess"/>
先不用看看, 把db.ConnectionToAccess类的代码直接写到页面上吧
这句改成
sql+=" and password='"+strupwd+"'";试试
另外提醒你,验证登陆身份最好不要这样写SQL,防止sql注入,
应该先查库里有没有对应的用户,不要验证密码,如果有这个用户,再把库里这个用户的密码取出来与输入的密码比较,看是否匹配,这样安全一点
/*String sql="select * from check where name=aaa and password=aaa";*/
句话之后把sql打印出来看看有没有问题
out.println(sql);
应该是少了个空格,
sql="select * from check where name=aaaand password=aaa"
~
也就是我上面说的
sql+="and password='"+strupwd+"'";
不明白你为何要这样写,为了换行?这样写就调出你的sql在数据库里执行一下,
这样写的末尾和开头最好加上空格
我用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这几个数字输出
到底问题在哪?
我就算写成一个语句如:
String sql="select * from check where name=aaa and password=aaa";
也一样无法进入IF语句
我数据库的确有一个用户名和密码均为aaa的
可就是不进入执行
问题出在哪?
你输入的内容和你数据库的内容不匹配
你数据库里的aaa两边是不是有空格只类的?比如在sqlserver里面如果是char类型的你插入的数据后面会有空格补满长度的,是不是你出了类似这样的问题?
都是字母, 肯定不会是编码问题,程序也没错,看看数据库吧
如果你程序无法运行可能是别的问题,但你说只有if语句里面不能运行,那明显是你的语句没有查到数据啊
String sql="select * from check where name=aaa and password=aaa";你是字符型的数据,aaa要加''的
select * from check where name='aaa' and password='aaa'
/*String struid=(String)request.getAttribute("uid");
String strupwd=(String)request.getAttribute("upwd");*/
执行,结果执行到
catch(SQLException ex)
{
out.println(ex.getMessage());
}
抛出异常,内容如下:[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序可是我不明白,这是怎么回事,我明明指定了数据源为check,驱动:sun.jdbc.odbc.JdbcOdbcDriver
却有这样的提示?
而我用同样的代码,用一个类Test来测试却没有问题,可以返回访问到的数据,这是怎么了?
奇怪,谁能帮帮我,十分感谢!!!
<!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");
}
%>
1 出现异常:当while(rs.next())出现异常
2 SQL书写错误
3 建议你最好在JB或eclipse环境中调试下
现在找到了问题,我把连接数据库代码按照 afengonline(我是阿风) 的建议入到了login.jsp
执行,结果执行到
catch(SQLException ex)
{
out.println(ex.getMessage());
}
抛出异常,内容如下:[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序可是我不明白,这是怎么回事,我明明指定了数据源为check,驱动:sun.jdbc.odbc.JdbcOdbcDriver
却有这样的提示?
而我用同样的代码,用一个类Test来测试却没有问题,可以返回访问到的数据,这是怎么了?
奇怪,谁能帮帮我,十分感谢!!!
一直没解决!
第一个问题我建议你把页面显示代码和java代码分开
再测试!
要注意数据库中的字符类型和程序中的要一直!特别注意编码方式!
zouzhiqiangzzq() 朋友,你说的注意编码方式是哪种方式,我的代码里面用的都是gb2312