为什么即使 <c:if> 标记的计算结果为 false 也会显示所有表单?

Why are all forms displayed even if the <c:if> tags evaluate to false?

我想为客户、供应商和托运人注册使用单个 jsp 文件,但是当我 运行 带有 标签的程序时,所有表格都会显示,尽管 System.out.print(type) 显示值“供应商”。

我该怎么做才能解决这个问题?

下面我展示了 Supplier.jsp 和 Sign_in.jsp 的代码。对于客户和托运人的注册,jsp 的实现方式与Supplier.jsp 相同,仅通过字符串“customer”和“shipper”修改类型变量的值。这些页面将为每个客户、托运人和供应商显示更具体的值 类。

Supplier.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
    <title>Bienvenido!</title>
</head>
<body>
       <h2>Sign in</h2>
    <a href="Sign_in.jsp">No account yet? Sign in</a>
    
    <% request.getSession().setAttribute("type", "supplier"); %> 
    
</body>
</html>

Register.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Sign in</title>
</head>
<body>
    <h1>Sign in</h1>

    <% String type = (String) request.getSession().getAttribute("type");
    String supplier = "supplier";
    String shipper = "shipper";
    String client = "client";
    %>
    
    <% System.out.println(type.equals(supplier)); %>
    
        <c:if test="${type == supplier}">
        <h2>I'm a supplier</h2>
        <form action="RegisterServlet" method="post">
            <input type="email" name="email" placeholder="Email"> 
            <input type="password" name="password" placeholder="Password">
            <button type="submit">Register</button>
        </form>
    </c:if>

    <c:if test="${type == shipper}">
        <h2>I'm a shipper</h2>
        <form action="RegisterServlet" method="post">
            <input type="email" name="email" placeholder="Email"> 
            <input type="text" name="user" placeholder="User">
            <input type="password" name="password" placeholder="Password">
            <button type="submit">Register</button>
        </form>
    </c:if>

    <c:if test="${type == client}">
        <h2>I'm a client</h2>
        <form action="RegisterServlet" method="post">
            <input type="email" name="email" placeholder="Email"> 
            <input type="text" name="user" placeholder="User">
            <input type="password" name="password" placeholder="Password">
            <input type="text" name="city" placeholder="City"> 
            <input type="text" name="address" placeholder="Address"> 
            <input type="text" name="country" placeholder="Country"> 
            <button type="submit">Register</button>
        </form>
    </c:if>
</body>
</html>

您需要更改 test 条件以使用常量作为

<c:if test="${type == 'supplier'}">
<c:if test="${type == 'shipper'}">
<c:if test="${type == 'client'}">

因为 suppliershipperclient 局部变量 而不是 作用域属性 .

如果 none 的表单在此更改后呈现,那么您的 type 属性设置不正确。检查您的 href 以查看您是否导航到正确的 JSP 页面。您正在调试 Register.jsp,但您的链接指向 Sign_in.jsp,因此这也可能是另一个问题。


@MauricePerry 提出了一个很好的观点,即您应该避免使用 <% scriptlets %> 因为您已经在使用 JSTL 标记。例如,您的代码添加一个 session 属性

<% request.getSession().setAttribute("type", "supplier"); %>

可以用<c:set> JSTL标签代替。

<c:set var="type" value="supplier" scope="session" />

<% scriptlets %> 的使用在 view 层中非常不受欢迎,因此,请尽量限制它们的使用仅用于快速调试。