• 締切済み

コントローラの役割はJSPにはやらせないですよね?

コントローラの役割を、HttpServletだけでなくjspにやらせる構成も 正しい思想の1つなのでしょうか?? 「コントローラ」は、 基本「依頼と、依頼結果をもとにした次の依頼」をする。 という風に役割を捉えていました。 例えば Aに処理依頼をしたあと、 処理が成功したから今度はBに処理依頼をして、 その結果データが 1件以上だったらCに依頼をして、 0件だったら次はDに処理を依頼する。 のような。 そして、それはHttpServletのところにやらせるものなのかと捉えています。 (※間違っているのかもですが。。) しかし、 書こうと思えば、サーブレットを撤廃して、 画面遷移は、x.jsp ⇒ y.jsp ⇒ z.jsp と、サーブレットを介さずにチェーンを作ることも可能だと思います。 (1)そういう仕組もわりと一般的なのでしょうか? (2)jspになんでもやらせすぎると、それぞれのソースが、 ◆A:プレゼンテーション層としての処理なのか?(イテレータでの描画とか) ◆B:ファンクション層の処理なのか?(例えば入力チェック処理など) ◆C:コントローラ層の処理なのか? (各結果を元に、次にどこの処理にどういうデリゲートするのか等処理) がパッと分かりにくく、カオスになりやすいと思っています。 そんな風になるくらいだったら、 コントローラはサーブレットにさせた方が良いと思うのですが、あえて全てJSPにさせるメリットもあったりするのでしょうか? ◆確認 画面遷移は、コントローラの役割だと思っていたのですが、 もしかしたらそこが間違っているのでしょうか? (WEB系の開発かどうかでも違うのかもですが。) .

みんなの回答

回答No.14

>JSF(JavaServer Faces)の基本 >https://blog.pepese.com/entry/20131211/1386757110 > >>コントローラ(C) >>FacesServletというサーブレットを使う >>実装不要 >>設定は「faces-config.xml」で行う >良く分からないがFacesServlet自体はプログラマーが記述する必要は無いような感じ(プログラマーが記述してはならないと思われる)。 >プログラマーはfaces-config.xmlにザックリと言うと恐らくページの遷移ルールを記述すれば、そのとおりにFacesServletが動作するのだろうと思われる。 >つまり、ザックリと言うと恐らくfaces-config.xmlはFacesServletに指令を出す「ページ遷移ルール」言語を記述するのだろうと思われる。 つまり、FacesServletは完成されたコントローラであり、faces-config.xmlの「ページ遷移ルール」言語をInterpret(インタープリット)して、ページを遷移すると思われる。 つまり、ザックリと言うとFacesServletは「ページ遷移ルール」言語を解釈して動作するInterpreter(インタープリター)と考えれば分かりやすい。

paranoia23
質問者

お礼

ページ遷移のコントロールができるみたいですね!

回答No.13
paranoia23
質問者

お礼

今度書いてみます

回答No.12

JSF(JavaServer Faces)の基本 https://blog.pepese.com/entry/20131211/1386757110 >ビュー(V) >FaceletsとEL式で記述されたxhtmlファイル >FaceletsはJSFで使うタグライブラリ >http://docs.oracle.com/javaee/7/javaserverfaces/2.2/vdldocs/facelets/ >EL式はシャープと中括弧(#{hoge})で囲った式 EL式については下記参照。 Faceletsを書く時のEL式まとめ http://yoshiyuki9026.hatenablog.com/entry/2017/03/27/200403

paranoia23
質問者

お礼

今度書いてみます

回答No.11

JSF(JavaServer Faces)の基本 https://blog.pepese.com/entry/20131211/1386757110 >コントローラ(C) >FacesServletというサーブレットを使う >実装不要 >設定は「faces-config.xml」で行う 良く分からないがFacesServlet自体はプログラマーが記述する必要は無いような感じ(プログラマーが記述してはならないと思われる)。 プログラマーはfaces-config.xmlにザックリと言うと恐らくページの遷移ルールを記述すれば、そのとおりにFacesServletが動作するのだろうと思われる。 つまり、ザックリと言うと恐らくfaces-config.xmlはFacesServletに指令を出す「ページ遷移ルール」言語を記述するのだろうと思われる。

paranoia23
質問者

お礼

ページ遷移のコントロールができるみたいですね!

回答No.10

>>どうやらJSF(JavaServer Faces)はフレームワークで、そのフレームワーク内に「Faces Servlet、Managed Bean」の2つのJava言語仕様が有るようです。 >>つまり、サーバー・サイドJavaには、JSP(JavaServer Page)、Servletについては「Java Servlet、Faces Servlet」、(サーバー・サイドJava)Beanについては「EJB(Enterprise JavaBeans)、Managed Bean」が有ると言う事になります。 >>「ManagedBeanは次のJSFバージョンで無くなる予定だ」そうですので ご注意下さい。 >現在は、JSP(JavaServer Page)ではなくJSF(JavaServer Faces)フレームワークのFacelets(XHTML)が推奨されていると思われます。 JSF(JavaServer Faces)フレームワークを使うなら、当然(Java Servletでは無く)Faces Servletが採用されます。 JSF(JavaServer Faces)の基本 https://blog.pepese.com/entry/20131211/1386757110 >JSF2.2のMVCは以下の通り。 >モデル(M) >CDI(Context Dependency Injection)で管理されたオブジェクト >クラスに「@Named」ってアノテーションをつけるとCDIコンテナで管理される >CDIの設定は「bean.xml」で行う(無くてもアノテーションだけでなんとかなるみたい) >ビューからはEL式で呼び出せる >JSFのビューから呼び出されるコンポーネントを「JSFマネージドBean」って呼ぶみたい >ビュー(V) >FaceletsとEL式で記述されたxhtmlファイル >FaceletsはJSFで使うタグライブラリ >http://docs.oracle.com/javaee/7/javaserverfaces/2.2/vdldocs/facelets/ >EL式はシャープと中括弧(#{hoge})で囲った式 >コントローラ(C) >FacesServletというサーブレットを使う >実装不要 >設定は「faces-config.xml」で行う http://www.oracle.com/technetwork/jp/ondemand/branch/wls12c-1524119-ja.pdf >Servlet3.0 > > アノテーションによるプログラミング >  従来、web.xmlへの記述が必要だった構成情報をアノテーションで指定することが可能になりました。 > > Webフラグメント >  ライブラリの設定をweb.xmlではなくwebfragment.xmlというファイルに記載し、ライブラリ自身で保有しておくことが可能になりました。 >JSF2.0のFacelets >• JSF1.2までは、ユーザインターフェースとなるビュー層にJSPを利用するアーキテクチャでしたが、JSPはサーブレットに変換、コンパイルされて実行時にビューを生成するためオーバーヘッドが高く、効率的な仕組みとはいえませんでした。 >• JSF2.0では、Faceletsというコンポーネントを提供しています。Faceletsではビュー層にXHTMLを利用するアーキテクチャになるため、ビュー生成のオーバーヘッドは低く、かつテンプレートなどの機能を活用することが可能になっています。 >• また、faces-config.xmlで複雑な設定を行わずに、アノテーションを使いManagedBean等を定義できるようになっています ↑「ManagedBeanは次のJSFバージョンで無くなる予定だ」そうですので ご注意下さい、良く分からないが「CDI(Contexts and Dependency Injection)/EJB(Enterprise Java Beans)」で そのアノテーションが記述できると言うことだろうか? web.xmlについては下記参照(現状ではwebfragment.xmlが推奨されている)。 web.xmlの記述 https://www.javadrive.jp/servlet/context/index3.html >web.xmlファイルにはServletの呼び出し方や初期値などの設定を記載するようになっています。 faces-config.xmlについては下記参照(ザックリと言うと恐らくページの遷移ルールだろうと思われる)。 JSF 2.0 の詳細について https://yoshio3.com/2012/08/24/ >JSF の内部アーキテクチャについて紹介します。クライアント(ブラウザ)から HTTP リクエストをサーバに対して送信すると、Faces Servlet がリクエストを受信します。Faces Servlet は JSF に関する設定 (faces-config.xml の設定ファイル) を読み込み、各種機能、設定、プロパティ等を読み込みリクエストに対する処理を行います。 >JSF 2.0 から faces-config.xml ファイルは省略可能(オプション化)となり、faces-config.xml ファイルで記載していた設定項目についてはプログラム中のアノテーションで記載できるようになりました。Faces Servlet がリクエストを受信した後、適切なコンテンツに対してリクエストをリダイレクトします。

回答No.9

>どうやらJSF(JavaServer Faces)はフレームワークで、そのフレームワーク内に「Faces Servlet、Managed Bean」の2つのJava言語仕様が有るようです。 >つまり、サーバー・サイドJavaには、JSP(JavaServer Page)、Servletについては「Java Servlet、Faces Servlet」、(サーバー・サイドJava)Beanについては「EJB(Enterprise JavaBeans)、Managed Bean」が有ると言う事になります。 >「ManagedBeanは次のJSFバージョンで無くなる予定だ」そうですので ご注意下さい。 現在は、JSP(JavaServer Page)ではなくJSF(JavaServer Faces)フレームワークのFacelets(XHTML)が推奨されていると思われます。

回答No.8

どうやらJSF(JavaServer Faces)はフレームワークで、そのフレームワーク内に「Faces Servlet、Managed Bean」の2つのJava言語仕様が有るようです。 つまり、サーバー・サイドJavaには、JSP(JavaServer Page)、Servletについては「Java Servlet、Faces Servlet」、(サーバー・サイドJava)Beanについては「EJB(Enterprise JavaBeans)、Managed Bean」が有ると言う事になります。 「ManagedBeanは次のJSFバージョンで無くなる予定だ」そうですので ご注意下さい。

回答No.7

JSF 2への第一歩 https://builder.japan.zdnet.com/sp_oracle/35040792/ >Model:Managed Bean、またはCDI(Container Dependency Injection) ↑「ManagedBeanは次のJSFバージョンで無くなる予定だ」そうですので ご注意下さい、これからは「CDI(Contexts and Dependency Injection)/EJB(Enterprise Java Beans)」が主流になると思われます。 JavaEE使い方メモ(CDI) https://qiita.com/opengl-8080/items/431de9175dca33a09ba8 >CDI とは >Contexts and Dependency Injection の略。 >Java EE 7 には ver 1.1 が含まれている。 >JSR は 346。 > >DI (依存性の注入)に加えて、管理しているインスタンスのスコープの管理まで行ってくれる。 > >CDI 誕生の経緯と JBoss Seam の変遷 >CDI は、 JBoss が提供していた独自フレームワークである Seam が前身となっている。 > >Seam は日本語で「継ぎ目」という意味。 >Java EE 5 の頃の JSF と EJB をシームレスに連携させることを目的に作られたのが、この Seam というフレームワーク。 > >この Seam の中で、 DI やコンテキストの管理を担っていたコアの部分が抽出され、 JSR として標準化されたものが CDI 1.0 (JSR299)になる。 >参照実装は Weld で、 Red Hat によって開発されている。 > >JSR299 は Java EE 6 に取り込まれ、標準仕様となった。 > >コア部分が標準仕様として EE に取り込まれたあと、 Seam は CDI の拡張機能を提供するフレームワークとして開発されることになった(Seam 3)。 >しかし、同じように CDI を拡張するサードパーティのフレームワークは、他にも存在していた(Apache MyFaces CODI、CDISource)。 > >せっかく CDI という形で仕様を一本化したのに、このままだと結局また分岐が進んでいくことになる。 >このことを危惧した各フレームワークのコミュニティは、これらのフレームワークを1つにまとめ、新しく Apache DeltaSpike という Apache プロジェクトを立ち上げることにした。 > >現在は、この Apache DeltaSpike というプロジェクトで CDI の拡張機能が実装されている(例えば、 EE 6 環境でも EE 7 相当の機能 @Transactional とかが使えるようになる拡張機能とか)。 > >今後の CDI >はじめは JSF と EJB を繋ぐ目的で導入された CDI だが、 EE 7 ではそれ以外にも様々なコンポーネントを連携させる役割を担うようになっている(JAX-RS、Bean Validation などなど)。 > >今後も、 CDI を利用した連携の強化は進められていくらしい(Java Day Tokyo 2015 より)。

回答No.6

JSF 2への第一歩 https://builder.japan.zdnet.com/sp_oracle/35040792/ >JSF 1からJSF 2へのバージョンアップにおいて、どのような点が変更されたのだろうか >そもそもWebページのデザインは、Webアプリケーションのライフサイクルを通じて何度も変更されるものだ。そのため、Webアプリケーション開発者はその都度、Webデザイナーが修正したHTMLファイルに対してJSPコードを追加し、修正したWebページをプレビューする際にはいったんWebページ(JSPファイル)をコンパイルする必要があるなど、作業効率が悪いという問題を抱えていた。 >JSP 2では、この問題を「Facelets」の導入によって解決している。Faceletsとは、XHTMLをベースにしたテンプレート技術であり、これによってWebデザイナーとWebアプリケーション開発者が1つのXHTMLファイルに対し、それぞれ次のような具合に互いの作業を阻害することなくWebページの作成が行えるようになっている。 >JSF 2によるWebアプリケーションは、次に挙げる3つの要素から構成される。 > >Controller:Faces Servlet >View:XHTML(Facelets) >Model:Managed Bean、またはCDI(Container Dependency Injection) JSF 2.0 の詳細について https://yoshio3.com/2012/08/24/detail-of-jsf20/ >JSF は MVC アーキテクチャに基づく開発を行います。モデル部分を JSF の Managed Bean (もしくは CDI) を使って実装し、ビュー部分を JSF の Facelets (xhtml)、コントローラ部分を Faces Servlet で担当し実装を行っていきます。どの URL に対してリクエストが来たのか、どのビューのページで処理を行うのか等のコントロールを Faces Servlet が行いますが、この Faces Servlet は web.xml 設定ファイルに設定を行った後は、プログラマは直接この Servlet に対して操作を行う事はありません、実際にプログラマが開発を行う際には、ビューの部分とモデルの部分を中心に開発を行っていきます。

回答No.5

JavaServer Faces https://ja.wikipedia.org/wiki/JavaServer_Faces >JSF 2.2(2013年5月21日) : HTML5の対応、テンプレートを切り替えるリソース・ライブラリ・コントラクト、画面遷移を管理するFacesフロー、サーバー側でコンポーネントツリーを保持しないステートレス・モードの追加、といった変更が加えられている。 JSPはもう古い?Faceletsとは https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/14/161613 >当初JSFはビューを記載する方法として、アクションベース(URLによってサーバ側の処理を決定する)で動作するJSPを使っていましたが、 >バージョン2.0以降はFaceletsが標準仕様内に組み込まれ、サーブレットと組み合わせずに動作をさせることができるようになりました。

paranoia23
質問者

お礼

アクションによっては、 リクエストを飛ばさすにクライアントで完結させられたら嬉しいですが、具体的な実装イメージまでたどり着けませんでした。 それができるならいいですね!

関連するQ&A