2014-06-05 89 views
1

我知道,默認的servlet會自動返回靜態資源。然而,我的網址是相當特殊的,我不希望它看起來像http://mysite/app/test.html。也許是這樣的:如何使servlet映射一個特殊的URL到一個靜態資源?

http://mysite/app/dosomething/7419698f 

我要地圖(或轉發?)這個請求到一個靜態的html文件,例如/WEB-INF/pages/dowork.html。對於更多,7419698f只是一個參數,http://mysite/app/dosomething/2926739e也將映射到相同的靜態文件。我知道這樣的解決方法:

<servlet> 
    <servlet-name>test</servlet-name> 
    <jsp-file>/pages/dowork.html</jsp-file> 
</servlet> 
<servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/dosomething/*</url-pattern> 
</servlet-mapping> 

它只適用於dowork.html是合法的jsp文件。如果我想要像這樣提供圖像資源,它會變成錯誤。

+0

您可能希望你的URL模式映射到特定的servlet,並用它來重定向,嘗試尋找過這個問題:HTTP://計算器

的GUID參數可以通過JavaScript代碼一樣,被檢索.com/questions/6175722/redirect-from-servlet –

回答

1

獅子座Literak的線索是正確的。我的要求不能通過簡單的XML配置完成,我必須做更多的事情。

我需要一個過濾器。在web.xml:

<filter> 
    <filter-name>summary-fw-filter</filter-name> 
    <filter-class>com.mycompany.mywebapp.filter.SummaryForwardFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>summary-fw-filter</filter-name> 
    <url-pattern>/summary/*</url-pattern> 
</filter-mapping> 

過濾器的代碼:

public class SummaryForwardFilter implements Filter{ 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest)servletRequest; 
     HttpServletResponse response = (HttpServletResponse)servletResponse; 
     String url = request.getRequestURL().toString(); 
     String[] urlSegments = url.split("/"); 
     String guid = urlSegments[urlSegments.length-1]; 
     if(guid.matches("^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$")){ 
      request.getRequestDispatcher("/WEB-INF/pages/summary.jsp").forward(servletRequest, servletResponse); 
      return; 
     } 
     response.sendError(HttpServletResponse.SC_NOT_FOUND); 
    } 

    @Override 
    public void destroy() { 
    } 
} 

然後,URL http://mysite/mywebapp/summary/ecef22d6-7aa6-49db-b0d3-6577a63d14c8將被映射到/WEB-INF/pages/summary.jsp。試圖映射到非jsp文件時也是可以的。

function extractGuid(value) { 
    var re = /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i; 
    var match = re.exec(value); 
    return match ? match[0] : null; 
} 

var guid = extractGuid(window.location.href); 
1

地圖與default的servlet的URL(你不需要聲明它)

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>/dosomething/*</url-pattern> 
</servlet-mapping> 
+0

我剛開始認爲我的回答是錯誤的,並且重定向servlet /過濾器是必需的。我會在晚上做一些原型。 –