JSP:在嵌套标签中使用时“对象无法解析为变量”

问题描述 投票:0回答:1

我正在尝试通过 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
?或者我以错误的方式看待这个问题? 感谢您的指点!

jsp jsp-tags
1个回答
0
投票

您应该使用

attribute
来传递变量。

<t:page var="${variables}">
<jsp:body>
<t:login var="${variables}"></t:login>
</jsp:body>
</t:page>
© www.soinside.com 2019 - 2024. All rights reserved.