If语句中的JSP会话

时间:2011-04-11 21:05:51

标签: java jsp session

我无法准确理解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语句都没有被击中,但如果我实际打印出类别变量,它就会被正确打印出来,即正在显示电影或音乐。是否有一些我没有掌握的会议概念?我搜索了无数页面试图找到答案:/提前致谢。

2 个答案:

答案 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()