【问题标题】:if condition malfunctioning? JSP scriptlet如果条件出现故障? JSP 脚本
【发布时间】:2016-04-23 19:50:29
【问题描述】:

我面临一个问题,我不知道它发生了什么.. 我在 JSP 页面中制作了一个小 scriptlet 来检查一个简单的条件,如果有会话,那么它会做一些事情,如果没有,它应该只是重定向页面。 但发生了什么我无法真正解释...... if 条件正在做一些非常奇怪的事情!

这是一个示例代码:

<%
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 为假时,没有会话时会触发错误)它会得到在里面,但是它清楚地输出存在错误,但它进入条件内部以尝试执行代码..但是当我输入if(1==2) 显然是错误的条件时它没有.. 我尝试使用整数、字符串、字符,甚至双精度和浮点数,但每当一个变量进入条件时,它只是将其传递为真,而不是..但它会将if(1==2) 或其他类似条件识别为假。

这里发生了什么?这完全没有意义 我正在使用 Tomcat7 服务器,我已经玩了几个小时的代码,但从我的想法来看,它没有任何意义.. 我所有的尝试都是徒劳的

请帮忙

【问题讨论】:

    标签: java jsp session tomcat7


    【解决方案1】:

    如果我理解正确,您实际上并没有遇到您的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

    【讨论】:

    • 所以基本上因为它是一个JSP页面它仍然通过它?不幸的是,我没有时间创建所有这些 servlet 类并对其进行测试。我认为这是我最后一次这样做。但我需要尽快完成这项工作。我也试过你的建议很多次,在if条件下把它全部放在一个块中并没有真正帮助,有没有解决方法?还有你所说的“省略记忆错误”是什么意思?
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 2014-11-20
    • 2012-06-25
    • 1970-01-01
    • 2013-04-05
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多