JSP:为什么这个有条件的工作?

时间:2011-10-04 19:49:19

标签: java jsp

我是一名被认可的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;
};

该字符串稍后out.println到主HTML区域中的某个位置。

我不明白为什么条件有效的!= null。或者更重要的是:它是否只有工作的外观?我的新手理解是.equals()方法是要走的路;事实上,我可以看到我的嵌套条件使用.equals()。我认为该行应该是:

if(!request.getParameter("message").equals("null") {}
/* or this one */
if(!request.getParameter("message").equals(null) {}

由于理解有限,我只能猜测当该参数为null时,没有字符串,而.equals()是字符串的比较方法。我在寻找肯定匹配时使用方法,但在寻找负匹配时使用运算符似乎不一致。我担心我正在使用的!=是不好的做法。

2 个答案:

答案 0 :(得分:5)

能够在方法上调用equals()要求引用 null。否则会导致NullPointerException(仅仅因为null没有引用/指向任何具有equals()方法的东西)。因此,obj != null代替obj.equals(null)测试。

Object object = null;

if (object.equals(null)) { // NullPointerException! object is null.
    // ...
} 

您使用!===被解释为“不良做法”可能是由于您不应该将String的内容与这些运营商进行比较的混淆造成的,而是equals()。将String==进行比较只会比较它们是否指向相同的引用,而不是它们具有相同的内容(内部对象值)。

String s1 = "foo";
String s2 = new String("foo");
String s3 = s2;

System.out.println(s1 == s2); // false
System.out.println(s1 == s3); // false
System.out.println(s2 == s3); // true

System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // true
System.out.println(s2.equals(s3)); // true

String是对象,而不是基元。 !===只会在int, long`等基元上提供预期结果。

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

答案 1 :(得分:1)

  1. 这看起来像纯Java。你真的把这个巨大的scriptlet嵌入到JSP中吗?如果是这样,那就太难看了。

  2. 如果Web请求不包含request.getParameter("message")参数,则
  3. message会返回空值。 null值不是String。您需要了解通过==比较对象以及通过equals()

  4. 比较它们的值之间的区别
  5. 那个switch语句也很难看。您应该通过fmt:message标记从属性文件中获取这些字符串。通过将“message”参数附加到某个前缀来构建消息密钥:

    &lt; fmt:message key =“error。$ {message}”&gt;

  6. 您可以将所有这些代码减少到JSP中的大约五行:

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

    这一切都假设您使用的是最新版本的Java EE。

    此外,如果您可以控制JSP和CSS,请不要使用类来指示布局。这比style="text-align: center"好一点。相反,使用CSS类来标记内容:

    <div id="messageBox" class="error-message">
    

    然后在CSS中:

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

    然后,如果您决定不想将消息文本居中,则不必更改数十个JSP以从消息框中删除“center”类。错误消息将始终是错误消息,但可能并不总是居中。