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

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

ただいまの
回答率

90.62%

  • Eclipse

    1640questions

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

  • JSP

    908questions

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

  • サーブレット

    118questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,993

aruheno

score 26

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

        ActionMapping m = ActionMapping.of(param);
        if (m == null) {
            // 404
            return;
        }

        BaseAction action = m.getAction().newInstance();
        action.execute();
    }


    public enum ActionMapping {

        FOO("foo", FooAction.class);

        private String param;
        private Class<? extends BaseAction> action;

        private ActionMapping(String param, Class<? extends BaseAction> action) {
            this.param = param;
            this.action = action;
        }

        public String getParam() {
            return param;
        }

        public Class<? extends BaseAction> getAction() {
            return action;
        }

        public static ActionMapping of(String param) {
            for (ActionMapping m : ActionMapping.values()) {
                if (m.getParam().equals(param)) {
                    return m;
                }
            }
            return null;
        }
    }

    public interface BaseAction {
        void execute();
    }

    public class FooAction implements BaseAction {

        @Override
        public void execute() {
                  //リクエストごとの処理を記述する
        }
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 12:45

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 12:43

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    JSPのselectタグのoptionの値を取得したい

    こんにちは。 プログラミングの初心者でいまいちわからないところがあるので、 質問をさせていただきました。 何をやりたいかと申しますと、 下記のJSPにおいてselectタグのop

  • 受付中

    jsp:submitのボタンの名前を変化させたい

    jspのsubmitについて質問です。 現在DBに接続してレコードの追加や更新や削除を行うコードを作成中です。 その追加と更新を同じjspコードで入力するようにしているので

  • 解決済

    jspのsubmitボタンの表示を切り替えたい

    jspのsubmitについて質問です。 現在DBに接続してレコードの追加や更新や削除を行うコードを作成中です。  その追加と更新を同じjspコードで入力するようにしているの

  • 解決済

    strutsのJSPにて

    分かりにくく、間違いもあった為、修正しました。 strutsのJSPにて  以下の成功例を、引数付きのメソッドを呼ぶように変更したいです。 成功例 <input type

  • 解決済

    別ユーザーの同時アクセス時に対応について

    ◆追記 1/24 UpdateUserCheck を作成しました。 ページを離れた事の判定ですが、 現在は、ListServletに戻った時点で、mapからremoveす

  • 受付中

    なぜ、index.jspからregisterUser.jspのリンク実行時にこのような404エラーが...

    なぜ、index.jspからregisterUser.jspのリンク実行時にこのような404エラーが出てしまうのでしょうか? 指定の名前を変更するなど行ったのですが、だめでした。

  • 解決済

    jspとjavaのみでエクスポート出力

    サーブレットの勉強を始めて商品管理アプリを作成しています。 外部ファイル出力でつまずいているのでご教授いただけませんでしょうか? ◆関連ファイル ・jsp:insert.jsp

同じタグがついた質問を見る

  • Eclipse

    1640questions

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

  • JSP

    908questions

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

  • サーブレット

    118questions

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