Java 向自定义JSP标记添加Freemarker支持
我有一个定制的JSP标记库,它带有一个Java类(扩展标记支持),可以为我的web应用程序生成输出。它有一些使用Java 向自定义JSP标记添加Freemarker支持,java,jsp,struts2,freemarker,taglib,Java,Jsp,Struts2,Freemarker,Taglib,我有一个定制的JSP标记库,它带有一个Java类(扩展标记支持),可以为我的web应用程序生成输出。它有一些使用StringBuilder形成HTML代码的参数 现在生成的HTML变得越来越复杂,很难处理StringBuilder.append的调用,因此我想用Freemarker模板替换代码生成 我已经发现我可以使用通用的Struts组件标记,因为Struts标记已经使用Freemarker模板文件,所以我可以编写如下标记: <s:component template="/compone
StringBuilder
形成HTML代码的参数
现在生成的HTML变得越来越复杂,很难处理StringBuilder.append
的调用,因此我想用Freemarker模板
替换代码生成
我已经发现我可以使用通用的Struts组件
标记,因为Struts标记已经使用Freemarker模板文件,所以我可以编写如下标记:
<s:component template="/components/myStruct.ftl">
<s:param name="myParam" value="%{'myParam'}" />
</s:component>
并且只更改链接到该标记的Java类
我发现了读取Freemarker模板的代码:
Configuration config = FreemarkerManager.getInstance().getConfiguration(pageContext.getServletContext());
config.setServletContextForTemplateLoading(pageContext.getServletContext(), "/components");
Template templ = config.getTemplate("myStruct.ftl");
templ.process(params, pageContext.getOut());
但在我看来,这似乎非常迂回,我想知道什么是“标准”的方式来做这件事。此外,您似乎无法在这样使用的模板中使用Struts标记库中的标记。(我遇到了一个由Sitemesh
引起的ArrayIndexOutOfBoundException
…我还没有分析它。)
我的意图是将Java类作为Struts组件标记的某种包装器。也许是这样的:
OgnlValueStack stack = TagUtils.getStack(pageContext);
Component c = new Component(stack);
c.addParameter("param", param);
但是我不知道如何继续这个代码存根。不管怎样,这可能是废话
有没有一种简单的/标准的方法来实现这一点,还是我只需要去掉定制的标签
提前谢谢。我的一个朋友给我发了这个链接: 这就是我要找的。要点是将定制标记更改为不扩展
TagSupport
,而是扩展AbstractUITag
,粗略地说,这使其成为Struts标记而不是JSP标记
这将启用到我的Freemarker模板的自动链接(按名称和路径约定)。我基本上是按照那一页上的说明做的。我只在超类中添加了抽象的方法,因此必须实现它们
在我看来,该网站缺少关于UIBean类如何链接到tag类的描述。但是,当IDE强制您在tag类中实现getBean
方法时,您很快就可以看到这段代码(使用该站点上描述的类):
对于最近的Struts,这可能不完全正确,但对于我必须使用的古老版本,它是有效的
再次感谢给我发送链接的家伙:)您也可以(而且完全可以)继续使用自定义JSP标记,只需实现Freemarker(或另一种模板语言)来呈现标记的标记。按照下面发布的方式实现后,我首先遇到了相同的
Sitemesh
错误(这只是一个错误的FTL语法的连续错误)。所以我认为它也会起作用。谢谢你的评论。
OgnlValueStack stack = TagUtils.getStack(pageContext);
Component c = new Component(stack);
c.addParameter("param", param);
@Override
public Component getBean(OgnlValueStack stack, HttpServletRequest request, HttpServletResponse response)
{
Pagination pagination = new Pagination(stack, request, response);
pagination.setList(list);
return pagination;
}