You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用JSP创建可复用布局模板?解决标签体代码兼容问题

嘿,我来帮你搞定这个JSP标签体的问题~

解决JSP标签文件中标签体编写JSP/Java代码的问题

先给你吃颗定心丸

JSP标签文件完全支持在标签体里写JSP/Java代码,你遇到的问题大概率是标签的配置或者使用方式出了小差错,不是它本身不允许哦。

常见问题排查&修正方案

  • 检查body-content属性配置
    默认情况下,标签的body-content值是JSP,这个模式是支持JSP脚本、表达式这些内容的。但如果你的标签里不小心设置了body-content="scriptless"或者"tagdependent",就会限制标签体的内容:

    • scriptless:只允许静态HTML和EL表达式,<%%>这种脚本会被当成纯文本输出
    • tagdependent:把标签体所有内容当作纯文本,不做任何解析

    你可以在base.tag的开头明确指定这个属性,确保是支持JSP代码的:

    <%@tag description="Base page layout" pageEncoding="UTF-8" body-content="JSP" %>
    
  • 正确的标签文件&使用示例
    给你一个完整的base.tag示例,包含通用的头部、尾部,留出内容插入区域:

    <%@tag description="Base page layout" pageEncoding="UTF-8" body-content="JSP" %>
    <!-- 可以定义必填的属性,比如页面标题 -->
    <%@attribute name="pageTitle" required="true" type="java.lang.String" %>
    
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>${pageTitle}</title>
        <!-- 通用样式、脚本,不用每个页面重复写 -->
        <link rel="stylesheet" href="/css/common.css">
        <script src="/js/jquery.min.js"></script>
    </head>
    <body>
        <!-- 通用导航栏 -->
        <header><nav>首页 | 我的账户 | 退出</nav></header>
        
        <!-- 这里就是插入页面自定义内容的地方 -->
        <jsp:doBody/>
        
        <!-- 通用页脚 -->
        <footer>©2024 我的网站</footer>
    </body>
    </html>
    

    然后在你的业务JSP页面里这样使用,标签体里随便写JSP/Java代码都没问题:

    <%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
    
    <layout:base pageTitle="用户中心">
        <%-- 这里可以写JSP脚本、EL表达式、HTML --%>
        <% String username = (String) session.getAttribute("currentUser"); %>
        <h1>欢迎回来,<%= username %>!</h1>
        
        <% if (username != null && !username.isEmpty()) { %>
            <div class="user-info">
                <p>您的邮箱:${sessionScope.userEmail}</p>
            </div>
        <% } else { %>
            <p>请先<a href="/login.jsp">登录</a></p>
        <% } %>
    </layout:base>
    
  • 几个小提醒

    • 确保JSP页面里的标签库引入路径正确,tagdir="/WEB-INF/tags/layouts"要和你的base.tag所在目录完全对应
    • 如果用EL表达式,别把页面的isELIgnored设为true(默认是false,支持EL)
    • 尽量少用<%%>这种脚本,优先用EL和JSTL标签,代码会更干净好维护

备选方案(实在搞不定标签的话)

如果还是遇到奇怪的问题,你也可以用JSP的<%@ include %>指令或者JSTL的<c:import>来拆分通用布局,但标签文件的方式更灵活,还是推荐先把标签的配置问题解决掉~

内容的提问来源于stack exchange,提问作者Dana Woodman

火山引擎 最新活动