3

この両方が「共存」するための正しい構成は何ですか:

http://localhost:8888/index.html

http://localhost:8888/{some_path_value}

/public/images/bg.png最初の項目は html ページを返し、リソースなどにアクセスする href も含まれます。

2 番目のアイテムは、同じルート コンテキストとページを提供するコンテキスト (index.html、png、jpg、css、js など) にマップされる Restful API です。

したがって、私が現在直面している問題は、Rest API サーブレット マッピングを次のように構成するときです。

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Rest API は機能しますが、index.html、css、js などの静的リソースへのアクセスを効果的に削除して、「ホームページ」をレンダリングします。

ただし、マッピングを GWT アプリのようなものに変更すると、/api/*アクセスできるようになりますが、Rest API の PATH はルートではなくなります。

では、私のアプリで何が間違っているのでしょうか? 両方を同じパスに共存させる必要があります。私の最初のアイデアは、何らかのフィルターを実行することですが、より簡単で適切な解決策があるかもしれません。

アップデート:

私のアプリのguiceモジュール:

public class MyModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(MyResource.class);
   }
}

web.xml

<context-param>
    <param-name>resteasy.guice.modules</param-name>
    <param-value>org.jboss.errai.ui.demo.server.MyModule</param-value>
</context-param>

<listener>
    <listener-class>
        org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener
    </listener-class>
</listener>

<context-param>  
    <param-name>resteasy.servlet.mapping.prefix</param-name>  
    <param-value>/api</param-value>  
</context-param>

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
4

1 に答える 1

6

したがって、問題は、他の方法では機能しないため、すべてのルート要求を残りのサーブレットに移動するようにマッピングしていることです。

  1. 残りのサーブレットのパターンを知る方法があれば、web.xml でそれらの特定のパターンをすべて構成できます。ただしurl-pattern、非常に単純な構文のみwhatever/*を使用し*.extensionて許可されており、rest-servlet がこの要件に適合していないようです。

  2. GuiceServletContextListenerもう 1 つのオプションは、 ( guiceによって提供される)のような高度なサーブレット ディスパッチャを使用し、WebModule豊富な正規表現を構成することです。を変更してweb.xmlを追加し、WebModuleそのモジュールを構成して、URL を処理し、適切なサーブレットでディスパッチします (これらのサーブレットを web.xml から削除します)。

  <context-param>
    <param-name>resteasy.guice.modules&lt;/param-name>
    <param-value>org.jboss.errai.ui.demo.server.MyModule</param-value>
    <param-value>org.jboss.errai.ui.demo.server.MyWebModule</param-value>
  </context-param>
  public class MyWebModule extends ServletModule {
    @Override
    protected void configureServlets() {
      // Note: all servlets and filters must be singletons
      bind(FactoryServlet.class).in(Singleton.class);
      // Pass to the HttpServletDispatcher everything but urls ending with static extensions
      serveRegex(".+(?<!\\.(html|css|png|jpg))")
           .with(HttpServletDispatcher.class);
    }
  }    
  1. 最後のオプションは、パスが静的ファイルに一致するかどうかを検出してディスパッチする、独自のフィルターを作成することです。
  private FilterConfig config;
  public void init(FilterConfig filterConfig) throws ServletException {
    config = filterConfig;
  }

  public void doFilter(ServletRequest servletRequest,
      ServletResponse servletResponse, FilterChain filterChain)
      throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) servletRequest;
    HttpServletResponse resp = (HttpServletResponse) servletResponse;

    File file = new File(config.getServletContext().getRealPath(req.getServletPath()));
    if (file.canRead()) {
      // NOTE: you have to set the most appropriate type per file
      resp.setContentType("text/html");

      // This depends on apache commons-io
      IOUtils.copy(new FileInputStream(file), resp.getOutputStream());
    } else {
      filterChain.doFilter(req, resp);
    }
  }
于 2013-04-07T11:01:44.813 に答える