我无法准确理解JSP在会话方面的工作方式......基本上我在不同的JSP中设置会话如下:
<%
String category = request.getParameter("category");
session.setAttribute("category", category); %>
然后在我正在使用的另一个页面中,如果根据已发布的类别生成HTML的条件,例如:
<% String category = (String) session.getAttribute("category");
if(category == "movie") {
out.println("Movie Details");
} else if (category == "music") {
out.println("Music Details");
} %>
但似乎两个if语句都没有被击中,但如果我实际打印出类别变量,它就会被正确打印出来,即正在显示电影或音乐。是否有一些我没有掌握的会议概念?我搜索了无数页面试图找到答案:/提前致谢。
答案 0 :(得分:2)
您正在以错误的方式比较字符串。您应该使用equals(..)
代替==
==
检查实例是否相同,而.equals(..)
检查两个字符串是否具有相同的内容。你很少对前者感兴趣。
因此,对于对象(与基元不同,==
是可行的方法),请使用:
if (foo.equals(bar)) { .. }
当您对java和servlet API有一些经验时,您应该考虑使用JSP的一些最佳实践。最重要的一个是不在JSP中编写java代码。 Here is an extensive explanation如何以及为何这样做。
答案 1 :(得分:1)
Bozho已经回答了问题的真正原因。在Java中,对象值将通过equals()
方法进行比较。字符串是对象,而不是基元。请注意,此问题与JSP无关,而与基本Java无关。
我只是想指出正确的方法:使用taglibs / EL。首先安装,如果需要JSTL(例如Tomcat没有随附出来),然后在JSP的顶部声明它。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
您的第一个代码段可以按如下方式实现:
<c:set scope="session" var="category" value="${param.category}" />
您的第二个代码段可以按如下方式实现:
<c:if test="${category == 'movie'}">Movie details</c:if>
<c:if test="${category == 'music'}">Music details</c:if>
或
<c:choose>
<c:when test="${category == 'movie'}">Movie details</c:when>
<c:when test="${category == 'music'}">Music details</c:when>
<c:otherwise>Unknown category</c:otherwise>
</c:choose>
是的,按==
比较字符串在EL中有效。它将在幕后使用equals()
。