为自定义JSP标记添加Freemarker支持

时间:2013-06-25 11:02:34

标签: java jsp struts2 freemarker taglib

我有一个带有Java类(扩展TagSupport)的自定义JSP标记库,它为我的Web应用程序生成输出。它有一些使用StringBuilder形成HTML代码的参数。

现在生成的HTML变得越来越复杂,并且难以处理StringBuilder.append的调用,因此我想用Freemarker template替换代码生成。

我已经发现我可以使用通用的Struts component标记,因为Struts标记已经使用了Freemarker模板文件,因此我可以编写一个标记:

<s:component template="/components/myStruct.ftl">
    <s:param name="myParam" value="%{'myParam'}" />
</s:component>

然后编写指定的模板文件myStruct.ftl可能会解决我的问题。我实际上没有尝试Struts真正找到并正确使用该文件,但我乐观地期望它能够工作。

我的问题是,如果还可以使用自定义标记保留当前代码

<my:struct param="myParam" />

并且只更改链接到该标记的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标记库中的标记。 (我遇到了由ArrayIndexOutOfBoundException引起的Sitemesh ......我还没有分析它。)

我的目的是将Java类保留为Struts组件标记的某种包装器。也许是这样的事情:

OgnlValueStack stack = TagUtils.getStack(pageContext);
Component c = new Component(stack);
c.addParameter("param", param);

但我不知道如何继续这个代码存根。无论如何,它可能是垃圾。

是否有一种简单/“标准”的方法可以做到这一点,还是只需摆脱自定义标签?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我的一位朋友给我发了这个链接:

http://cppoon.wordpress.com/2013/02/27/how-to-create-a-struts-2-component-with-freemarker/

这就是我要找的东西。要点是将自定义标记更改为不扩展TagSupport而是扩展AbstractUITag,这使得它成为Struts标记而不是JSP标记,粗略地说。

这样可以自动链接(通过名称和路径约定)到我的Freemarker模板。我基本上按照该页面上的说明进行操作。我只添加了超类中抽象的方法,因此必须实现它们。

IMO该网站缺乏UI bean类如何链接到标记类的描述。但是,当IDE强制您在标记类中实现getBean方法时,您可以快速访问此代码(使用该站点上描述的类):

@Override
public Component getBean(OgnlValueStack stack, HttpServletRequest request, HttpServletResponse response)
{
    Pagination pagination = new Pagination(stack, request, response);
    pagination.setList(list);
    return pagination;
}

对于最近的Struts,这可能不完全正确,但它适用于我必须使用的古老版本。

再次感谢给我发送链接的人:)