V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
andybest
V2EX  ›  问与答

关于 Java / JSP 中的静态 include 的问题

  •  
  •   andybest · 2014-09-30 07:34:56 +08:00 · 2179 次点击
    这是一个创建于 3740 天前的主题,其中的信息可能已经有所发展或是发生改变。
    主页面 A.jsp 代码:
    <%
    Dog dog=...;
    Cat cat=...;
    %>
    <%@ include file="B.jsp"%>

    如果按以上方式,在被 include 的 B.jsp 中可以直接使用 dog,cat(这是因为静态包含被编译成一个class)

    想知道有没办法让 B.jsp 成为一个变量,同时不修改 B.jsp 代码情况下仍然可以直接使用 dog,cat 变量?
    即:
    <%
    Dog dog=...;
    Cat cat=...;
    String includeFile="B.jsp";
    %>
    <%@ include file="<%=includeFile%>"%>

    当然,上面的语法错误也肯定跑不通,有什么办法可以让这个逻辑可以实现?
    难道只能是使用动态 include 并逐个传递 dog,cat 变量给 B.jsp?可以传递这种自定义类吗?
    5 条回复    2014-09-30 16:03:10 +08:00
    qping
        1
    qping  
       2014-09-30 07:57:25 +08:00 via iPhone
    说说什么业务场景下需要这么写吧?
    tremblingblue
        2
    tremblingblue  
       2014-09-30 08:24:37 +08:00 via iPhone
    我也碰到过个场景,就是想运行时动态include模版,但又不想使用动态标签,担心性能问题。

    最后换了方式,没这样弄
    andybest
        3
    andybest  
    OP
       2014-09-30 13:34:40 +08:00
    @tremblingblue 也就是静态include的确无法使用变量作为include文件名?
    SoloCompany
        4
    SoloCompany  
       2014-09-30 14:53:20 +08:00   ❤️ 1
    1. 真心不建议这样写,用标签可以少很多坑,比如
    <%@ taglib prefix=“i" tagdir="/WEB-INF/tags/includeFiles” %>
    <i:B cat=“<%= cat %>” dog=“<%= dog %>” />

    当然,标签名字就更不可能动态化了,但你最好先想清楚自己的业务逻辑为什么要这么别扭的代码
    如果真需要动态 include,你也应该考虑把调用关系反向处理,把 cat / dog 这些变量的定义放到另一个被 include 文件里面,然后在 A.jsp / B.jsp 里面 include

    2. 真的需要动态 include,你还是选择 <jsp:include /> 标签或者是 <c:import /> 吧
    这些都不是编译时 include,参数传递必须要显式的,不愿意改太多代码的话,可以通过 request scope 来传递
    tremblingblue
        5
    tremblingblue  
       2014-09-30 16:03:10 +08:00
    @andybest 嗯,因为静态include不是运行时的,反正我也没想到什么办法hack过去。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:30 · PVG 15:30 · LAX 23:30 · JFK 02:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.