如何在 Thymeleaf 3.0.x 中获取自定义方言的处理器中的标签主体 [英] How to get body of tag in processor for a custom dialect in Thymeleaf 3.0.x

查看:36
本文介绍了如何在 Thymeleaf 3.0.x 中获取自定义方言的处理器中的标签主体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近使用标签处理器为 thymeleaf 3.0.7 编写了一个自定义方言,用于将片段与自定义标签的正文合并.

例如我有一个这样的片段

<div th:fragment="content(header)"><h1 th:text="${header}">标题 1</h1><我的:内容/><span>一些跨度</span>

还有一个像

这样的自定义标签

<my:merger my:mergefragment="fragments/myfrag :: content('Hello world')"><h2>标题2</h2><button>测试</button></my:merger>

结果应该是这样的

<h1>你好世界</h1><h2>标题2</h2><!-- my:merge 的内容--><button>测试</button><!-- my:merge 的内容--><span>一些跨度</span>

我的问题是如何获取我的自定义标签 的正文?目前我有以下处理器.

public class MergerElementTagProcessor extends AbstractElementTagProcessor {私有静态最终字符串TAG_NAME =合并";公共合并元素标签处理器(最终字符串方言前缀){super(TemplateMode.HTML, dialectPrefix, TAG_NAME, true, null, false, 1000);}@覆盖protected void doProcess(ITemplateContext context, IProcessableElementTag 标签, IElementTagStructureHandler structureHandler) {最终的 IEngineConfiguration 配置 = context.getConfiguration();final Fragment fragment = (Fragment) computeFragment(context, tag.getAttributeValue("mergefragment"));final Writer stringWriter = new FastStringWriter(200);configuration.getTemplateManager().process(fragment.getTemplateModel(), context, stringWriter);String elementBody = getBody(tag);//我如何获得我的 <my:merger></<my:merger> 的正文在他的点标记?structureHandler.replaceWith(merge(stringWriter.toString(), elementBody), false);}私人字符串合并(字符串片段,字符串元素体){return fragment.replace("", elementBody);}}

感谢您提供任何帮助或提示的建议.

解决方案

作为 Metroids 提示的答案,我使用以下代码完成:

public class MergerElementTagProcessor extends AbstractElementModelProcessor {私有静态最终字符串TAG_NAME =合并";公共合并元素标签处理器(最终字符串方言前缀){super(TemplateMode.HTML, dialectPrefix, TAG_NAME, true, null, false, 1000);}@覆盖protected void doProcess(ITemplateContext 上下文,IModel 模型,IElementModelStructureHandler 结构处理器) {IProcessableElementTag tag = processElementTag(context, model);//将 IModel 转换为 IProcessableElementTag映射<字符串,字符串>attrMap = processAttribute(context, tag);//获取标签属性IModel baseModelClone = model.cloneModel();//克隆基础模型IModel fragmentModel = (IModel) computeFragment(context, tag.getAttributeValue("mergefragment"));//获取片段作为 IModel模型.reset();//清除模型引用model.addModel(mergeModel(fragmentModel, baseModelClone, "<my:content/>"));//合并两个 IModel}受保护的 IModel 合并模型(IModel 片段,IModel 主体,最终字符串 replaceTag){IModel 合并模型 = 插入(片段,正文,替换标签);合并模型 = 删除(合并模型,replaceTag);合并模型 = 删除(合并模型,replaceTag);返回合并模型;}私有 IModel 插入(IModel 片段、IModel 主体、最终字符串替换标签){IModel 合并模型 = fragment.cloneModel();int size = mergeModel.size();ITemplateEvent 事件 = null;for (int i = 0; i < size; i++) {事件 = 合并模型.get(i);如果(IOpenElementTag 的事件实例){if (event.toString().contains(replaceTag)) {合并模型.插入模型(i, body);休息;}}}返回合并模型;}私有 IModel 删除(IModel 片段,最终字符串 replaceTag){IModel 合并模型 = fragment.cloneModel();int size = mergeModel.size();ITemplateEvent 事件 = null;for (int i = 0; i < size; i++) {事件 = 合并模型.get(i);if (event instanceof IOpenElementTag || event instanceof ICloseElementTag) {if (event.toString().contains(replaceTag)) {合并模型.remove(i);休息;}}}返回合并模型;}}

I recently wrote a custom dialect for thymeleaf 3.0.7 with a tag processor to merge a fragment with the custom tag's body.

For example I have a fragment like this

<!-- file fragments/myfrag.html -->
<div th:fragment="content(header)">
    <h1 th:text="${header}">Header 1</h1>
    <my:content/>
    <span>Some span</span>
</div>

And a custom tag like

<my:merger my:mergefragment="fragments/myfrag :: content('Hello world')">
    <h2>Header 2</h2>
    <button>Test</button>
</my:merger>

The result should be like

<div>
    <h1>Hello world</h1>
    <h2>Header 2</h2>   <!-- Content of my:merger -->
    <button>Test</button> <!-- Content of my:merger -->
    <span>Some span</span>
</div>

My question is how to get the body of my custom tag <my:merger>? Currently I have the following processor.

public class MergerElementTagProcessor extends AbstractElementTagProcessor {

    private static final String TAG_NAME = "merger";

    public MergerElementTagProcessor(final String dialectPrefix) {
        super(TemplateMode.HTML, dialectPrefix, TAG_NAME, true, null, false, 1000);
    }

    @Override
    protected void doProcess(ITemplateContext context, IProcessableElementTag tag, IElementTagStructureHandler structureHandler) {

        final IEngineConfiguration configuration = context.getConfiguration();

        final Fragment fragment = (Fragment) computeFragment(context, tag.getAttributeValue("mergefragment"));
        final Writer stringWriter = new FastStringWriter(200);
        configuration.getTemplateManager().process(fragment.getTemplateModel(), context, stringWriter);

        String elementBody = getBody(tag); // how do I get the body of my <my:merger></<my:merger> tag at his point?

        structureHandler.replaceWith(merge(stringWriter.toString(), elementBody), false);
    }

    private String merge(String fragment, String elementBody) {
        return fragment.replace("<my:content/>", elementBody);
    }
}

Thanks in advice for any help or tips.

解决方案

As an answer of Metroids hint I got it done with the following code:

public class MergerElementTagProcessor extends AbstractElementModelProcessor {

    private static final String TAG_NAME = "merger";

    public MergerElementTagProcessor(final String dialectPrefix) {
        super(TemplateMode.HTML, dialectPrefix, TAG_NAME, true, null, false, 1000);
    }

    @Override
    protected void doProcess(ITemplateContext context, IModel model,
            IElementModelStructureHandler structureHandler) {

        IProcessableElementTag tag = processElementTag(context, model);  // convert IModel to IProcessableElementTag
        Map<String, String> attrMap = processAttribute(context, tag); // get attributes of tag

        IModel baseModelClone = model.cloneModel(); // clone base model
        IModel fragmentModel = (IModel) computeFragment(context, tag.getAttributeValue("mergefragment")); // get fragment as IModel

        model.reset(); // clear the model reference
        model.addModel(mergeModel(fragmentModel, baseModelClone, "<my:content/>")); // merge the two IModels
    }

    protected IModel mergeModel(IModel fragment, IModel body, final String replaceTag) {
        IModel mergedModel = insert(fragment, body, replaceTag);
        mergedModel = remove(mergedModel, replaceTag);
        mergedModel = remove(mergedModel, replaceTag);
        return mergedModel;
    }

    private IModel insert(IModel fragment, IModel body, final String replaceTag) {
        IModel mergedModel = fragment.cloneModel();
        int size = mergedModel.size();
        ITemplateEvent event = null;
        for (int i = 0; i < size; i++) {
            event = mergedModel.get(i);
            if (event instanceof IOpenElementTag) {
                if (event.toString().contains(replaceTag)) {
                    mergedModel.insertModel(i, body);
                    break;
                }
            }
        }
        return mergedModel;
    }

    private IModel remove(IModel fragment, final String replaceTag) {
        IModel mergedModel = fragment.cloneModel();
        int size = mergedModel.size();
        ITemplateEvent event = null;
        for (int i = 0; i < size; i++) {
            event = mergedModel.get(i);
            if (event instanceof IOpenElementTag || event instanceof ICloseElementTag) {
                if (event.toString().contains(replaceTag)) {
                    mergedModel.remove(i);
                    break;
                }
            }
        }
        return mergedModel;
    }

}

这篇关于如何在 Thymeleaf 3.0.x 中获取自定义方言的处理器中的标签主体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆