2012-07-24 13 views
4

我正在修改代碼http://displaytag.svn.sourceforge.net/viewvc/displaytag/trunk/displaytag/src/main/java/org/displaytag/localization/I18nWebworkAdapter.java?revision=1173&view=markup,該代碼從Displaytag中的鍵(請參閱下面的代碼)獲取i18n資源。從ActionContext(i18n)獲取TextProvider的最佳方法

我想知道這是否是最乾淨的方法(我不喜歡那裏的迭代器)。然而,我看到的唯一選擇是從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; 
} 

回答

0

最好的辦法是做同樣的方式文本標籤不(檢查執行),或標籤的其餘部分做:通過搜索堆棧。

而且,你可能不意味着明確地轉換爲ActionSupport,你很可能要檢查它是否是強制轉換爲一個TextProvider,這是你真正感興趣的。

我不是確定你的問題與迭代器是–這就是它應該如何完成,因爲你的目標是走棧,並嘗試與最頂端的TextProvider。你可能不想停止與最頂級,取決於你的需求/目標。

4

您可以使用LocalizedTextUtil類來查找消息。

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

該方法採用可選參數Object[]代替消息。

相關問題