java - 如何使用 url 模式查找 servlet 类名?

标签 java servlets

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

一个具体的例子是:

servlet-name: MyServlet
url-pattern: /myPattern/*

假设我不知道本例中的 servlet 名称。我知道模式“/myPattern/*”。除了搜索“/myPattern/*”之外,我还能做些什么来快速查找名称 MyServlet 吗?

最佳答案

您可以从上下文中获取所有 ServlerRegistrations,并遍历每个 ServlerRegistrations 来搜索给定 urlPattern 的匹配项。请参阅以下方法 searchServletRegistrationByUrlPattern()。

如果您的项目中经常需要此功能,您可以创建一个以 urlPattern 作为键、以 servletName 作为值的 Map。类似于 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>")
            ;

        }
    }

}

Java文档

关于java - 如何使用 url 模式查找 servlet 类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667633/

相关文章:

Java.exe 在 Android Studio 中以非零退出值 2 结束

java - 使用 servlet 在浏览器中显示 PDF

java - 按照正确的 OO 设计使用另一个对象的功能 - 封装

java嵌套类数据成员

java - 使用选择选项标签从Java中的数据库中检索记录

servlets - 从外部 web.xml 文件中访问 servlet 类

java - 需要从过滤 @WebFilter 中排除 js/css/jpg 等文件

Java 图像调整大小代码不起作用

java - JTabbedPane 正在读取击键并切换选项卡

java - 将解析的 CSV 文件插入 SQL Server