1

私は、学習目的でJavaサーブレットを使用して非常に単純なWebフレームワークを作成しています。これは以前にPHPで行ったことがあり、リクエストURIを調べて、適切なクラスとメソッドをインスタンス化することで機能しました。

これはPHPで正常に機能しました。これは、のようなことができるためです$c = new $x; $x->$y;。ただし、これをJavaに変換する方法、またはこれが適切な方法であるかどうかはわかりません。

これまでのところ、私は試しました:

Router router = new Router(request.getPathInfo());
String className = router.route(); //returns com.example.controller.Foo

Class c = Class.forName(className);
Object x = c.newInstance();

Foo y = (Foo) x;
y.doSomething();

これは、いくつかのルートでは問題ないように見えますが、適切に拡張できるようには見えません。また、構成ファイルからルートを取得することもできません。

どうすれば機能させることができますか?

4

4 に答える 4

2

フロントコントローラーとしてサーブレットフィルターを使用します。ルーターはパスを要求ディスパッチャーに接続します。doFilter メソッドでは、ServletRequest を HttpServletRequest に変換し、リクエスト パスを抽出して、登録済みのマッピングと照合します。このマッピングの結果は、リクエストをディスパッチするリクエスト ディスパッチャーです。

擬似コード:

doFilter(ServletRequest request, ServletResponse response) {
  httpServletRequest = (HttpServletRequest) request;
  path = httpServletRequest.getRequestURI();
  dispatcher = router.getTarget(path);
  dispatcher.dispatch(request, response);
}

必要に応じて、サーブレット API のデフォルトのルーティング メカニズムで十分な場合があります。

于 2010-02-10T09:12:15.410 に答える
2

キーがリクエスト メソッドとリクエスト パス情報の組み合わせを多かれ少なかれ表すMap<String, Action>場所でアクションを取得します。Stringここの前に同様の回答を投稿しました:Java Front Controller

このようなマップは、静的 (すべてのアクションをハードコーディングする) または動的 (設定より規約、特定のパッケージ内のクラスを検索する、または特定のアノテーションを持つクラスのクラスパス全体をスキャンするか、特定のインターフェースを実装する) のいずれかで埋めることができます。

そして、サーブレットに固執してください。フィルターはありません。せいぜいそれを使用して、リクエストをコントローラーサーブレットに転送します。サーブレットでは、実装するだけHttpServlet#service()です。

于 2010-02-10T11:40:04.570 に答える
0

何を求めているのかよくわかりませんが、Java サーブレットを見てみたいと思うかもしれません。確かに、多くの Web フレームワークは単純なサーブレットの上に抽象化されていますが、私に尋ねれば、Java Web アプリケーションについて学び始めるのにとても良い場所です (間接的にあなたはそうしました ;) )。

ここから Java サーブレット仕様をダウンロードしてください: Java Servlet Spec - 非常に興味深いものです。

于 2010-02-10T08:59:38.783 に答える
0

どのように機能させるべきですか?しかし、あなたはそれを望んでいます。学習目的で行うのであれば、何をしても問題ありません。

ただし、すべてのアクションで同じインターフェイスを実装することをお勧めします(サーブレットを拡張する可能性があります)。これにより、すべての異なるクラスでコンパイルする必要がなくなります。

Foo次に、キャスト toがキャスト to になり、Servletすべての異なるクラスに特別なケースを用意する必要がないことを除いて、本質的にあなたがしていることを行うことができます。

その後、構成 (おそらく XML ファイル) からルートをロードすることもできます。

基本的に、あなたがしていることはStruts 1フレームワークによって実装されているので、それについて読む価値があるかもしれません(オープンソースなので、必要に応じてソースを見ることもできます)。

于 2010-02-10T09:03:28.963 に答える