2012-07-24 1 views
4

입니다. Displaytag의 키에서 i18n 리소스를 가져 오는 http://displaytag.svn.sourceforge.net/viewvc/displaytag/trunk/displaytag/src/main/java/org/displaytag/localization/I18nWebworkAdapter.java?revision=1173&view=markup의 코드를 적용했습니다 (아래 코드 참조).ActionContext (i18n)에서 TextProvider를 가져 오는 가장 좋은 방법은

이것이 가장 깨끗한 접근법인지 궁금해하고 있습니다. (필자는 이터레이터를 싫어합니다.) 그러나 내가 볼 수있는 유일한 대안은 ActionInvocation (ActionContext.getContext(). getActionInvocation(). getAction())에서 Action을 가져오고 ActionSupport로 캐스팅하여 리소스 (TextProvider를 구현)를 가져 오는 것입니다. 이것은 매우 안전하지는 않지만 (action은 actionsupport를 확장하지 못할 수도 있습니다).

다른 의견이 있으십니까?

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

가장 방법은 텍스트 태그 (이행 확인) 않습니다 같은 방식으로 수행하는 것, 또는 태그의 나머지 부분을 수행 스택을 검색하여.

또한, 당신은 아마 당신은 당신이 실제로 관심이 무엇입니까 TextProvider로는 스트 있는지 확인 할 가능성이 것, 명시 적으로 ActionSupport에 캐스팅 의미하지 않는다.

을 아니에요 이터레이터의 문제점은 –입니다. 어떻게해야할까요? 스택을 걷고 최상위 비트 인 TextProvider을 시도하는 것이 목표이므로 수행해야합니다. 정지를 원하지 않을 수도 있습니다. 가장 큰 것은 필요/목표에 따라 다릅니다.

4

LocalizedTextUtil 클래스를 사용하여 메시지를 찾을 수 있습니다.

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

이 방법은 메시지로 치환 Object[] PARAMS 선택적 걸린다.

관련 문제