2013-11-15 1 views
2

내 서블릿 (Jetty에서 실행 중)은 정적 디렉토리에 정적 컨텐츠를 배포해야합니다.Jetty에서 기본 서블릿을 통해 정적 리소스 검색

디렉토리 구조 :

/ 
    - static/ 
    - [static files] 
    - WEB-INF/ 
    - [my servlet .class files and the web.xml] 

내 web.xml을

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

    <filter> 
     <filter-name>filter</filter-name> 
     <filter-class>com.example.StaticFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

내 주요 서블릿 파일 :

@WebServlet("/*") 
public class SampleClass extends HttpServlet { 
    //Code 
} 

그리고 내 필터 :

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 

public class StaticFilter implements Filter { 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest) request; 
     String path = req.getRequestURI().substring(req.getContextPath().length()); 

     if (path.startsWith("/static")) { 
      request.getRequestDispatcher(path).forward(request, response); 
     } else { 
      chain.doFilter(request, response); 
     } 
    } 
} 

이제 /static/style.css를 호출하면 파일을/static에서 가져 와서 서블릿으로 리디렉션하지 않겠습니다.

서버 : 부두 9.1.0 RC1

+0

당신이 필터? –

+0

죄송합니다. 필터 코드를 잊어 버렸습니다. 질문을 편집했습니다. –

+0

서블릿 사양에 따라 DefaultServlet에서 정적 컨텐츠가 제공된다는 것을 알고 계십니까? –

답변

2

귀하의 @WebServlet 적으로 실행되는 기본 서블릿을 방해하는 "/*"의 PathSpec에서 정의.

당신은 기본적으로 "나는 나를 통해 노선 모든 경로에 대한 모든 요청을 원하는, 내가 뭘하는지 알고있다"고 말했다

"/sample", 또는 "/sample/*", 또는 무언가의 pathspec에서 서블릿을 설정하는 고려 비슷한. "/" 또는 "/*"을 제외하고는 모든 것을 잡을 것입니다. HttpServlet을 A와 정의

@WebServlet("/sample/*") 

그렇지 않으면, 당신은 어떤 용기에 default 서블릿을 참조 할 수 있습니다뿐만 아니라 부두 (서블릿 사양의 그것의 필수 기능)이 같은 ...

getServletContext().getNamedDispatcher("default").forward(request, response); 
+0

이 필수 "기본"서블릿은 어떤 서블릿 스펙에서 지정됩니까? Servlet 3.0 사양은 "많은 컨테이너가 콘텐츠 제공을 위해 암시 적 기본 서블릿을 제공합니다."라고 말합니다. –

관련 문제