0

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

现在生成的 HTML 变得越来越复杂,并且很难通过调用来处理StringBuilder.append,所以我想将代码生成替换为Freemarker template.

我已经发现我可以使用通用component的 Struts 标签,因为 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);

但我不知道如何继续这个代码存根。反正可能是废话。

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

提前致谢。

4

1 回答 1

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 可能并不完全正确,但它适用于我必须使用的旧版本。

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

于 2013-06-26T08:56:19.283 回答