如果情况出现故障? JSP scriptlet

时间:2016-04-23 19:50:30

标签: java jsp session tomcat7

我正面临一个问题,我不知道它是怎么回事...... 我在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服务器,我现在玩了几个小时的代码,它从我想到的任何方式都没有意义..我的所有尝试都是徒劳的

请帮忙

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你的if条件确实没有碰到任何东西。相反,您正在进行编译器执行的静态代码分析:它确定存在一个条件,在该条件下您的局部变量可能不会被初始化并标记它。

当您使用if(1==2)停用大块时,编译器足够聪明,可以确定永远不会执行此块,并且可能永远不会为其生成任何代码(并忽略其中的任何标记)。

有几种方法可以改进您的代码(不完整,但却是一个起点):

  • 忽略记忆err并仅实施原始if条件中的所有代码
  • 停止在JSP中编写Java scriptlet并使用正确的MVC - 然后在委派给JSP之前确定没有会话(并从控制器委托到不同的页面),页面可以假设那里总有一个会议

回答你的评论关于“省略记忆错误”的问题意味着:只是没有那个变量。伪代码:

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