1

私はサーブレットにかなり慣れていません。クライアントからの応答を処理する方法は、uriが次のような特定のパスに一致する場合に使用します。

public class EntryServlet extends HttpServlet
{
  public void doGet (HttpServletRequest request, HttpServletResponse response) 
    throws IOException
  {
    String uri = request.getRequestURI ();

    if (uri.matches ("/1")) {
      do something....
    } else if (uri.matches ("/2")) {
      do something else.....    
    } else {
      throw error message...
    }
  }
}

これは、私のWebサービスに数ページある場合にのみ機能します。しかし、50個のxmlドキュメントがあり、exmaple.com/1をxmlにマップしたい...example.com/50を別のxmlにマップしたいとします。ここで、各リソースを処理するためにelseステートメントを50個持つのは悪い設計になります。これを実装するためのより良い方法は何ですか?サードパーティのアプリ/プラグイン/フレームワークを使用せずに、純粋にJavaでこれを実行しようとしています

更新:バックグラウンドスレッドを持つサーブレットを1つだけ使用しています。基本的に、ファイルを処理するクライアントリクエストとバックグラウンドスレッドが処理を処理し、xmlドキュメントをデータベースに保存します。そして、各xmlドキュメントをWebサービスのリソースにしたいのです。

4

5 に答える 5

4

「地図を作りたい」と答えたので、地図を使ってみましょう

あなたには2つのオプションがあります(私は今見ています)

1: 「/1」をキーとして配置し、xyz.xml にマップする値として文字列を配置します。

2: 「/1」をキーとして配置し、「Executor」インターフェースを実装するオブジェクトを配置します...

どちらの場合も、キーの値を検索してから、値オブジェクトを使用して有用なものを返します。

これをサーブレットの init に入れ、オブジェクトで埋めます。

Map<String,String> myActions = new HashMap<String,String>();
myActions.put("/1","one.xml");
.....

今、あなたはこれを行うことができます:

String uri = request.getRequestURI ();

if (myActions.containsKey(uri)) {
   String value = myActions.get(uri);
   do something with value
} else {
   throw error message...
}

これを実装するオブジェクトを使用して、これをオプション 2 に簡単に変更できます。

public interface Action {
    String execute(HttpServletRequest req, HttpServletResponse res) throws ServletException,
            IOException;
}
于 2012-11-18T15:19:32.857 に答える
1

あなたがすべき

  1. 各 URI 固有のロジックを別のサーブレットに移動します。
  2. Java サーブレット仕様のサーブレット マッピングの概念を使用し、web.xml で以下を定義します。

    <!- Define the servlets here, ofcourse you should use meaningful names -->
    <servlet>
        <servlet-name>servlet-1</servlet-name>
        <servlet-class>com.vikdor.webapps.ServletForURI1</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>servlet-2</servlet-name>
        <servlet-class>com.vikdor.webapps.ServletForURI2</servlet-class>
    </servlet>
    ....
    
    
    <!- Map the servlet to the URL pattern -->
    <servlet-mapping>
        <servlet-name>servlet-1</servlet-name>
        <url-pattern>/1/</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>servlet-2</servlet-name>
        <url-pattern>/2/</url-pattern>
    </servlet-mapping>
    ....
    

これにより、ルーティング ロジックが web.xml にプッシュされ、各サーブレットが特定のジョブを実行します。

于 2012-11-18T15:17:09.513 に答える
0

web.xml URI パターンで指定して、特定のサーブレット クラスにルーティングできます。悪いサーブレット名を許​​してください。

<servlet>
    <servlet-name>processUserXml</servlet-name>
    <servlet-class>com.example.server.ProcessUserXml</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>processUserXml</servlet-name>
    <url-pattern>/processuser</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>processItemXml</servlet-name>
    <servlet-class>com.example.server.ProcessItemXml</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>processItemXml</servlet-name>
    <url-pattern>/processitem</url-pattern>
</servlet-mapping>

そのため、単一のゲートウェイからの URI 要求を受け入れてif(現在行っているように) ステートメントを介してルーティングする代わりに、ユーザーが特定の URI を呼び出すと、適切なサーブレット クラスにルーティングされます。したがって、uriを呼び出すと、呼び出しがサーブレット クラスメソッド (または、定義されていて、ユーザーが HTTP 呼び出しを行った方法である場合)/processuserにルーティングされます。ProcessUserXmldoGetdoPost

于 2012-11-18T15:20:18.267 に答える
0

フレームワークを使用します。それが彼らの目的です。私はSpring MVCに偏っていますが、このような基本的なユースケースでは、最新のもので問題ありません。最初にセットアップするのは面倒に感じるかもしれませんが、一度構成すると、開発ははるかに速くなり、保守性も大幅に向上します。

編集:元の質問に、フレームワーク/ライブラリを使用しないように記載されていることに気付きました。ほとんどの場合、それは悪い考えですが、私はまだこの答えに固執しています。本当に必要な場合は、他の数人が提案したようにマップを作成できますが、長期的には保守できないため、できる限り避けてください。

于 2012-11-18T15:24:46.420 に答える