始终相同的结果是JSTL <c:when>标签</c:when>

时间:2015-01-05 20:41:43

标签: html jsp jstl

我的login.jsp页面出现了这个奇怪的问题。让我们看一下jsp代码的一部分:

<%
  String userName = "";
  String password = "";
  boolean login;

  //mysql stuffs are in here

if(resultSet.next()) {
  login = true;
  out.println("It is true.");
} else {
  login = false;
  out.println("It is false.");
%>

当我使用正确的用户名/密码登录时,我得到It is true输出页面的顶部,并且我输出了It is false错误的登录信息。

一切都很好,直到这一点。现在,让我们看看这里的html内容:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <c:choose>
      <c:when test="${login}">
        <div class="container">
          <!-- Page content in here with success -->
        </div>
      </c:when>

      <c:otherwise>
        <div class="container">
          <!-- Page content in here with error -->
        </div>
      </c:otherwise>
    <c:choose>
  </body>
</html>

现在,我总是得到相同的HTML页面内容,无论我输入正确或错误的信息,但我总是从页面顶部的布尔值得到正确的输出。有人能告诉我,我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:1)

将scriptlet(<%...%>)与JSTL混合会破坏使用JSTL的目的。此外,无法使用${}在JSTL中访问scriptlet中设置的变量。 JSTL旨在替换<%...%>内容并使用MVC方法,其中使用Servlet作为控制器。你在<%...%>中的东西应该在一个Servlet中,它设置一个请求属性并转发到包含JSTL的jsp。然后,JSTL可以使用${login}读取请求属性。

所以,在login.java里面,你的servlet,在设置boolean值的代码之后(在你的doPost方法中):

request.setAttribute("login", login);
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
return;

您可以将JSP放在WEB-INF下,以防止任何用户直接访问它。相反,您将使用它们转到登录servlet的URL,该URL将控制对JSP的访问,因此它被称为&#34;控制器。&#34; (有关此问题的详细信息,请参阅servlets info page。)

您还希望设置无缓存标头以防止缓存在登录后面的页面被缓存,因为缓存的这些页面会允许任何对该计算机具有物理访问权限的用户查看用户的内容,从而带来安全风险在他们退出后登录时看到了。

答案 1 :(得分:1)

您需要创建一个&#34;页面范围&#34;变量,以便在$ {...}

之间使用它

将您的示例更改为:

if(resultSet.next()) {
    pageContext.setAttribute("login", "true");
    out.println("It is true.");
} else {
    pageContext.setAttribute("login", "false");
    out.println("It is false.");
}

它应该都有效。

注意:这假设您并不真正需要&#34;布尔登录&#34; &lt;%...%&gt;内的任何其他地方你也可以摆脱&#34;布尔登录&#34;如果是这样的话。如果确实需要,请将其保留并添加&#34; login = true&#34;和&#34; login = false&#34;返回,但你仍然需要pageContext.setAttribute语句。