我有一个带有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);
但我不知道如何继续这个代码存根。无论如何,它可能是垃圾。
是否有一种简单/“标准”的方法可以做到这一点,还是只需摆脱自定义标签?
提前致谢。
答案 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,这可能不完全正确,但它适用于我必须使用的古老版本。
再次感谢给我发送链接的人:)