

すごく漠然となんですが質問させてください。「CDIを勉強しといて」だけ言われて、自分なりに奔走中なのですが、乱暴に？安直に言えばサーブレット&JSPの技術の延長線上にあるフレームワークのようなものと考えてよろしいのでしょうか？

Eclipseから「CDI Web
プロジェクト」を選択し、とりあえずサーブレットとJSPで作成したプログラムをまるごと移しただけでも普通に動くんですが、ポイントはやはりアノテーションとxmlの活用でしょうか？また、JSPファイルをXHTMLに置き換えることでしょうか？

個人的にこれまで触ったことのあるフレームワーク(Spring,
Struts)と、サーブレットの技術から少しずつ色んな要素を取ってきて…でもどれにも似ていないような印象を受けました。

すいません。質問を明確にさせて頂きますと、

①JSPファイルでは「うまみ」が享受できないから、XHTMLファイルなのでしょうか？JSPではダメですか？

②Servletクラスは存在し、MVCでいうModelがBeanと呼ばれるものになったという解釈で合っていますか？

③要はサーブレット&JSPで事あるごとにスコープにせっせと入れて出してしてたものを、もっと簡単に扱えるようになるというのが(スコープ管理が)最大の利点でしょうか？

どんな状況で、何をするために勉強するのかという点をお伝えできないぶん(あるいは私が無知過ぎて質問自体がおかしくて)お答えづらい部分もあるかもしれませんが、使われたことがおありの方がいらっしゃればお答え頂けますと幸いです。

よろしくお願い致します。


CC BY-SA 4.0
2019-01-22T16:02:02.610
52217
2019-01-31T15:30:15.697
question
java
CDI Web プロジェクトについて


CDIは、Java EEフレームワークの機能の一部と言えると思います。

「Context≒スコープ」を「Dependency
Injection＝コードで実装せずアノテーションで指定」するツールって感じでしょうか。(ぜんぜん違うかも・・・）

xhtmlは関係ありません。  
MVCでいうところのModelであってると思います。サーバーサイトJavaのアーキテクチャではビジネスロジック層です。ただ、CDIは利用範囲が広いのでプレゼンテーション層など他の領域にもつながってるらしいです。  
ご参考）<https://builder.japan.zdnet.com/sp_oracle/35079781/>

スコープ管理をCDIコンテナ (≒アプリケーション・サーバー) がやってくれるので、new
で生成する必要がなくて、かつ指定したスコープがすぎれば自動的に破棄してれるのが特徴です。

他には、スコープの変更が容易な点や、自動破棄されるのでリソース的にもメリットあります。

JavaEEという枠の中でEJBの問題点を回避するためにできた機能という印象ですが、JavaEEについて調べてみるとCDIとはなんぞやということが
俯瞰して見えてくるかもしれません。


CC BY-SA 4.0
2019-01-23T11:52:18.967
52262
2019-01-23T11:52:18.967
5008
52217
answer


> 安直に言えばサーブレット&JSPの技術の延長線上にあるフレームワークのようなものと考えてよろしいのでしょうか？

いいえ。ですが、最初はそのような理解でもいいのかもしれません。  
CDI（Contexts and Dependency Injection for the Java EE Platform）は「Java
EE」という標準仕様の一つで、すごく簡単に言うと、スコープを指定したDI（依存性注入）を実現する機能の仕様のことです。

Java
EEは、エンタープライズアプリケーション（≒Webアプリケーション）をJavaで開発するための機能をまとめた標準仕様集です。したがって、CDIは正確には仕様であって実体はありません。この仕様を実装すると、CDIの機能が実現できるようになります。実際にこれを実装しているのは、WildFlyに含まれているWeldなどです。

CDIはJava EE 6から採用されていますが、Java EEにはCDIの他に「DI（Dependency Injection for Java
）」という仕様もあります。どちらも主目的はDIですが、管理するスコープの指定ができるあたりが大きな違いだと思います。

> ポイントはやはりアノテーションとxmlの活用でしょうか？

定義にアノテーションとxmlを利用しますが、それがポイントというわけでなく、ポイントは「DI」にあると思います。なので、まずは、DIの概念から勉強した方がいいと思います。

> また、JSPファイルをXHTMLに置き換えることでしょうか？

いいえ。  
CDIの仕様は、以下で確認できますが、XHTMLに置き換えるようなことは書いてありません。

<https://download.oracle.com/otn-pub/jcp/cdi-1_1-fr-eval-spec/cdi-spec.pdf>

> ①JSPファイルでは「うまみ」が享受できないから、XHTMLファイルなのでしょうか？JSPではダメですか？

XHTMLはCDIとは直接関係無いので、いったん忘れてください。

> ②Servletクラスは存在し、MVCでいうModelがBeanと呼ばれるものになったという解釈で合っていますか？

いいえ。違います。

>
> ③要はサーブレット&JSPで事あるごとにスコープにせっせと入れて出してしてたものを、もっと簡単に扱えるようになるというのが(スコープ管理が)最大の利点でしょうか？

うーん。間違っているともいいがたいですが... 参考になりそうなページを以下に挙げてみましたので、勉強してみて下さい。

【参考】  
JavaEE7をはじめよう(10) - CDIの概要  
<http://enterprisegeeks.hatenablog.com/entry/2015/06/08/072843>

JavaEE屈指の便利機能、CDIを触ってみよう  
<https://cloudear.jp/blog/?p=1945>

Qiita - JavaEE使い方メモ（CDI）  
<https://qiita.com/opengl-8080/items/431de9175dca33a09ba8>


CC BY-SA 4.0
2019-01-24T04:25:26.590
52278
2019-01-31T15:30:15.697
2019-01-31T15:30:15.697
21092
21092
52217
answer


Eclipse(正確にはEclipseのJBoss Toolsプラグイン)のウィザードから生成される[CDI Web
Project](http://docs.jboss.org/tools/latest/en/cdi_tools_reference_guide/html/chap-
CDI_Tools_Reference_Guide-Creating_a_CDI_Web_Project.html)は、デフォルトではJavaServer
Faces(JSF)もデフォルトで有効になっています。  
[![画像の説明をここに入力](https://i.stack.imgur.com/LImqK.png)](https://i.stack.imgur.com/LImqK.png)  
質問文中にはCDIの他JSFに関すると思しきものも含まれています(XHTMLファイルと呼んでいるのはおそらくJSFでしょう)。  
私はJSFについてあまり知らないのでCDIを中心にして回答してみます。

* * *

> 個人的にこれまで触ったことのあるフレームワーク(Spring,
> Struts)と、サーブレットの技術から少しずつ色んな要素を取ってきて…でもどれにも似ていないような印象を受けました。

CDIは、Springで言うところの `@Component`と`@Autowired`みたいなものです。  
似ていないというのはおそらくJSFの部分かと思います。

> ①JSPファイルでは「うまみ」が享受できないから、XHTMLファイルなのでしょうか？JSPではダメですか？

CDIを使うのにJSFは必須ではありません。 CDIとJSPを組み合わせることも可能です。この場合XHTMLファイルは登場しません。

> ②Servletクラスは存在し、MVCでいうModelがBeanと呼ばれるものになったという解釈で合っていますか？

その通りで、ServletとCDIを組み合わせて利用する場合はC->Servlet, M->CDI Bean
とすることが大半かと思います(VはJSPなりJSFなり)。

>
> ③要はサーブレット&JSPで事あるごとにスコープにせっせと入れて出してしてたものを、もっと簡単に扱えるようになるというのが(スコープ管理が)最大の利点でしょうか？

スコープオブジェクトへの出し入れが簡単になる、という側面もありますが、主にはModel実装でEJBが不要になる、ということが大きいと思います。

参考: [CDIとEJBの使い分けについて -
スタック・オーバーフロー](https://ja.stackoverflow.com/q/29530/2808)

* * *

CDIについて学ぶのであれば、デファクトスタンダード実装である[Weld](http://weld.cdi-
spec.org/)のドキュメントを読むのが良いかと思います。  
[spec](http://www.cdi-spec.org/download/)自体もそんなに難しくはないです。  
また、(JavaEE周りにしては)Qiita等日本語で解説を書かれている方も多い印象があります(のでググって得られることも多いかと)。


CC BY-SA 4.0
2019-01-27T03:56:26.490
52349
2019-01-27T03:56:26.490
2808
52217
answer