2

私は現在 Java EE Web フレームワークを開発しており、URL をルーティングする方法を知りたいです... HMVC 機能をサポートしたいです! URL は次の規則に従います。

/module_name/controller_name/action_name、ここで:

module_name: スラッシュで区切られたパス... 例: モジュール "X" のサブモジュール "Y": /X/Y controller_name: 特殊文字のないコントローラーの名前 action_name: 特殊文字のないアクションの名前

/module_name/controller_name/ を特定のサーブレット コントローラーにマップしたい! アクション部分はそのクラスのパブリックメソッドです!:)

どうすればこれを行うことができますか?フィルターを使用していますか?できれば例が欲しいです!

4

1 に答える 1

15

フィルタ、基本サーブレット(メインサーブレットを介したすべてのリクエスト)、または「サーブレットマッピング」の3つの方法があります。

フィルター

この例はURLを書き換えます

http://example.org/ <int value>
http://example.org/user?id=<int value>
すなわち

http://example.org/1234-> http://example.org/user?id=1234
  1. web.xmlのフィルターを決定します
<filter>
    <filter-name>Router</filter-name>
    <filter-class>org.example.Router</filter-class>
    <init-param>
        <param-name>param1</param-name>
        <param-value>valueOfparam1</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Router</filter-name>
    <url-pattern>/*</url-pattern> 
</filter-mapping>

init-paramセクションでは、ルートルールを指定できます

  1. フィルタクラス

    public class Router implements javax.servlet.Filter {
    
    private static final Pattern REWRITE_PATTERN = Pattern.compile("(^[1-9]\\d*)$");
    
    @Override
    public void destroy() {
    }
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException {
    //this method calling before controller(servlet), every request
    
        HttpServletRequest request = (HttpServletRequest) req;
        String url = request.getRequestURL().toString();
        String number = url.substring(url.lastIndexOf("/")).replace("/", "");
    
        Matcher m = REWRITE_PATTERN.matcher(number);
        if(m.find()) {
            RequestDispatcher dispatcher = request.getRequestDispatcher("user?id=" + m.group(1));
            dispatcher.forward(req, res);
        } else {
            fc.doFilter(req, res);
        }
    }
    
    @Override
    public void init(FilterConfig fc) throws ServletException {
        //here you may read params from web.xml
    }}
    

基本的なsevlet

public class BasicServlet extends HttpServlet {
   //route rules here, and rewrite
}

サーブレットマッピング

<servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <uri-mapping>/user/*</uri-mapping>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>PostServlet</servlet-name>
    <uri-mapping>/post/*</uri-mapping>
</servlet-mapping>
  • フィルタ-より柔軟で、作業コードを大幅に変更する必要はありません
  • 基本サーブレット-柔軟で、コードを変更する必要があります
  • サーブレットマッピング-単純に、柔軟性がない(特定のルートルールの場合)
于 2012-07-27T06:05:58.237 に答える