15

Java アプリケーション用の Web ユーザー インターフェイスを作成しようとしています。ユーザー インターフェイスは非常にシンプルで、ユーザーがクエリを入力するためのフォームを含む 1 つのページと、Google の検索エンジンや Ask.com のような結果ページで構成されます。

私は Java の基本 API についてはよく知っていますが、Web 環境で Java を使用した経験はあまりないので (ASP.NET は使用したことがあります)、アドバイスを求めています。

  • どのWeb アプリケーション サーバーを使用すればよいですか? 私のインターフェイスは非常に軽いことに注意してください。高速で、アプリケーションの開始/リセット/停止と (再) 展開が簡単なものが必要です。また、 GNU/Linux、Mac OS X、Windows XP/Vista などの複数の環境で動作する必要があります。さらに、私は と を使用antしているので、サーバー管理用のターゲットを簡単に追加したり、IDE を使用してサーバーを管理したりEclipseできれば素晴らしいと思います。ant私はTomcatJettyを調べました、後者は非常に軽量で、インストールと展開が簡単なようです。GUI はデモンストレーションのみを目的としており、おそらく別のコンピューターに展開する必要があるため、これは理想的です。ただし、Tomcat は非常に長い間存在しており、より成熟しているように見えます。

  • Web ページに関しては、Java Server Pages は、私が達成しようとしていること (フォームを処理して結果を出力する) には十分に単純であるように見えるので、ぴったりのように見えますが、私はすべて提案に耳を傾けています。

  • また、アプリケーションの「基本的な」ワークフローを説明する必要がある別の要件もあります。基本的に、ユーザーの入力を処理し、表示する結果を返すEngineメソッドを持つクラスがあります。run(String)このクラスは、アプリケーションのコアです。ここで、このクラスを1 回だけインスタンス化したいと思います。大量のメモリが必要で、起動に非常に時間がかかるため、アプリケーション/サーバーの起動時に作成し、その参照を保存したいと考えています。アプリケーションの全スパン (つまり、サーバーを停止するまで)。次に、ユーザーの要求ごとに、インスタンスのメソッドを呼び出して、その結果を表示するだけです。runEngineJavaでこれをどのように達成できますか?

4

7 に答える 7

10
  1. アプリ サーバー。実行時のフットプリント、または学習量の点で Tomcat は重いと思いますか? IDE との統合が確立されているものを選ぶ傾向があります。したがって、Eclipse + Tomcat または Apache Geronimo は、おそらくWebSphere Community Editionの装いで仕事をするでしょう。私が見たところ、これらはあなたが望むものには十分であり、学習曲線は本当にかなり管理しやすいものです.
  2. はい、JSP。プレゼンテーションのニーズが少し複雑になっていることに気付くかもしれません。JSF に行くという余分な努力は、まだ報われるかもしれません - Date pickers のような素晴らしいウィジェット。
  3. 処理では、サーブレット (または JSF を使用している場合はアクション クラス) があり、そのクラスは起動時に初期化され、すべての要求に使用される型 Engine のメンバー変数を持つことができます。心に留めておくべきことは、多くのユーザーがそのサーブレット、したがってそのエンジンを同時にヒットするということです。あなたのエンジンは同時に複数のスレッドから安全に使用できますか?

この点を拡大する。JSP を実装する場合、モデル 1 とモデル 2 として (ある程度の工夫を加えて) 参照される 2 つのモデルがあります。この説明を参照してください。

モデル 1 の場合、コードを直接 JSP に入れる傾向があり、コントローラーの役割を果たします。個人的には、小規模で急速に開発されたアプリを扱う場合でも、私はそうしません。私は常にモデル 2 を使用します。ただし、必要に応じて、Java を JSP に入れることができます。

<%  MyWorker theWorker = MyWorkerFactory.getWorker();
    // theWorker.work();
%>

ワーカーの作成を制御できるように、このようなファクトリを持つことをお勧めします。ファクトリには次のようなものがあります(非常に簡単な例を示すために)

private static MyWorker s_worker = new MyWorker();
public static synchronized getWorker() {
       return s_worker;
}

または、そのメソッドが最初に呼び出されたときにワーカーを作成することもできます。

モデル 2 の場合、コードを挿入するサーブレットが当然あるので、

private MyWorker m_worker = MyWorkerFactory.getWorker();

これは、サーブレットがロードされるときに初期化されます。起動時にロードするように設定することを心配する必要はありません。最初のリクエストが実行される前に初期化されることがわかっているだけです。さらによいのは、サーブレットの init() メソッドを使用することです。これは、リクエストが処理される前に呼び出されることが保証されており、そのような作業のためにサーブレット API で設計された場所です。

public class EngineServlet extends HttpServlet {

private Engine engine;

// init is the "official" place for initialisation
public void init(ServletConfig config) throws ServletException {
     super.init(config);
     engine = new Engine();
} 
于 2009-08-16T05:17:13.087 に答える
3

あなたが学ぶ必要がある技術は、Sun Java Servlet 仕様です。これは、重要なすべての Java Web サーバーが実装しているものだからです。これにより、サーバー側で必要なすべてのことを実行できるサーブレットを作成できます。次に、iDe で適切に機能する任意のコンテナーに対して開発し、本番環境で適切に機能する他のコンテナーにデプロイできます。

また、HTML フォームの他のエントリで必要な送信ボタンを作成するには、JavaServer Faces などを学習する必要があるため、基本的な HTML も学習する必要があります。

エンジンを機能させるには、web.xml でシングルトンを使用してサーブレットを作成し、それを呼び出すことができます。スレッドセーフであることを絶対に確認してください。そうしないと、多くの苦痛が生じます。手始めに、呼び出し側のサーブレットが同期されていることを宣言して、run() の最大 1 つの呼び出しがいつでもアクティブになるようにすることができます。

于 2009-08-16T09:42:15.867 に答える
3

編集:これまでのところ、次のことを決定しました。

  • Web アプリケーション サーバー: Jetty ;
  • ビュー用のJava Server Pages 。
  • @djna の提案に基づいて、Model 2に関するいくつかの記事を読み、この解決策を思いつきました (インターフェイスに移動する前にアプリケーションを終了する必要があるため、まだテストしていません)。

フォーム.jsp

<form action="/servlet/EngineServlet" method="GET">
  <input type="text" name="text" />
</form>

EngineServlet.java

public class EngineServlet extends HttpServlet {
  private Engine engine = new Engine(); 
  // does this make sure engine only gets instantiated one time in the entire lifespan of the web application; from what I've read from the servlet lifecycle, it seems like it, but I'd like to hear opinions

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response) {
    String text = request.getParameter("text");
    ResultBean result = engine.run(text);
    request.setAttribute("result", result);
    RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp");
    dispatcher.forward(request, response); 
    // what's the difference between forward, and request.sendRedirect() ?
  }    
}

結果.jsp

<div>The result was: ${result.text}</div>

この解決策についてどう思いますか? J2SE のバックグラウンドを持っている人にはわからない問題はありますか? また、コード内で疑問に思ったことをコメントとして書きました。ありがとう。

于 2009-08-17T23:57:38.360 に答える
1
  1. Jetty は非常に軽量なコンテナーであり、開発シナリオに最適です。

  2. レンダリング側については、 Wicketを参照することをお勧めします。単純な UI とは対照的に、コードのようなタスクを行う方が快適に見えます。

  3. あなたが説明しているパターンは Singleton パターンです。java でのシングルトンの Google の結果を見てください。

于 2009-08-16T13:39:25.893 に答える
1

これが将来的に更新やメンテナンスを一切必要としない 1 回限りのアプリケーションではないと仮定すると、次の理由からApache Wicketを使用してビュー レイヤーを作成することをお勧めします (最初にホームページの短い情報をお読みください)。 ):

于 2009-08-16T07:59:24.960 に答える
0

これは非常に自由回答形式の質問であり、要件に応じて膨大な数の回答が考えられます。Web アプリケーションを作成する標準的な方法は、Java EE プラットフォームを使用することです。これは、ビジネス ロジック用の JSP、サーブレット、および EJB を意味します。ただし、Spring、Seam、GWT などの人気のある有効な代替手段や、JRuby on Rails などのより急進的な代替手段も多数あります。あなたのニーズは非常に単純であるように思われるので、Jetty + Servlets + JSP のような単純なソリューションを使用することをお勧めします。

あなたのエンジンは複数の同時リクエストを処理できると思いますか? そうでない場合は、JMS などのリクエストをキューに入れる方法を検討することをお勧めします。

于 2009-08-16T05:04:41.103 に答える
0
  1. アプリサーバー: tomcat
  2. ウェブページ: jsp
  3. シングルトンまたは静的メソッドを持つクラスであるクラスが必要です。注意事項: 競合状態に注意してください。更新/変更操作を含むこれらのメソッドには、 synchronizedキーワードを使用する必要がある場合があります。
于 2009-08-16T13:29:15.543 に答える