为什么即使 <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'}">
因为 supplier
、shipper
和 client
是 局部变量 而不是 作用域属性 .
如果 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 层中非常不受欢迎,因此,请尽量限制它们的使用仅用于快速调试。
我想为客户、供应商和托运人注册使用单个 jsp 文件,但是当我 运行 带有
我该怎么做才能解决这个问题?
下面我展示了 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'}">
因为 supplier
、shipper
和 client
是 局部变量 而不是 作用域属性 .
如果 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 层中非常不受欢迎,因此,请尽量限制它们的使用仅用于快速调试。