我正在尝试通过 JSP 构建应用程序页面,使用外部标签(“页面”)内的嵌套标签。所有标签都需要访问从控制器传入的同一对象。 但我不知道如何在另一个标签中使用相同的对象作为标签的属性。
page.tag(外部,简化):
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ attribute name="var" required="true" type="java.util.Map"%>
<!DOCTYPE html>
<html>
<head>
<title>${var.title}</var>
... some shared headers ...
</head>
<body>
... some shared body elements, navigation etc. ...
<jsp:doBody></jsp:doBody>
... more shared body elements, footer etc. ...
</body>
</html>
login.tag(嵌套,简化):
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ attribute name="var" required="true" type="java.util.Map"%>
<div class="login">
<form id="loginForm">
<input type="text" name="username">
<input type="password" name="password">
<input type="hidden" name="session" value="${var.session}">
...
</form>
</div>
在login.jsp中使用如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
import="java.util.Map"
%>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%! @SuppressWarnings("unchecked") %>
<%
Map<String,String> var = Map.of();
if (request.getAttribute("variables") != null) {
var = (Map<String,String>) request.getAttribute("variables");
}
%>
<t:page var="<%= var %>">
<jsp:body>
<t:login var="<%= var %>"></t:login>
</jsp:body>
</t:page>
控制器.java:
...
Map<String,String> var = Map.of("title", "Page title", "session", "1234567890");
request.setAttribute("variables", var);
...
我收到以下错误消息:
无法为 JSP 编译类:生成的 java 文件中的第 [203] 行发生错误: [/var/lib/tomcat9/work/Catalina/app-name/org/apache/jsp/WEB_002dINF/jsp/login_jsp.java] var 无法解析为变量
没有
<t:login>
,或者如果我只将简单的 html 放入不需要任何对象的 login.tag
中,它就可以工作(即 var
在 page.tag
中可见)。
有没有办法在
var
和 page.tag
中使用 login.tag
?或者我以错误的方式看待这个问题?
感谢您的指点!
您应该使用
attribute
来传递变量。
<t:page var="${variables}">
<jsp:body>
<t:login var="${variables}"></t:login>
</jsp:body>
</t:page>