2

次の状況があります。
着信クエリを適切なアプリケーションにマップしたい(サーブレットフィルタを使用してクエリにアクセスしたい)。このために、アプリケーションをコンテキストルートにマップするテーブルがあります。例:

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

したがって、パス/ application1 / subcontext1 / someotherpathを持つクエリがある場合は、Application1 Subcontext 1を取得したいのですが、クエリURL / application1 / sompathがある場合は、Application1Rootcontextを取得したいと思います。

私の最初の推測は、コンテキストルートのマッピング(ノードとしてのそのURLのすべての部分)を使用してある種のツリーを構築し、クエリURLを分割してツリーをたどり、最も具体的なアプリケーションマッピングを取得することでした。

それが最善の解決策でしょうか、それとも私の問題について他に何か提案がありますか?

4

1 に答える 1

1

ツリーを使用して前方に歩く代わりに、マップをaとして使用しMap<String, ApplicationContext>、最初のnull以外の近似が見つかるまで後方に歩くことができます。このコードは、それを行う方法の大まかなアイデアを提供するはずです。

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;
        }
    }
}

そしてそれのためのフィドル

于 2012-11-22T11:43:06.793 に答える