【问题标题】:How to find servlet class name using url pattern?如何使用 url 模式查找 servlet 类名?
【发布时间】:2017-04-01 17:55:36
【问题描述】:

我在 Eclipse 中使用@WebServlet 注释。根据给定的 url 模式确定 servlet 类名的最佳方法是什么?在使用WebServlet 之前,我能够在 web.xml 中搜索模式。但现在我不得不在整个项目中搜索 url 模式。

一个具体的例子是:

servlet 名称:MyServlet
url-pattern: /myPattern/*

假设在这种情况下我不知道 servlet 名称。而且我知道模式“/myPattern/*”。除了搜索“/myPattern/*”之外,我还能做些什么来快速查找名称MyServlet

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    您可以从上下文中获取所有 ServlerRegistration 并遍历它们中的每一个搜索给定 urlPattern 的匹配项。见下面方法searchServletRegistrationByUrlPattern()。

    如果您在项目中经常需要这个,您可以创建一个 Map,其中 urlPattern 作为键,servletName 作为值。类似于 createMapOfUrlPatternsToServletNames() + searchServletRegistrationByUrlPattern2()。

    package testingThings;
    
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Map;
    import java.util.TreeMap;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletRegistration;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/myPattern/*")
    public class FindServletByUrlPattern extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /**
         * Search through all ServletRegistrations and return this which is mapped of the given urlPattern. 
         * If no match is found returns null.
         * 
         * @param urlPattern
         * @return ServletRegistration | null
         * @throws IOException
         */
        protected ServletRegistration searchServletRegistrationByUrlPattern(String urlPattern) throws IOException {
            Map<String, ? extends ServletRegistration> servletRegistrations = getServletContext().getServletRegistrations();
    
            for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
    
                ServletRegistration servletRegistration = entry.getValue();
                Collection<String> mappings = servletRegistration.getMappings();
    
                if (mappings.contains(urlPattern)) {
                    return servletRegistration;
                }
            }
    
            return null;
        }
    
        /**
         * Search in a map for given urlPattern. 
         * If no match is found returns null.
         * 
         * @param urlPattern
         * @return ServletRegistration | null
         * @throws IOException
         */
        protected ServletRegistration searchServletRegistrationByUrlPattern2(String urlPattern) throws IOException {
            // create urlPattern map
            Map<String, String> urlPatterns = createMapOfUrlPatternsToServletNames();
    
            String servletName = urlPatterns.get(urlPattern);
    
            if (servletName== null) {
                return null;
            }
    
            ServletRegistration servletRegistrationOfSearchedUrlPatternInMap = getServletContext().getServletRegistration(servletName);
            return servletRegistrationOfSearchedUrlPatternInMap;
        }
    
        protected Map<String, String> createMapOfUrlPatternsToServletNames() throws IOException {
            Map<String, String> urlPatters = new TreeMap<String, String>();
    
            Map<String, ? extends ServletRegistration> servletRegistrations = getServletContext().getServletRegistrations();
    
            for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
    
                ServletRegistration servletRegistration = entry.getValue();
                Collection<String> mappings = servletRegistration.getMappings();
    
                for (String urlPattern : mappings) {
                    urlPatters.put(urlPattern, entry.getValue().getName());
                }
            }
    
            return urlPatters;
        }
    
        protected void showInfoAboutServletRegistration(ServletRegistration servletRegistration, HttpServletResponse response) throws IOException {
            if (servletRegistration == null) {
                response.getWriter().append("there is not servlers for this url-pattern<br>");
            }
            else {
                response.getWriter()
                    .append("Servlet Name: ").append(servletRegistration.getName()).append("<br>")
                    .append("Servlet Class Name: ").append(servletRegistration.getClassName()).append("<br>")
                    .append("Mapping: ").append(Arrays.toString(servletRegistration.getMappings().toArray())).append("<br>")
                    .append("<br><br>")
                ;
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
    
            // get ServletRegistration of the current servlet through servlet's name
            ServletRegistration servletRegistrationOfCurrentServlet = getServletContext().getServletRegistration(getServletName());
            // show in browser
            showInfoAboutServletRegistration(servletRegistrationOfCurrentServlet, response);
    
            // search ServletRegistration through url-pattern directly
            String urlPattern = request.getParameter("url-pattern");
            if (urlPattern == null) {
                response.getWriter().append("use a query string parameter 'url-pattern' in order to search servlets for a pattern");
            }
            else {
                ServletRegistration servletRegistrationOfSearchedUrlPattern = searchServletRegistrationByUrlPattern(urlPattern);
                // show in browser
                showInfoAboutServletRegistration(servletRegistrationOfSearchedUrlPattern, response);
            }
    
            // search ServletRegistration through url-pattern over map
            ServletRegistration servletRegistrationOfSearchedUrlPatternInMap = searchServletRegistrationByUrlPattern2(urlPattern);
            showInfoAboutServletRegistration(servletRegistrationOfSearchedUrlPatternInMap, response);
    
            showInfoAboutAllServletRegistrations(request, response);
        }
    
        protected void showInfoAboutAllServletRegistrations(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.getWriter()
                .append("<h3>All ServletRegistrations</h3>")
                .append("<table>")
                .append("<tr><th>")
                .append("servletName:" )
                .append("</th><th>")
                .append("servletClassName:" )
                .append("</th><th>")
                .append("Mapping:" )
                .append("</th></tr>")
            ;
    
            Map<String, ? extends ServletRegistration> servletRegistrations = request.getServletContext().getServletRegistrations();
    
            for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
    
                ServletRegistration servlet = entry.getValue();
                String servletName = servlet.getName();
                String servletClassName = servlet.getClassName();
                Collection<String> mappings = servlet.getMappings();
    
                response.getWriter()
                    .append("<tr><td>")
                    .append(servletName)
                    .append("</td><td>")
                    .append(servletClassName)
                    .append("</td><td>")
                    .append(Arrays.toString(mappings.toArray()))
                    .append("</td></tr>")
                ;
    
            }
        }
    
    }
    

    JavaDocs

    【讨论】:

    • 这不是我想要的。不过谢谢!我希望有一种不涉及编写自定义解决方案的方法。现在,我将通过一个自制的规则,即 urlPattern 必须与 servlet 名称匹配。它现在正在工作。
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2011-05-12
    • 2017-03-27
    • 2011-02-24
    • 2020-01-06
    • 2012-11-26
    • 2014-04-11
    • 2011-09-27
    相关资源
    最近更新 更多