2012-01-17 45 views
10

私はDesign Patterns web based applicationsのパターンに従おうとしています。 「ルート」URLをマップするときは、すべてうまく機能します。TomcatからFrontControllerサーブレットへのURLマッピング

私はweb.xml

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

を入れているように、「フロントコントローラ」を介してすべての要求を入れたいと思います。 、コントローラによって引っ掛かり入ってくる要求して、[OK]を作業アクションが、その後ライン

request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response); 

は、NetBeansを示してステッピング、それが再びアクションに行くと、それはすべて失敗します。

URLルートからは移動しないようにすることができます。

<servlet-mapping> 
     <servlet-name>ControllerServlet</servlet-name> 
     <url-pattern>/pages/*</url-pattern> 
    </servlet-mapping> 

しかし、それは私が欲しいものではありません。 「ルート」URLで動作させる方法はありますか?

答えて

8

/* URLパターンはすべて、また転送JSPファイルなどの静的リソースをカバーCSS/JS /画像フロントコントローラーサーブレットにはそのようなことは望まない。

/pages/*のようなより具体的なURLパターンでコントローラサーブレットを維持します。

:あなたは /resourcesのような共通フォルダ内の静的リソースをグループ化し、 /*にマッピングし、 doFilter()方法に次の仕事をしている Filterを作成することで、URLに「/ページ」を取り払うの機能要件を実現することができます
HttpServletRequest req = (HttpServletRequest) request; 
String path = req.getRequestURI().substring(req.getContextPath().length()); 

if (path.startsWith("/resources/")) { 
    // Just let container's default servlet do its job. 
    chain.doFilter(request, response); 
} else { 
    // Delegate to your front controller. 
    request.getRequestDispatcher("/pages" + path).forward(request, response); 
} 

転送されたJSPリソースは、デフォルトではこのフィルタと一致しないため、コンテナ自身のJspServletによって正しくピックアップされます。

+0

回答のおかげで、今、私はちょうどに/ページ/すべてのものを残しておきますのは、フィルターに到達するために私にしばらく時間がかかるだろうので、それは複雑に見えます – Mark

+0

拡張機能のないリクエストをpath.match( "^。* \\/[^ \\。* * $")にマッチさせてフロントコントローラに転送することができます。 – Ring

+0

@BalusC 'substring'のポイントは何ですか? – user2418306

0

/* urlパターンは、アプリケーション内のすべてのサーブレット、JSP、および静的コンテンツに一致します。あなたが必要となるWhay

は、Tomcatは、デフォルトのJSPサーブレットを使用できるようにする* .jspというパターンを定義することです:

<servlet-mapping> 
    <servlet-name>jsp</servlet-name> 
    <url-pattern>*.jsp</url-pattern> 
</servlet-mapping> 
3

なぜ各URLをマッピングする必要があるのですか?すべてのURLをマップする必要がある場合は、フィルタでURLをスキップする必要があります。

エルス
public static boolean filterURL(String str, List<String> avoidURLList) { 
    boolean exist = false; 

    if(avoidURLList == null){ 
     return exist; 
    } 
    for (int i = 0; i < avoidURLList.size(); i++) { 
     if (str.contains(avoidURLList.get(i))) { 
      exist = true; 
      break; 
     } 
    } 
    return exist; 
} 

あなたは

<filter-mapping> 
    <filter-name>sessionFilter</filter-name> 
    <url-pattern>*.action</url-pattern> 
    </filter-mapping> 
+0

返信ありがとうございます、複雑に見えますので、フィルタに入るまでには時間がかかりますが、今はすべてを/ pages/ – Mark

0
ようなあなたのweb.xmlに特定のURLをマッピングすることができます:あなたのフィルターで
<filter> 
    <display-name>SessionFilter</display-name> 
    <filter-name>SessionFilter</filter-name> 
    <filter-class>com.colabcom.goshare.app.base.filter.SessionFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>sessionFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

 HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String url = request.getServletPath(); 
     boolean allowedRequest = Utility.filterURL(url, avoidUrls); 
     if(allowedRequest){ 
      chain.doFilter(request, response); 
     }else{ 
      //Main Filter Code   
     } 

ユーティリティクラスは、あなたのURLをフィルタリングします

DefaultServletを拡張することができます拡張サーブレットがフロントコントローラになります。 doGETメソッドまたはdoPOSTメソッドで、静的ページをスーパークラスに転送します。 DefaultServletは、デフォルトでurl "/"にマップされるサーブレットです。私はjettyサーバーと一緒に使っていますが、Tomcatでも実装できます。私はプロセスにデフォルト・サーブレットへ/ /静的で始まるすべての要求を転送した上記のコードサンプルで

public class FrontController extends DefaultServlet { 

@Override 
public void init() throws UnavailableException { 
    super.init(); 
} 

@Override 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    String uri = request.getRequestURI(); 

    /* 
    * if request is trying to access inside /static then use the default 
    * servlet. YOU CAN USE YOUR OWN BUSINESS LOGIC TO FORWARD REQUESTS 
    * TO DEFAULTSERVLET 
    */ 
    if (uri.startsWith("/static/")) { 

     super.doGet(request, response); 
     return; 
    } else { 

     // else use your custom action handlers 
    } 
} 

}

。このようにして、FrontControllerを「/」レベルにマップすることができます。

<servlet> 
<description></description> 
<display-name>FrontController</display-name> 
<servlet-name>FrontController</servlet-name> 
<servlet-class>FrontController</servlet-class> 

<servlet-mapping> 
<servlet-name>FrontController</servlet-name> 
<url-pattern>/</url-pattern> 

+0

に残しておきます。言い換えれば、このコードをアプリケーションに書き込むと、後でTomcatやJettyなどで立ち往生してから、後でこのコードを変更する必要があります。 – Ring

関連する問題