Java JSP:为什么这个条件有效?

Java JSP:为什么这个条件有效?,java,jsp,Java,Jsp,我是公认的JSP(和Java)新手。我有这样一段代码: String pageMessageStart = "<div id=\"messageBox\" class=\"center\">"; String pageMessage = ""; String pageMessageEnd = "</div>"; if(request.getParameter("message") != null) { pageMessage = pageMessageStart;

我是公认的JSP(和Java)新手。我有这样一段代码:

String pageMessageStart = "<div id=\"messageBox\" class=\"center\">";
String pageMessage = "";
String pageMessageEnd = "</div>";

 if(request.getParameter("message") != null) {
  pageMessage = pageMessageStart;
  /* Certain messages will come in as an alias. Let's make user-friendly messages with them */
  if(request.getParameter("message").equals("invalidsession"))
    pageMessage += "Session expired; you have been automatically logged out.";
  else if(request.getParameter("message").equals("NOCOOKIE"))
    pageMessage += "No valid cookie found; you must have cookies enabled to use this application.";
  else if(request.getParameter("message").equals("invalidcredentials"))
    pageMessage += "Incorrect username and/or password.";
  else if(request.getParameter("message").equals("LICENSE_CHANGED"))
    pageMessage += "Your license key has been successfully applied.";
  else
  /* If there is no alias but there is still a message, let's just display it verbatim */
  pageMessage += request.getParameter("message");

  pageMessage += pageMessageEnd;
};

在我有限的理解下,我只能猜测当该参数为null时,没有字符串,并且.equals()是字符串的比较方法。我在寻找正匹配时使用了一个方法,但在寻找负匹配时使用了一个操作符,这似乎有点不同。我担心我使用的是错误的做法。

能够在方法上调用
equals()
,需要引用不是空的。否则会导致
NullPointerException
(这仅仅是因为
null
没有引用/指向任何具有
equals()
方法的内容)。因此,
obj!=空
而不是
obj.equals(空)
测试

Object object = null;

if (object.equals(null)) { // NullPointerException! object is null.
    // ...
} 
那是使用
=
==
被您解释为一种“坏习惯”,可能是因为您不应该通过这些运算符比较
字符串的内容,而应该通过
equals()
进行比较。通过
=
比较
字符串
s,仅当它们都指向相同的引用时才会进行比较,而不是当它们都具有相同的内容(内部对象值)时才会进行比较

String
s即是对象,而不是原语。
=
==
只会给出诸如
int、
long`等原语的预期结果


顺便说一下,这与JSP无关。它只是基本的Java。在JSP文件而不是Java类中错误地编写Java代码,并且Java代码出现问题并不意味着它是JSP问题。在普通Java类中执行此操作时,您会遇到完全相同的问题。

要能够在方法上调用
equals()
,需要引用不是null
。否则会导致
NullPointerException
(这仅仅是因为
null
没有引用/指向任何具有
equals()
方法的内容)。因此,
obj!=空
而不是
obj.equals(空)
测试

Object object = null;

if (object.equals(null)) { // NullPointerException! object is null.
    // ...
} 
那是使用
=
==
被您解释为一种“坏习惯”,可能是因为您不应该通过这些运算符比较
字符串的内容,而应该通过
equals()
进行比较。通过
=
比较
字符串
s,仅当它们都指向相同的引用时才会进行比较,而不是当它们都具有相同的内容(内部对象值)时才会进行比较

String
s即是对象,而不是原语。
=
==
只会给出诸如
int、
long`等原语的预期结果

顺便说一下,这与JSP无关。它只是基本的Java。在JSP文件而不是Java类中错误地编写Java代码,并且Java代码出现问题并不意味着它是JSP问题。在普通Java类中执行此操作时,您会遇到完全相同的问题

  • 这看起来像纯Java。您真的在JSP中嵌入了这个巨大的脚本吗?如果是这样,那就太难看了

  • request.getParameter(“message”)
    如果web请求不包含
    message
    参数,则返回空值。
    null
    值不是
    字符串。您需要了解通过
    ==
    比较对象是否相等与通过
    equals()比较对象值之间的区别

  • 那个switch语句也很难看。您应该通过
    fmt:message
    标记从属性文件中获取这些字符串。通过将“message”参数附加到某个前缀来生成消息键:

  • 您可以将JSP中的所有代码减少到大约五行:

    <c:if test="${message}">
      <div id="messageBox" class="center">
        <fmt:message key="error.${message}">
      </div>
    </c:if>
    
    然后在CSS中:

    .error-message { text-align: center; margin: 1em; border: 1px solid red; }
    
    然后,如果您决定不希望将消息文本居中,则无需更改几十个JSP即可从消息框中删除“center”类。错误消息将始终是错误消息,但它可能并不总是居中

  • 这看起来像纯Java。您真的在JSP中嵌入了这个巨大的脚本吗?如果是这样,那就太难看了

  • request.getParameter(“message”)
    如果web请求不包含
    message
    参数,则返回空值。
    null
    值不是
    字符串。您需要了解通过
    ==
    比较对象是否相等与通过
    equals()比较对象值之间的区别

  • 那个switch语句也很难看。您应该通过
    fmt:message
    标记从属性文件中获取这些字符串。通过将“message”参数附加到某个前缀来生成消息键:

  • 您可以将JSP中的所有代码减少到大约五行:

    <c:if test="${message}">
      <div id="messageBox" class="center">
        <fmt:message key="error.${message}">
      </div>
    </c:if>
    
    然后在CSS中:

    .error-message { text-align: center; margin: 1em; border: 1px solid red; }
    

    然后,如果您决定不希望将消息文本居中,则无需更改几十个JSP即可从消息框中删除“center”类。错误消息将始终是错误消息,但它可能不总是居中。

    同意;“(和Java)”可能没有足够强调这一点。因为我只是在JSP上下文中编写Java,这影响了标题和标记。非常感谢您花时间澄清;我知道这是一个基本问题,几乎不值得你花时间如果您不介意的话,还有一个问题:如果稍后我对查询字符串中的另一个参数进行了条件检查,但这次是在寻找正匹配,那么首先检查参数是否存在是否是一种好的做法?毕竟,如果没有参数,条件仍然会(正确地)失败,因此额外的检查似乎是多余的。您应该始终通过测试
    null
    来检查参数是否存在。永远不要相信用户输入,并期望始终提供参数。HTTP请求很容易被黑客攻击/t