我是一名被认可的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()是字符串的比较方法。我在寻找肯定匹配时使用方法,但在寻找负匹配时使用运算符似乎不一致。我担心我正在使用的!=是不好的做法。
答案 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)
这看起来像纯Java。你真的把这个巨大的scriptlet嵌入到JSP中吗?如果是这样,那就太难看了。
request.getParameter("message")
参数,则 message
会返回空值。 null
值不是String
。您需要了解通过==
比较对象以及通过equals()
那个switch语句也很难看。您应该通过fmt:message
标记从属性文件中获取这些字符串。通过将“message”参数附加到某个前缀来构建消息密钥:
&lt; fmt:message key =“error。$ {message}”&gt;
您可以将所有这些代码减少到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”类。错误消息将始终是错误消息,但可能并不总是居中。