質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

7410閲覧

JSP/サーブレットの条件分岐をイベントハンドラのようにしたいです

退会済みユーザー

退会済みユーザー

総合スコア0

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2015/08/24 02:23

現在ユーザの操作に応じて表示する画面を切り替えるWEBアプリケーションの開発を行っています。
言語はJavaです。
過去の研修で習得したJSPとサーブレットを利用して作成していましたが、「画面遷移の操作をVBやC#みたいなイベントハンドラで作ってほしい」という要望を頂きました。

現在開発中のアプリケーションは
・JSPたくさん:サーブレット1つ
・JSPでsubmitボタンが押されるとサーブレットのdoGetメソッドが呼び出される
・JSPで押されたsubmitボタンによって、次の表示画面が変わる
・JSPで何のボタンが押されたかの判別はif文を使ってsubmitボタンのvalueを参照している
という仕様です。

これをイベントハンドラ・イベントリスナで作れないかという要望を受けていますが、どのようにすればいいか見当がつきません。方法はあるのでしょうか?
最悪、1つのメソッドにif文を大量に入れるのではなく、操作ごとにメソッドを作る方法でもかまいませんので、教えていただける方がいればよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

VBやC#のように~というのが、よくあるWeb系を知らないユーザの要望(無理難題)っぽく
見えてしまっていますが、おそらく単純に
「現在唯一サーブレットで条件分岐だらだら書いてるロジックを
1リクエスト1クラス(1メソッド)で処理させたいんだよね~」
という話ですよね。

であれば、単純にSpringフレームワークを導入して、リクエストURLと
Controllerのマッピングを行えば、リクエストごとの処理をクラスやメソッドに切り分けて
処理をすることができます。

今から外部FWの導入を検討するのは難しい、とか、どうしてもサーブレットは1つで処理させたい
(現状の動きはあまり壊したくない)ということであれば
・各画面の処理を記述するためのベースクラス(インターフェース)を用意する
・処理分岐用パラメータと、実処理クラスのマッピングを行う
(enumにString param, BaseClass execClass みたいなフィールドを持たせる)
・処理分岐用パラメータから、実処理クラスを取得する
(処理分岐用パラメータからenumを取得して、classをnewInstance()とかでインスタンス化する)
・ベースクラスのexecを呼ぶ
こんな感じにすれば、今If文で処理している個所を、別クラスに切り出して
ぱっと見、formのsubmit毎にイベントが処理されているように作ることができます。

Java

1 public void exec() throws InstantiationException, IllegalAccessException { 2 String param = "foo"; 3 4 ActionMapping m = ActionMapping.of(param); 5 if (m == null) { 6 // 404 7 return; 8 } 9 10 BaseAction action = m.getAction().newInstance(); 11 action.execute(); 12 } 13 14 15 public enum ActionMapping { 16 17 FOO("foo", FooAction.class); 18 19 private String param; 20 private Class<? extends BaseAction> action; 21 22 private ActionMapping(String param, Class<? extends BaseAction> action) { 23 this.param = param; 24 this.action = action; 25 } 26 27 public String getParam() { 28 return param; 29 } 30 31 public Class<? extends BaseAction> getAction() { 32 return action; 33 } 34 35 public static ActionMapping of(String param) { 36 for (ActionMapping m : ActionMapping.values()) { 37 if (m.getParam().equals(param)) { 38 return m; 39 } 40 } 41 return null; 42 } 43 } 44 45 public interface BaseAction { 46 void execute(); 47 } 48 49 public class FooAction implements BaseAction { 50 51 @Override 52 public void execute() { 53 //リクエストごとの処理を記述する 54 } 55 }

投稿2015/08/24 02:57

編集2015/08/24 03:17
MakotoMiyazaki

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/25 03:45

具体的な解決案を提示していただき、ありがとうございます。 頂いたサンプルプログラムは参考にします。
guest

0

それは不可能ですと断ってください。

実は昔、VBやC#のデスクトップアプリを作るようにイベントハンドラでWebサーブレットが書けるフレームワークというのがありまして、それがマイクロソフトの作っていたASP.NETというものです。VB/C#向けフレームワークです。
つまり完全に不可能ではないということになるのですが、これはやはりとても不自然なフレームワークだったため生産性が高いのか、扱い易いのかというとどうしても微妙でした。
フレームワークの想定から少しでもはずれたプログラミングを仕様とすると広大な闇が広がっていて結局一般的なWebサーブレットプログラミングが必要になる上にフレームワークの詳細の動作仕様も把握する必要が出てきましたからね。

なぜこのようなプログラミングが不自然か?
それはWebアクセスというのがステートレス、つまり一回一回のアクセスが独立していて前回と今回のアクセス元は別人になってしまうという点にあります。
別人である以上、イベントにどんなハンドラやデータを仕込んでも次回に引き継げない、引き継いだつもりでもそれが同一のアクセスであることを保証するのが困難、というあたりに突き当たります。
ASP.NETはこれを「ポストバック」という手法で解決しようとしました。Webらしい画面遷移体系は捨てて、基本的にすべての操作はページ自身へのPOSTに限定、そして引き継ぎたいデータはすべてフォーム内のHIDDENフィールドに詰め込んで引き回すという手法です。ユーザーがリロードを押したりBACKを押したりすると破綻する操作系が簡単にできてしまうのですが、これで普通のWebアプリを構築するのはものすごい苦労でした。

投稿2015/08/24 02:35

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/25 03:43

ありがとうございます。 「サンプルが見つからない理由」を探していたので、とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問