JSP新手求助:编写的对话框页面中href链接未正常渲染
JSP链接渲染异常修复方案
我是JSP新手,为对话框编写了如下JSP代码,但页面中未正常渲染出href链接。
原代码
<%@include file="/apps/myproject/global.jsp"%> Industry Level1 Updates <% String title=properties.get("linkLabel",""); %> <c:set var="industriesPlaceholder" value="- Click to add Industries navigation -"/> <slingx:property var="industriesTitle" name="title" resourcePath="./industriesLinks"/> <c:out value="${empty industriesTitle && isEditMode ? industriesPlaceholder : ''}" escapeXml="${escapeXml}" /> <c:set var="industriesLinksNode" value="${tef:getRelativeResource(resource, 'industriesLinks')}" /> ${industriesTitle} <slingx:property var="industrylabel" name="label" resourcePath="${industriesResource.path}" /> <slingx:property var="industryDestination" name="destination" resourcePath="${industriesResource.path}" /> <div class="top-nav-auth-item-wrapper"> <li><a href="<tef:link path="${empty industryDestination ? # : industryDestination}"/>"> <span>${industrylabel}</span> </a></li> </div> </c:if>
对话框截图

问题分析与修复步骤
1. 变量名不匹配
原代码定义了industriesLinksNode存储资源,但后续用了未定义的industriesResource,导致无法获取链接的label和目标地址,这是核心问题。
2. 缺少资源遍历逻辑
industriesLinksNode是包含多个链接的资源节点,需要用<c:forEach>遍历每个子资源才能逐个渲染链接。
3. 标签语法错误
<tef:link>中的引号嵌套错误,EL表达式的引号要和外层标签引号区分开;空值处理用#不符合规范,应改为空字符串或默认路径。- 存在未闭合的
</c:if>标签,需要补充对应的<c:if>判断条件。 - HTML结构不规范:
<li>必须放在<ul>或<ol>容器内,不能直接嵌套在<div>里。
修复后的代码
<%@include file="/apps/myproject/global.jsp"%> Industry Level1 Updates <% String title=properties.get("linkLabel",""); %> <c:set var="industriesPlaceholder" value="- 点击添加行业导航 -"/> <slingx:property var="industriesTitle" name="title" resourcePath="./industriesLinks"/> <c:out value="${empty industriesTitle && isEditMode ? industriesPlaceholder : ''}" escapeXml="${escapeXml}" /> <%-- 获取行业链接资源节点 --%> <c:set var="industriesLinksNode" value="${tef:getRelativeResource(resource, 'industriesLinks')}" /> <%-- 仅当资源节点存在且非空时渲染链接 --%> <c:if test="${not empty industriesLinksNode}"> <div class="top-nav-auth-item-wrapper"> <ul> <%-- 遍历每个行业链接子资源 --%> <c:forEach var="industryResource" items="${industriesLinksNode.children}"> <slingx:property var="industrylabel" name="label" resourcePath="${industryResource.path}" /> <slingx:property var="industryDestination" name="destination" resourcePath="${industryResource.path}" /> <li> <%-- 修复tef:link的引号嵌套和空值处理 --%> <a href="<tef:link path='${empty industryDestination ? "" : industryDestination}'/>"> <span>${industrylabel}</span> </a> </li> </c:forEach> </ul> </div> </c:if>
修复说明
- 补充了
<c:if>判断,确保只有存在链接资源时才渲染链接区域 - 用
<c:forEach>遍历industriesLinksNode的子资源,逐个获取每个链接的label和destination - 修正了
tef:link的引号嵌套问题,空值时使用空字符串代替# - 调整HTML结构,用
<ul>包裹<li>,符合规范 - 变量名统一为
industryResource,避免未定义错误
内容的提问来源于stack exchange,提问作者HM6
相关产品推荐
相关产品推荐

