当前位置: 首页 > 知识库问答 >
问题:

带有标准表达法的百里香方言

雷逸仙
2023-03-14

我已经创建了一个定制的Thymeleaf 3方言,如果我只使用静态属性值,它就可以正常工作,如下所示:

<formBuilder:inputRow title="Email:" name="email" value="test@test.com" />

但是,我想使用标准的Thymeleaf表达式来填充value属性,但是如果我这样写:

<formBuilder:inputRow title="Email:" name="email" value="${user.email}" />

输出将是文本${user.email},而不是实际的电子邮件地址。

如果我像这样使用th:value:

<formBuilder:inputRow title="Email:" name="email" th:value="${user.email}" />

然后根本不生成值字段。

方言类如下。它仅注册elementTag处理器:

public class FormBuilderDialect extends AbstractProcessorDialect {

    private static final String DIALECT_NAME = "Form Builder Dialect";

    public FormBuilderDialect() {
        super(DIALECT_NAME, "formBuilder", StandardDialect.PROCESSOR_PRECEDENCE);
    }

    @Override
    public Set<IProcessor> getProcessors(String dialectPrefix) {
        final Set<IProcessor> processors = new HashSet<IProcessor>();
        processors.add(new InputElementTagProcessor(dialectPrefix));
        return processors;
    }
}

元素处理器是:

public class InputElementTagProcessor extends AbstractElementTagProcessor {

    private static final String TAG_NAME = "inputRow";
    private static final int PRECEDENCE = 1000;

    public InputElementTagProcessor(final String dialectPrefix) {
        super(
                TemplateMode.HTML, // This processor will apply only to HTML mode
                dialectPrefix,     // Prefix to be applied to name for matching
                TAG_NAME,          // Tag name: match specifically this tag
                true,              // Apply dialect prefix to tag name
                null,              // No attribute name: will match by tag name
                false,             // No prefix to be applied to attribute name
                PRECEDENCE);       // Precedence (inside dialect's own precedence)
    }

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

        final String name = tag.getAttributeValue("name");
        final String value = tag.getAttributeValue("value");

        final IModelFactory modelFactory = context.getModelFactory();

        final IModel model = modelFactory.createModel();

        // Add input
        Map<String, String> inputAttributes = new HashMap<>();
        inputAttributes.put("name", name);
        inputAttributes.put("value", value);
        model.add(modelFactory.createStandaloneElementTag("input", inputAttributes, AttributeValueQuotes.DOUBLE, false, false));

        structureHandler.replaceWith(model, false);
    }
}

你知道怎么解决这个问题吗?

共有2个答案

万俟光临
2023-03-14

有同样的问题,有一个更简单的方法

米项禹
2023-03-14

为了解决这个问题,我必须创建一个属性标记处理器,如下所示:

public class FormBuilderAttributeTagProcessor extends AbstractAttributeTagProcessor {

    private static final String ATTR_NAME = "value";
    private static final int PRECEDENCE = 100;

    public FormBuilderAttributeTagProcessor(final String dialectPrefix) {
        super(
                TemplateMode.HTML,
                dialectPrefix,
                "inputRow",
                true,
                ATTR_NAME,
                false,
                PRECEDENCE,
                false);
    }

    @Override
    protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName, String attributeValue, IElementTagStructureHandler structureHandler) {
        final IEngineConfiguration configuration = context.getConfiguration();

        final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration);

        final IStandardExpression expression = parser.parseExpression(context, attributeValue);

        final String result = (String) expression.execute(context);

        structureHandler.setAttribute("value", result);
    }
}

并将其注册为方言类中的处理器:

public class FormBuilderDialect extends AbstractProcessorDialect {

    private static final String DIALECT_NAME = "Form Builder Dialect";

    public FormBuilderDialect() {
        super(DIALECT_NAME, "formBuilder", StandardDialect.PROCESSOR_PRECEDENCE);
    }

    @Override
    public Set<IProcessor> getProcessors(String dialectPrefix) {
        final Set<IProcessor> processors = new HashSet<IProcessor>();
        processors.add(new InputElementTagProcessor(dialectPrefix));
        processors.add(new FormBuilderAttributeTagProcessor(dialectPrefix));
        return processors;
    }
}
 类似资料:
  • 我想在胸腺方言中使用胸腺方言,但不能。我尝试过这个,但效果不佳: of删除里面的所有内容。我想在渲染后得到这样的东西: 那么,我该如何实现我的目标呢?

  • 我正在遍历一个列表,并为每个设置一个属性,如下所示 其中,是一个权限字符串。 即使用户有权限,div也不会渲染。我尝试过这样使用th: attr: 仍然不起作用。我认为shiro:hasPermission=“${element.permission}”的用法不正确。我该如何解决这个问题? 我使用的是Spring MVC Thymeleaf Thymeleaf Shiro方言。

  • 大家好,我对thymeleaf和我的静态html页面有一个问题。更具体地说,我有一个spring mvc web应用程序,我也在使用spring security,在我的登录页面中,我想使用thymeleaf,这样spring security可以与另一端的客户端层通信吗?我不想在我的所有html页面中包括thymeleaf,因为我将使用AngularJs 我尝试将登录名放在templates文件

  • 我是百里香的初学者。我从一个常见的布局页面开始: 碎片/布局。html 和一个内容页面: 页html 当我渲染页面时,标题总是来自模板,而不是页面。在Thymeleaf中,是否有可能具有共同的元、脚本和样式(在HEAD标签中),但具有每页标题?

  • 使用SpringMVC+Thymeleaf,如何将基于整数的模型属性绑定到使用th:value或th:field的表单中的输入字段,而字段本身不显示值“0”。

  • 我使用Spring的引导2.6.3和我试图使用thymeleaf最近得到一个与html的确认消息后,我通过邮件确认我的帐户(我只是使用确认邮件来验证新帐户),所以我看了一些关于thymeleaf的视频,我标记所有的视频都有一个名为模板的文件夹和静态在src/main/ressource和我没有他们,所以我创建了一个名为模板的文件夹,在文件夹中我创建了一个html文件只是为了尝试它,如果它(html