我正面临一个问题,我不知道它是怎么回事...... 我在JSP页面中创建了一个小的scriptlet来检查一个简单的条件,如果有一个会话然后它会做一些事情,如果不是它应该只重定向页面。 但是我发现的事情是真的无法解释的......如果条件做的事情真的很奇怪!
这是一个示例代码:
<%
boolean err = false;
if(session.getAttribute("id") != null)
{
cus_id = session.getAttribute("id").toString();
err=false;
}else err=true;
out.println(err);
if (err) out.println("<br>There is no session<br>");
//if(!err) ############ where it goes completely wrong.##############
if(1==2)
{
statement = "SELECT * FROM flight WHERE fl_code = '"+fco+"'";
flight = getData(statement);
statement = "SELECT * FROM tickets WHERE tik_cus_id ='"+cus_id+"' AND tik_fl_id ='"+flight[0][0]+"'";
ticket = getData(statement);
if(ticket.length == 0)
{
statement = "INSERT INTO tickets VALUES(null,'"+ session.getAttribute("id")+
"','"+flight[0][0]+
"','"+cls+"','"+seat+
"','"+adul+"','"+chil+
"','"+infa+"','"+pric+"','N')";
lastId = insertData(statement);
}
if(ticket.length==4) //if error occurs
{
out.println("<br><br>"+ticket[0]+"<hr>");
out.println(ticket[1]+"<br>");
out.println(ticket[2]+"<br>");
out.println(ticket[3]+"<br>");
}
response.sendRedirect("../../confirm.jsp?fco="+flight[0][0]);
} else out.println("no session");//else response.sendRedirect("../../login.jsp");
%>
当我指向的地方附近的条件是if(!err)
时,我收到此错误
`rg.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 50 in the jsp file: /scripts/jsp/confirm.jsp
The local variable cus_id may not have been initialized
47: statement = "SELECT * FROM flight WHERE fl_code = '"+fco+"'";
48: flight = getData(statement);
49:
50: statement = "SELECT * FROM tickets WHERE tik_cus_id ='"+cus_id+"' AND tik_fl_id ='"+flight[0][0]+"'";
51: ticket = getData(statement);
52:
53: if(ticket.length == 0)`
这是显而易见的,因为没有会话,cus_id
来自会话。
但是当我创造条件if(1==2)
时,这是输出:
true
There is no session
no session
正如你所看到的那样没有会话..我100%确定我没有会话,但是当条件为if(!err)
时(所以当err为false时,如果没有会话则触发错误)将进入内部,但它明确输出有错误但它在条件内尝试执行代码..但是当我把if(1==2)
条件显然是假的时候它不会...
我尝试使用整数,字符串,字符甚至是double和float但是每当变量进入条件时它只是将它传递为true,而不是..但是它将if(1==2)
或其他类似的条件识别为false。 / p>
这里发生了什么?它完全没有意义 我正在使用Tomcat7服务器,我现在玩了几个小时的代码,它从我想到的任何方式都没有意义..我的所有尝试都是徒劳的
请帮忙
答案 0 :(得分:0)
如果我理解正确,你的if
条件确实没有碰到任何东西。相反,您正在进行编译器执行的静态代码分析:它确定存在一个条件,在该条件下您的局部变量可能不会被初始化并标记它。
当您使用if(1==2)
停用大块时,编译器足够聪明,可以确定永远不会执行此块,并且可能永远不会为其生成任何代码(并忽略其中的任何标记)。
有几种方法可以改进您的代码(不完整,但却是一个起点):
err
并仅实施原始if
条件中的所有代码回答你的评论关于“省略记忆错误”的问题意味着:只是没有那个变量。伪代码:
if(session.getAttribute("id") != null) {
String cus_id = session.getAttribute("id").toString();
// now cus_id is initialized, and local to this block
// (it's not used elsewhere anyway)
// add your database code here
} else {
// add your error handling code here
}
不要忘记:构建SQL指令的方式很容易受到攻击。请阅读有关准备好的陈述(例如参数化查询)和Little Bobby Tables。