处理加载的片段

时间:2013-04-17 06:49:16

标签: java-ee thymeleaf

我对加载片段有一点具体的问题。

我们在表单框架中动态加载片段,它只使用表单bean定义生成带有Java反射的表单。在处理关闭表单标记(</form>)之后,处理加载的片段(不知道原因)。因为我们只从所选表格的开头到结束标签进行表格上下文(因为更多的表格可能在同一页面上),所以发生异常,而加载的片段的处理被百里香叶推迟。

加载片段的代码:

public static List<Node> loadFragment(Arguments arguments, String fragmentName, String fragmentPath) { 
        IFragmentSpec fragmentSpec = new ElementAndAttributeNameFragmentSpec(null, "th:fragment", fragmentName, true); 
        FragmentAndTarget fat = new FragmentAndTarget(fragmentPath, fragmentSpec); 
        return fat.extractFragment(arguments.getConfiguration(), arguments, arguments.getTemplateRepository()); 
} 

此代码在InitializerElProcessor中调用,其中整个表单构建为html。 碎片按原样加载,但它不是由百日咳处理的。如何加载由thymeleaf处理过的片段?或者我们应该如何强制百里香叶立即处理这个节点(加载的结果)?

感谢您的任何想法。

1 个答案:

答案 0 :(得分:0)

经过几个小时的调试后我发现了它 当我提取片段内容并将其附加到DOM树中的当前已处理元素时,将跳过所有新嵌套节点(更好的是,跳过第一个节点,并且使用该节点,也会跳过其所有子节点)。当遍历继续时(第4点),这部分代码在Node class:

中处理
void processNode(final Arguments arguments, final boolean processTextNodes, final boolean processCommentNodes) { 
    // some code 
    if (!isPrecomputed()) { 
        precomputeNode(arguments.getConfiguration()); 
    } 

    if (!isSkippable()) { 
            // processing itself 
            ... 

            // move processing to children, but does not happend if node is marked as skippable 
            doAdditionalProcess(executionArguments, executionArguments.getProcessTextNodes(), executionArguments.getProcessCommentNodes()); 
    } 
} 

由于从片段中提取的节点未标记为precomputed,因此precomputeNode方法如下:

final void precomputeNode(final Configuration configuration) { 
    if (!isPrecomputed()) { 
        this.processors = configuration.computeProcessorsForNode(this); 
        if (this.processors == null || this.processors.size() == 0) { 
            this.skippable = true; 
        } else { 
            unsafeSetSkippable(false); 
        } 
            setPrecomputed(true); 
    } 
    doAdditionalPrecomputeNode(configuration); 
} 

由于节点未标记为precomputed,因此调用方法computeProcessorsForNode()。此方法返回null,然后节点标记为skippable。正如评论所说,当前节点的兄弟节点应该在doAdditionalPrecomputeNode()方法中将此节点设置为不可跳过。 不幸的是,这不会发生。

经过一些调试后我发现,在片段的所有提取节点上都必须调用方法node.setProcessable(true);,以避免将第一个节点设置为skippable。 我仍然不知道这是一个错误或功能..