我刚开始使用百日咳进行模板化,我正在尝试为链接创建一个自定义处理器
我希望能够使用以下示例中的标记在我的模板中创建自定义链接:
<link rel="stylesheet" type="text/css" custom:href="/styles/main.css" />
我的想法是我在网站上有自定义网址,因此我的自定义处理器会为所提供的相对链接生成正确的网址。
以上工作正常 - 但是,现在我希望能够包含变量以确保传递给处理器的值 - 所以遵循the thymeleaf docs中的示例,并在处理器中,我生成替换URL我添加了StandardExpression内容:
@Override protected String getTargetAttributeValue( Arguments arguments, Element element, String attributeName ){
need this to see if it can be factored out
final Configuration configuration = arguments.getConfiguration()
final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration)
final String attributeValue = element.getAttributeValue(attributeName)
final IStandardExpression expression = parser.parseExpression(configuration, arguments, attributeValue)
final String relativeUrl = (String) expression.execute(configuration, arguments)
urlService.generateUrl( relativeUrl )
}
我希望通过这个添加,我还可以添加如下链接:
<link rel="stylesheet" type="text/css" custom:href="/styles/${user.name}/main.css" />
(例子不是真的,我实际上并没有提供基于用户的css :) - 但你明白了这一点)
但是那打破了我的第一个简单示例,因为文字URL字符串不是表达式,为了解决这个问题,我似乎还必须在我的URL中添加单引号,以便表达式解析器知道它的字符串而不是变量。
<link rel="stylesheet" type="text/css" custom:href="'/styles/main.css'" />
这看起来非常难看,并且在简单的情况下可能容易重复单引号(这将是大多数情况) - 有更好的方法吗?我希望,因为表达式的东西都是基于花括号的,所以解析器应该有一种方法可以识别出有效表达式之外的任何东西都可以被视为字符串吗?
(老实说,让我了解正在发生的事情有点困难 - javadoc似乎非常稀疏,而且似乎没有很多例子 - 很多人试图阅读原始资料代码,以确定我应该使用哪些类等)
答案 0 :(得分:0)
这个答案经过很长一段时间,但会留在这里给任何偶然发现这个问题的人。
Yout不需要自定义属性provessor。 Thymeleaf具有内置功能,可满足您的要求,即链接URL输出表达式(link to docs)。
要输出静态网址,请按以下方式编写:
<link ... th:href="@{/styles/main.css}" />
正如文档所说,当你将/
放在前面时,输出的URL将是上下文相对的。因此,如果您的网站部署在/mysite
,则属性th:href="@{/styles/main.css}"
将转换为href="/mysite/style/main.css"
。如果站点部署在根上下文中,则结果将为href="/style/main.css"
。
链接网址表达式还包括支持插入网址参数,如下所示:
<link ... th:href="@{/styles/main.css(un=${user.name})}"/>
参数在url路径末尾的括号内指定。您可以将多个参数分为逗号分隔。上述结果为href="mysite/styles/main.css?un=rick"
,假设user.name
为rick
。
如果要将参数插入路径,请编写以下内容:
<link ... th:href="@{/styles/{un}/main.css(un=${user.name})}"/>
{un}
将替换为${user.name}
的值,而不附加任何参数。结果是:
<link ... href="mysite/styles/rick/main.css"/>
这正是你所需要的。
首先看一下语法看起来很复杂。您应仔细阅读文档以了解它。重点是Thymeleaf有3种类型的花括号:
${...}
代表Thymeleaf docs称之为“变量表达式”。对于您的案例中的Spring EL表达式,或者对于标准方言中的OGNL表达式,这意味着什么#{...}
用于本地化的消息密钥,@{...}
用于链接网址输出,我们在此处介绍您应该阅读这些以及文档中的整个Thymeleaf表达式语言。本地化的消息输出也有自己的特殊功能,如url输出。