我正在尝试使用thymeleaf创建自定义标记,就像在jsp中一样。我现在的标签是:
<select th:include="fragments/combobox :: combobox_beans (beans=${@accountService.getAccounts()}, innerHTML='id,description,currency', separator=' - ', dumbHtmlName='List of accounts', name='sender' )" th:remove="tag"></select>
其目的只是定义bean列表、要在屏幕上显示的bean的属性、它们之间的分隔符、显示为本机模板时的默认值以及我们在这里处理的原始bean的属性名。
组合框.html:
<div th:fragment="combobox_beans (beans, innerHTML, separator, dumbHtmlName, name)">
<select th:field="*{__${name}__}" class="combobox form-control" required="required">
<option th:each="obj : ${beans}" th:with="valueAsString=${#strings.replace( 'obj.' + innerHTML, ',', '+'' __${separator}__ ''+ obj.')}"
th:value="${obj}" th:text="${valueAsString}" >
<p th:text="${dumbHtmlName}" th:remove="tag"></p>
</option>
</select>
我需要option标记的文本基于片段的innerhtml属性(innerhtml='id,description,designe')中设置的属性。最后我有了一个选择:
<option value="...">obj.id+' - '+ obj.description+' - '+ obj.currency</option>
而不是期望的结果
<option value="...">2 - primary - USD</option>
我知道这是由于字符串库的使用导致了一个字符串。有没有办法让thymeleaf重新计算这个字符串,让它再次被理解为一个对象?
也许在这种情况下使用字符串库是非常错误的。。。也许我需要使用th:each来将每个bean作为一个对象进行处理并读取其属性,但是同样,如何只获取innerhtml中指定的属性呢?
有人对此有解决方案或解决方法吗?
谢谢。
1条答案
按热度按时间kdfy810k1#
如果有一种方法可以在thymeleaf/spring表达式中单独实现您想要的功能,那么它肯定非常复杂和冗长,而且读起来可能会很痛苦。
更简单的方法是向表达式上下文添加一个自定义实用程序对象。只需要很少的代码。这个答案说明了这一点。
然后需要在springxml配置中将新方言作为附加方言添加到模板引擎中。假设您有一个相当标准的spring配置,它应该与此类似。
现在是效用对象
您需要的是按名称从对象中获取属性,并用分隔符组合它们的值。似乎财产名称的列表可以有任何大小。对于通过名称访问属性,最方便的方法是使用apachebeanutils这样的库。
使用java 8 streams库、lambdas和beanutils,您的自定义实用程序对象可以如下所示:
当您将方言添加到springtemplateengine时,您可以调用您的实用程序:
我取代了你
innerHTML
参数properties
这是一个List<String>
,因为这更有意义。它本质上是一个属性名列表,springel支持内联列表。你的电话标签应该是这样的。