在评估之前将JSP代码注入BodyTag?

时间:2012-04-16 16:45:56

标签: jsp jsp-tags

我想知道如何在评估之前将一些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. 我想通过使用<myTag:*/>

  2. 来简化其他团队成员的JSP开发
  3. 我不想在MyTag.Java中对某些HTML输出进行硬编码。这就是为什么我想从外部文件读取一些JSP片段并在运行时注入它。

  4. 有关如何使用TagSupport实现此目的的任何示例/代码段吗?

1 个答案:

答案 0 :(得分:1)

JSP文件是transformed to servlets,此时还会生成JSP标记的调用代码。基本上是servlet容器instantiates your tags,有时使用标记实例池,但这两种实例都不会被容器直接暴露。

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

因此,您无法将JSP片段注入标记处理程序,但您可以让标记处理程序自己从该外部文件中提取内容。但它将是静态内容!

<%=request.getAttribute("theme")%>之类的东西在这里没有任何意义,将直接发送给客户端(按原样)。你可以在那里使用某种类型的JSP代码,如果你将自己限制在${theme}之类的{{1}}这样的EL表达式,但是这会变得非常复杂,因为你的外部代码会变得更加复杂。 / p>

根据你想要做什么,或者你的servlet容器实现了什么规范,另一个解决方案可能是使用evaluate yourself,所以看看这是否有助于你的情况(如果{{那会很好3}}可以由开发人员构建,但不幸的是,这是容器实现。)

但是你正在做的事情听起来像the JSP 2.0 tag files其他JSP代码的输出。如果您想简化开发并稍后在其输出之上添加内容,那么还要结帐JSPFragment。它是一个网页布局和装饰框架,可以做你想要实现的目标(甚至更多)。