2016-11-18 4 views
0

Eclipseで@WebServlet注釈を使用しています。与えられたurl-patternに基づいてサーブレットクラス名を決定する最善の方法は何ですか? WebServletを使用する前に、web.xmlでパターンを検索できました。しかし、今私は、URLパターンのためのプロジェクト全体を検索する必要があります。urlパターンを使用してサーブレットクラス名を見つける方法は?

具体的な例は次のようになります。

サーブレット名:に、MyServlet
のurl-pattern:/ myPattern/*

のは、私はこの中で、サーブレット名を知らないとしましょう場合。私はパターン "/ myPattern/*"を知っています。 "/ myPattern/*"の検索のほかに、すぐに名前MyServletを検索するためにできることはありますか?

答えて

1

コンテキストからすべてのServlerRegistrationを取得し、それぞれの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>") 
      ; 

     } 
    } 

} 

のJavaDoc

+0

これは私が探しているかなりものではありません。でもありがとう!私は、カスタムソリューションをコーディングする必要がない方法を望んでいました。今は、urlPatternがサーブレット名と一致しなければならないという自己決定ルールに目を向けるつもりです。今のところ働いています。 – Tuan

関連する問題