从ActionContext(i18n)获取TextProvider的最佳方法

时间:2012-07-24 13:44:26

标签: struts2 displaytag

我正在修改http://displaytag.svn.sourceforge.net/viewvc/displaytag/trunk/displaytag/src/main/java/org/displaytag/localization/I18nWebworkAdapter.java?revision=1173&view=markup处的代码,该代码从Displaytag中的密钥获取i18n资源(请参阅下面的代码)。

我想知道这是否是最干净的方法(我不喜欢那里的迭代器)。然而,我看到的唯一选择是从ActionInvocation(ActionContext.getContext()。getActionInvocation()。getAction())获取Action并依赖于对ActionSupport的强制转换来获取资源(实现TextProvider)。但这似乎并不安全(行动可能不会扩展行动支持)。

你还有其他建议吗?

/**
 * @see I18nResourceProvider#getResource(String, String, Tag, PageContext)
 */
public String getResource(String resourceKey, String defaultValue, Tag tag, PageContext pageContext)
{

    // if resourceKey isn't defined either, use defaultValue
    String key = (resourceKey != null) ? resourceKey : defaultValue;

    String message = null;
    OgnlValueStack stack = TagUtils.getStack(pageContext);
    Iterator iterator = stack.getRoot().iterator();

    while (iterator.hasNext())
    {
        Object o = iterator.next();

        if (o instanceof TextProvider)
        {
            TextProvider tp = (TextProvider) o;
            message = tp.getText(key, null, null);

            break;
        }
    }

    // if user explicitely added a titleKey we guess this is an error
    if (message == null && resourceKey != null)
    {
        log.debug(Messages.getString("Localization.missingkey", resourceKey)); //$NON-NLS-1$
        message = UNDEFINED_KEY + resourceKey + UNDEFINED_KEY;
    }

    return message;
}

2 个答案:

答案 0 :(得分:5)

您可以使用LocalizedTextUtil类来查找消息。

LocalizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale());

此方法采用可选的参数Object[]代替消息。

答案 1 :(得分:0)

最佳方式是以与文本标记相同的方式(检查实现),或其余标记执行:通过搜索堆栈。

另外,你可能并不是要明确地转换为ActionSupport,你可能想要检查它是否可以转换为TextProvider,这是你真正感兴趣的。< / p>

我不确定你对迭代器的问题是什么 - 它应该如何完成,因为你的目标是走遍堆栈并尝试使用最顶层的TextProvider。您可能不希望停止最顶层,取决于您的需求/目标。