- ベストアンサー
静的ページからのサーブレット起動について
- JSPとサーブレットを使って静的ページからの起動方法はあるのか
- JSP⇒サーブレット⇒JSPの処理の流れでデータを表示できるのか
- MVCモデルに準拠してサーブレットを使ってデータの受け渡しを行いたい
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> まさにその通りで、formタグを使わずに実現可能かで悩んでました。 > サイトのTOP画面にアクセスされた際にDB等からデータを取得して表示させようと > 思ったのですが、View(JSP)→Controller(Servlet)時にどうやって > Servletを起動(コントローラ呼び出し)させたらよいのかで詰まってたしだいです。 最初の質問からは、CMVCMVCMVという流れの中で、V→Cにformタグを使わずに済ませたいという事かと思っていたのだが、ひょっとして、http://hogehogefugafuga.tld/webapp/というWebアプリケーションがあって、web.xml内に書かれているwelcome-file-listがindex.jspだけだったとして、このURLでアクセスした時にindex.jspが呼ばれるけどそいつから直接サーブレットに飛びたいという事なのかな? 1.http://hogehogefugafuga.tld/webapp/にアクセスする。 2.するとhttp://hogehogefugafuga.tld/webapp/index.jspが呼び出される。 3.ここで、index.jspの中にスクリプトレットを埋め込むのではなく、サーブレットを呼び出してさらにViewとして何らかのjspでページを返したい。welcome-file-listにはサーブレットを直接指定する事はできないため、最初のアクセスはjspでないといけないけど、TOPページもController→Model→Viewという動きにしたいなぁ。 質問者が以上の認識であるという仮説を元に説明すると、index.jspにアクセスされた時にブラウザに帰る事なくそのままサーブレットに転送する事はできる。 方法1 <jsp:forward>タグをindex.jspに入れておくと、index.jspへのアクセスがあったときに、サーバーサイドでサーブレットにフォワード(これもディスパッチャーがやってる)、Controllerとしてのサーブレットが動作し、その結果をindex2.jspにフォワード(ディスパッチャー)、index2.jspがHTMLを生成してブラウザに返す、という動きができる。 <jsp:forward>タグのみを書いたindex.jspを用意しておいて、アクセスされたら即サーブレットに転送する事でTOPページをサーブレットにするというのも割とポピュラーな手段だ。 クライアント:http://hogehogefugafuga.tld/webappにアクセス サーバー:http://hogehogefugafuga.tld/webapp/index.jspが呼び出される サーバー:<jsp:forward>タグによりサーブレットに転送。 サーバー:サーブレットないしはサーブレットから呼び出されたModelがDB処理などを行う。 サーバー:サーブレットがViewであるindex2.jspに転送。 サーバー:index2.jspがHTML生成。レスポンスする。 クライアント:HTMLを受け取り画面を描画する。 →結果として、TOPページへのアクセスもサーブレットが使える。 方法2:これを理解するにはかなりのスキルを必要とするので混乱しそうだったら読まなくても良い 方法1だと、フォワードしかしないindex.jspも初回呼び出し時にコンパイルするので時間がかかる。そこで、ダミーの拡張子のファイル(例:index.welcome)を用意して、welcome-file-listもindex.welcomeのみとし、さらにurl-pattern index.welcomeに対してサーブレットをマッピングしておくと、TOPページにアクセスされた時に該当サーブレットを直接呼び出す事ができる。また、デフォルトサーブレットをTOPページにする事もできる。 Java Webアプリケーションにおいて、実はjspもjspファイルをテキストファイルとして読み込んでjavaのソースファイルに変換した後javacなどでバイトコードにコンパイルして動的にクラスをロードしてinvokeするサーブレットが動いているし、index.htmlやimage.pngなどの静的コンテンツもサーブレットが処理している(一般的にこれがデフォルトサーブレット)。 WebアプリケーションはServlet2.4からだか個々のアプリケーションでデフォルトサーブレットを定義しなおす事もできるようになっているのでTOPページにJSPを置かなきゃいけないという事はもはや無くなっているのだ。
その他の回答 (1)
- anmochi
- ベストアンサー率65% (1332/2045)
「フォームアクション等を行わずに」なる言葉が何を指しているのか分からないが、仮にこれが「HTMLにおけるformタグで属性actionにサーブレット名を記述せずに」という事であれば、それは無理だ(JavaScriptを駆使すればaタグのみで可能だが、ブラウザ依存になるのでそちらの方が問題が多い)。 もっとも、JSP(を解釈してHTMLとなったもの)をブラウザが表示した状態から、サーブレットに対して特に受け渡す内容が無い、または事前にJSP中に埋め込んでおけるのであればaタグのみでなんら問題はない。 MVCでやろうというときに、サーブレットからJSPへのデータ受け渡しというのは当然ディスパッチャー経由でフォワードする(つまり、サーバーサイドでの処理のみ「Controller→Model→View」)し、サーバーからクライアントへ何らかの情報を送るのは普通にHTTPレスポンスを使う(「View」)ため、この2点はアーキテクチャ設計の中で全く重要視はされない。大事なのはクライアント(ブラウザ)からサーバーへのアクセス時(「View→Controller」)にどうするかで、ここをformタグ使わずにできるかという質問なのかと思ったのだが結局どういう質問なのだろうか。
お礼
説明がわかりにくくてすませんでした。 >クライアント(ブラウザ)からサーバーへのアクセス時(「View→Controller」)に >どうするかで、ここをformタグ使わずにできるかという質問なのかと思ったのだが まさにその通りで、formタグを使わずに実現可能かで悩んでました。 サイトのTOP画面にアクセスされた際にDB等からデータを取得して表示させようと 思ったのですが、View(JSP)→Controller(Servlet)時にどうやって Servletを起動(コントローラ呼び出し)させたらよいのかで詰まってたしだいです。 JavaScriptを駆使しなければ無理であるとわかり非常に助かりました。 本当にどうも有難うございます。
お礼
ありがとうございます! 無事、方法1のやり方で実現する事ができました。 つたない説明やanmochiさんにとって初歩的な質問にも関わらず 丁寧かつ親切にお答え頂き、本当に助かりました。 今回説明して頂けた内容でかなり勉強になりましたし、 方法2のような考え方がある事を教えてもらえた事も非常に嬉しいです。 せっかく教えて頂いた知識なのでこちらも理解できるよう努力していきます。 本当にどうも有難うございました!