2

私の問題は単純です。静的リソースをコンテキストで提供したいのです/static/*が、特定のサーブレットが/*コンテキストで提供しています。/static/*のサブセットなので/*動作しません。私のweb.xmlは次のようになります。

<web-app version="2.5" 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_2_5.xsd">
 <display-name>template-guice-jersey-tomcat</display-name>
 <session-config>
     <session-timeout>30</session-timeout>
 </session-config>
 <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

 <!-- set up Google Guice Servlet integration -->
 <filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
 </filter>
 <filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

 <servlet-mapping>                                                                                                                               
   <servlet-name>default</servlet-name>                                                                                                          
   <url-pattern>/static/*</url-pattern>                                                                                                          
 </servlet-mapping>                                                                                                                              


 <listener>                                                                                                                                      
     <listener-class>de.danbim.templateguicejerseytomcat.GuiceServletConfig</listener-class>                                                     
 </listener>                                                                                                                                     
</web-app>  
4

2 に答える 2

5

この問題に対する非常にクリーンな解決策は次のとおりです。http ://www.kuligowski.pl/java/rest-style-urls-and-url-mapping-for-static-content-apache-tomcat,5 :

残念ながら、DefaultServletソースを調べたところ、DefaultServletは要求されたURLのpathInfo部分のみを取得することがわかりました。したがって、要求が/static/styles.cssの場合、コンテナーはそれを/styles.cssに変換します。DefaultServletではサーブレット部分が省略されています。このようなcssファイルにアクセスする場合は、/ static / static / styles.cssrequesturlを使用する必要があります。

この問題の簡単な解決策は、DefaultFilterクラスを記述し、それをweb.xmlファイルの先頭に配置することです。このフィルターは、すべての静的コンテンツ呼び出しをDefaultServletに転送します。

リクエストをデフォルトのサーブレットにディスパッチするフィルターを定義します。

public class DefaultFilter implements Filter {  
  
    private RequestDispatcher defaultRequestDispatcher;  
  
    @Override  
    public void destroy() {}  

    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)   
          throws IOException, ServletException {  
        defaultRequestDispatcher.forward(request, response);  
    }  

    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        this.defaultRequestDispatcher =   
            filterConfig.getServletContext().getNamedDispatcher("default");  
    }  
}

フィルタを(他のフィルタの前に)web.xmlに追加します。

<filter>  
    <filter-name>default</filter-name>  
    <servlet-name>default</servlet-name>  
    <filter-class>pl.kuligowski.example.DefaultFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>default</filter-name>  
    <url-pattern>/static/*</url-pattern>  
    <url-pattern>*.ico</url-pattern>  
</filter-mapping>

静的コンテンツ呼び出しのみがDefaultFilterに一致します。これは、フィルターチェーンを切断し、要求をDefaultServletに転送するだけです。

于 2013-01-27T08:21:24.587 に答える
1

私にとって、これはTomcat 8.5で機能します(私はもうweb.xmlさえ持っていません):

@WebServlet(urlPatterns = "/*")
public class MainServlet {}

@WebServlet(urlPatterns = { "/static/*", "/gwt/*" })
public class StaticServlet extends org.apache.catalina.servlets.DefaultServlet {}

より具体的なURLパターンが自動的に優先されるようです。カタリナのデフォルトサーブレットを拡張するには、org.apache.tomcat > tomcat-catalinaスコープ付きのMaven依存関係をprovidedプロジェクトに追加します。

(私のように)すぐに、アプリコンテキストのみのリクエストで、HTML内の相対パス(スタイルシートやJavaScriptなど)の解決に問題が発生する可能性があります。

メインサーブレットのリダイレクトでこれを解決しました:

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    if(request.getPathInfo() == null) {
      // redirect http://localhost:8080/test -> http://localhost:8080/test/ (add trailing slash)
      // because only then are the relative paths to the gwt scripts correctly resolved
      getResponse().sendRedirect(getRequest().getContextPath() + "/");
      return;
    }

    //...
  }
于 2017-09-08T01:19:51.193 に答える