Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向自定义JSP标记添加Freemarker支持_Java_Jsp_Struts2_Freemarker_Taglib - Fatal编程技术网

Java 向自定义JSP标记添加Freemarker支持

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

我有一个定制的JSP标记库,它带有一个Java类(扩展标记支持),可以为我的web应用程序生成输出。它有一些使用
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;
}