2012-10-05 1 views
3

내 문제로 2 시간 동안 검색되었지만 여전히 해결 방법을 찾지 못했습니다. 내가 원하는 무엇struts2 i18ninterceptor가 동일한 페이지 또는 동작으로 돌아 가기

: 나는 국제 출원에 대한 struts2를 사용하고

그래서 다중 언어 지원이 필요합니다. 그래서 i18n-Interceptor가 전달할 하나의 매개 변수로 로케일을 변경한다는 것을 알았습니다 (매우 멋지다!). 이제 응용 프로그램의 모든 지점에서 로케일을 변경하여 사용자가 언어를 변경할 수 있고 그가 사용하는 것과 동일한 페이지 나 동작으로 전달할 수 있습니다. 이것은 그렇게 쉬운 것처럼 보이지 않습니다. 난 이미 구글에있는 다음과 같은 일을 시도했지만, 나를 위해 작동하지 않습니다

  1. 가 acutall URL을 /를 사용하여 JSP에 대한 URI ("ShowUser.action"같은) 다른 로케일이 전화 -> 매개 변수가있는 jsp에서 전체 URL 또는 URI를 가져 오는 방법이 없습니다. URL이 나에게 타일 (예 : /content/site/user.jsp)의 현재 사이트를 제공하고 URI가 내 타일 레이아웃 (즉, /content/layout.jsp)을 반환합니다. > 방법을 찾을 수 없습니다 ..

  2. 사용 "request.getHeader ("- 나는 request.getRequestUrl()와

  3. 사용 ActionContext에이 JSP의 전체 URL을 얻을 수 request.getRequestURI()를 시도했습니다 ChangeLocale.action ""내에서) "referal이 동적으로 struts.xml에서 redirectAction로 설정 -> 작업을하지만 너무 많은 코드 세 번째 포인트와 함께 일하고있다 매개 변수를 사용하여 URL 등)

을 구문 분석 다음 코드는 더 나은 해결책을 찾고 있습니다.

struts.xml의 관련 부분

<action name="Locale" class="de.smg.LocaleAction"> 
    <interceptor-ref name="i18n"/> 
    <interceptor-ref name="basicStack"/> 
    <result type="redirectAction">${forwardAction}</result> 
    </action> 

LocaleAction.java :

http://server:port/ShowUser.action?id=1 

내가로 전환 사용자 사이트에 : 그래서 작업에서, 즉 온

public class LocaleAction extends ActionSupport implements ServletRequestAware { 

private static final long serialVersionUID = 1L; 
private static final String FALL_BACK_ACTION = "ShowStartPage"; 

private HttpServletRequest request; 
private String forwardAction = null; 

@Override 
public String execute() throws Exception { 
    String referer = request.getHeader("referer"); 
    String action = FALL_BACK_ACTION; 

    if (referer!=null) {   
     // WeberT: first cut off the protocol, server and port... 
     referer = referer.substring(referer.lastIndexOf("/") + 1, referer.length()); 

     // WeberT: then cut of the .action part if available 
     int dotPos = referer.indexOf("."); 

     if (dotPos>0) { 
      int qMarkPos = referer.indexOf("?"); 
      if (qMarkPos> 0 && dotPos < qMarkPos) {   
       action = referer.substring(0, dotPos) + referer.substring(qMarkPos, referer.length()); 
      } else { 
       action = referer.substring(0, dotPos);     
      }    
     } 
     forwardAction = action; 
    } 
    return SUCCESS; 
} 

@Override 
public void setServletRequest(HttpServletRequest request) { 
    this.request = request;  
} 

/** 
* @return the forwardAction 
*/ 
public String getForwardAction() { 
    return forwardAction; 
} 
} 

다른 언어로 LocaleAction이 forwardAction을 반환합니다.

ShowUser?id=1 

이렇게 작동하고 있지만 어두운면을 좋아하는 것 같습니다. 이 문제를 해결하기위한 올바른 해결책은 무엇입니까? 귀하의 답변에 감사드립니다. 난 당신이 ActionContext에서 벗어나고 싶은 정확히 잘 모르겠지만, 대부분의 정보가 여기 ActionContext에서 찾을 수 있습니다

답변

1

includeParams 속성이 all이고 빈 값이 value<s:url> 태그를 사용하십시오. (이 이미 defaultStack에 포함되어 있습니다)

<s:url var="urlen" includeParams="all" value=""> 
    <s:param name="request_locale">en</s:param> 
</s:url> 
<s:a href="%{urlen}">English</s:a> 

당신은 그것에 대해 특별한 액션 구성이 필요하지 않지만, i18n 인터셉터 스택 인터셉터에 있어야합니다.

+0

그게 전부 야 - 고마워, 나는 눈이 멀었다 :-) includeParams = "all"과 빈 값이 트릭을 만든다. – user1723414

+0

그러나 struts.xml의 올바른 구성은 무엇입니까? 나는 또한이 물건으로 조금 잃어버린 ... – aloplop85

+0

@ aloplop85 : 특별한 행동 구성이 필요하지 않습니다. 여전히 문제가 있거나 업데이트하지 않은 경우 upvote를 사용하여 업데이트 및 의견을 확인하십시오. –

0

:-)

안부 토마스는 그것의 일부

Object action=ActionContext.getContext().getActionInvocation().getAction(); 
ActionProxy actionProxy=ActionContext.getContext().getActionInvocation().getProxy(); 
String methodName=actionProxy.getMethod(); 
String context = actionProxy.getName(); 
String namespace= actionProxy.getNamespace(); 
ActionContext.getContext().getParameters() //parameters from the UI 
입니다

그래서 작업을 완료하는 데 필요한 거의 모든 정보를 볼 수 있습니다. ActionContext은 작업이 실행되는 컨텍스트입니다. 각 컨텍스트는 기본적으로 작업이 세션, 매개 변수, 로케일 등과 같이 실행에 필요한 객체의 컨테이너입니다.

ActionContext에 대한 가장 좋은 점은 ActionContext에 저장된 값이 스레드 당 고유하다는 것을 의미합니다.

대체적으로 javascript의 도움을 받아 현재 URL을 얻을 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 내 문제는 해결되지 않습니다. 예, JavaScript로 현재 URL을 얻을 수 있지만이 사이트에서 JS 사용을 피합니다. ActionContext의 문제점은 "LocalesAction"에있는 경우 잘못된 컨텍스트에있는 것입니다. 나는 첫 번째 게시물에서 당신에게 나의 sollution을 보여줄 것입니다. – user1723414