2012-11-22 3 views
2

다음과 같은 상황이 발생했습니다.
들어오는 쿼리 (해당 쿼리에 액세스하기 위해 서블릿 필터 사용)를 적절한 응용 프로그램에 매핑하려고합니다. 내가 경로/응용 프로그램 1/subcontext1/someotherpath와 쿼리가있을 때URL을 가장 구체적인 컨텍스트 루트에 매핑합니다.

/application1/    | Application1 Rootcontext 
/application1/subcontext1 | Application1 Subcontext 1 
/application1/subcontext2 | Application1 Subcontext 2 
/application2/    | Application2 

그래서, 내가 응용 프로그램 1 서브 컨텍스트 1 싶어이 들어, 나는 그들의 contextroots에 응용 프로그램을 매핑 테이블, 예를 쿼리 URL/application1/sompath가 있는데, 응용 프로그램 1 루트 콘텍스트를 가져 오려고합니다.

내 첫 번째 추측은 컨텍스트 루트 (노드로 해당 URL의 모든 부분) 매핑에 일종의 트리를 작성한 다음 쿼리 URL을 분할하고 트리를 따라 가장 구체적인 응용 프로그램 매핑.

그게 최선의 해결책일까요? 아니면 내 문제에 대한 다른 제안이 있습니까?

답변

1

나무 대신 산책로를 걷는 경우 Map<String, ApplicationContext>으로지도를 만들 수 있으며 첫 번째 자연수가 될 때까지 뒤로 걸어 갈 수 있습니다.

import java.util.HashMap; 
import java.util.Map; 

public class Main { 
    public static final class ApplicationContext { 
     private final String app; 
     private final String ctx; 

     public ApplicationContext(final String app, final String ctx) { 
      this.app = app; 
      this.ctx = ctx; 
     } 

     @Override 
     public String toString() { 
      return "ApplicationContext[" + app + "/" + ctx + "]"; 
     } 
    } 

    private static ApplicationContext ac(final String app, final String ctx) { 
     return new ApplicationContext(app, ctx); 
    } 

    private static ApplicationContext getApplicationContext(final String url, 
      final Map<String, ApplicationContext> urlMap) { 
     String specificUrl = url; 
     ApplicationContext result = null; 
     while (specificUrl != null && result == null) { 
      result = urlMap.get(specificUrl); 
      specificUrl = shortenUrl(specificUrl); 
     } 

     return result; 
    } 

    public static void main(final String[] args) throws Exception { 
     final Map<String, ApplicationContext> urlMap = new HashMap<String, ApplicationContext>(); 
     urlMap.put("/application1", ac("Application1", "Root")); 
     urlMap.put("/application1/subcontext1", ac("Application1", "SubContext1")); 
     urlMap.put("/application1/subcontext2", ac("Application1", "SubContext2")); 
     urlMap.put("/application1/subcontext2/subcontext3", ac("Application1", "SubContext3")); 
     urlMap.put("/application2", ac("Application2", null)); 

     System.out.println(getApplicationContext("/application1/", urlMap)); 
     System.out.println(getApplicationContext("/application1/abc", urlMap)); 
     System.out.println(getApplicationContext("/application1/subcontext2/abc", urlMap)); 
    } 

    private static String shortenUrl(final String url) { 
     final int index = url.lastIndexOf('/'); 
     if (index > 0) { 
      return url.substring(0, index); 
     } 
     else { 
      return null; 
     } 
    } 
} 

그리고 그것을 위해 fiddle :이 코드는 당신이 그것을 수행하는 방법의 거친 아이디어를 줄 것이다.

+0

감사합니다.이 솔루션을 사용할 수 있다고 생각합니다. – dunni

관련 문제