为什么 <s:text> 标签名不支持运行时表达式?

Why <s:text> tag name does not support runtime expressions?

我需要在当前year内打印一段文字,我的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate var="year" value="${now}" pattern="y" />
<p>
    <s:text name="%{getText('app.footer', {${year}})}" />
</p>

错误是

"name" does not support runtime expressions.

如何在不创建额外的 类 或动作变量的情况下安排它?

您可以只使用 Struts2 标签,不需要使用 fmt 标签。

<s:bean var="date" name="java.util.Date" />
<s:date var="year" name="#date" format="y" />
<p>
    <s:text name="app.footer">
        <s:param value="#year" />
    </s:text>
</p>

您不能在 S2 标签内使用 ${}<s:text> 标签将呈现 I18n 文本消息,无需在其中使用 getText 方法。

默认情况下 <fmt:formatDate> 标记在页面范围内创建一个变量。要在 OGNL 中访问此变量,您应该使用 #attr 前缀。

如果您使用 getText() 获取消息,则不需要 <s:text> 标签。

<s:property value="%{getText('app.footer', {#attr.year})}" />

您还应该知道 JSP EL 表达式求值在 Struts 标记属性中被禁用,以防止不同表达式引擎对表达式进行双重求值。如果Struts在属性中找到这样的表达式,就会报错。