我正在修改 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)。不过,这似乎不太安全( Action 可能不会扩展 Action 支持)。

你有什么其他的建议?

/**
 * @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;
}

最佳答案

最好的方法是按照文本标签的方式(检查实现)或其他标签的方式来做:通过搜索堆栈。

此外,您可能并不是要显式转换为 ActionSupport ,您可能想检查它是否可以转换为 TextProvider ,这才是您真正感兴趣的。

我不确定您对迭代器的问题是什么——这就是它应该如何完成的,因为您的目标是遍历堆栈并尝试使用最顶层的 TextProvider 。您可能不想停留在最顶层,这取决于您的需求/目标。

关于struts2 - 从 ActionContext (i18n) 获取 TextProvider 的最佳方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11632222/

10-12 03:47