有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将URL映射到最特定的上下文根

我有以下情况:
我希望将传入的查询(我使用servlet过滤器访问查询)映射到合适的应用程序。为此,我有一个表,将应用程序映射到它们的contextroots,例如:

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

因此,当我有一个路径为/application1/Subcontext 1/someotherpath的查询时,我想得到application1 Subcontext 1,当我有一个查询URL/application1/sompath时,我想得到application1 Rootcontext

我的第一个猜测是,我用contextroots的映射构建了某种树(该URL的每个部分都作为一个节点),然后拆分查询URL并沿着树走,以获得最具体的应用程序映射

这是最好的解决办法,还是你对我的问题还有其他建议


共 (1) 个答案

  1. # 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