2

我想知道如何在评估之前将一些 JSP 片段插入到 BodyContent 中?我尝试了不同的方法,但都没有奏效。我一定做错了什么。

例如,我希望有人将我的标签用作:

<mytag:html>
   <mytag:head>
      <link href="test.css"></link>
   </mytag:head>

然后它可以在头部之后插入一个jsp片段(从配置文件中读取):

<link href="<%=request.getAttribute("theme")%>/test.css"/>

它最终会输出:

<html>
  <head>
    <link href="target-theme/test.css"></link>
    <link href="test.css"></link>
  </head>

这是我想做的事情:

  1. 我想通过使用来简化其他团队成员的 JSP 开发<myTag:*/>

  2. 而且我不想在 MyTag.Java 中硬编码一些 HTML 输出。这就是为什么我想从外部文件中读取一些 JSP 片段并在运行时注入它。

有关如何使用 TagSupport 实现此目的的任何示例/片段?

4

1 回答 1

1

JSP 文件被转换为 servlet,此时还生成了 JSP 标记的调用代码。基本上,servlet 容器实例化您的标签,有时使用标签实例池,但无论哪种方式,这些实例都不会直接由容器公开。

在标记处理程序内部没有 JSP 代码的概念。标签处理程序“更接近金属”(可以这么说),在这里您只能直接写入响应。您无法评估 JSP 代码。此时已经评估了正文内容。

因此,您不能将 JSP 片段注入到您的标记处理程序中,但您可以让标记处理程序本身从该外部文件中提取内容。但这将是静态内容!

诸如此类的东西<%=request.getAttribute("theme")%>在这里没有任何意义,将直接发送给客户端(按原样)。${theme}如果您将自己限制为可以评估自己的 EL 表达式,那么您可以在其中包含某种 JSP 代码,但是随着您的外部代码将变得更加复杂,这将很快变得非常复杂。

根据您想要做什么,或者您的 servlet 容器实现的规范,另一种解决方案可能是使用JSP 2.0 标记文件,因此根据您的情况看看这是否有帮助(如果可以构建JSPFragment会很好由开发人员,但不幸的是这是容器实现)。

但是在我看来,您所做的确实是在装饰其他 JSP 代码的输出。如果您想简化开发并稍后在其输出之上添加内容,那么还要检查SiteMesh。它是一个网页布局和装饰框架,可以完成您想要实现的目标(甚至更多)。

于 2012-04-17T20:00:43.320 回答