Java開発の技術用語

# Javaサーブレット
・webサーバー上（バックエンド）で動くJavaプログラム

```サーブレットのコード（HelloWorld.java）
import java.io.*;

 import javax.servlet.*;

 import javax.servlet.http.*;

 public class HelloWorld extends HttpServlet {

   public void doGet(HttpServletRequest request,

      HttpServletResponse response)

     throws ServletException,IOException {

     response.setContentType(“text/html;charset=Shift_JIS”);

     PrintWriter out=response.getWriter();

     out.println(“<html><head>”);

     out.println(“<title>Hello, World!!</title>”);

     out.println(“</head><body>”);

     out.println(“<p>Hello,World!!</p>”);

     out.println(“</body></html>”);

   }

 }
```
# JSP
・Webページ内にJavaプログラムを埋め込み、これをサーバ上で実行して結果を反映したページを動的に生成することができる技術。

```JSPのコード（HelloWorld.jsp）
<html>

 <head>

 <title>Hello, World!!</title>

 </head>

 <body>

 <% out.println(“<p>Hello,World!!</p>”); %>

 </body>

 </html>
```

## 近年では、JSPの代わりにテンプレートエンジンが活用されている。
- [テンプレートエンジンとは](# テンプレートエンジンとは)

# 役割
・Servletの役割→データベースアクセスや計算処理のようなロジックを書き、JSPをデータを渡しつつ呼び出す
・JSPの役割→Servletからデータを受け取り、HTMLを動的に出力する

#### 参考
- [サーブレット(Java Servlet)とは？【概要を5分で把握】](https://hnavi.co.jp/knowledge/blog/java-servlet/)
- [サーブレット&JSPとは？　概要と2つの役割の違いを解説](https://it-kyujin.jp/article/detail/1447/)
- [「Servlet」と「JSP」の違い
](https://wa3.i-3-i.info/diff185java.html)

# MVCモデルで表すと
|要素|役割|ファイル|
|:--|--:|:--:|
|Model|アプリケーションの主たる処理やデータの格納などを行う|一般的なクラス|
|View|ユーザーに対して画面の表示を行う|JSPファイル|
|Controller|ユーザーからの要求を受け取り、処理の実行をモデルに依頼し、その結果の表示をビューに依頼する|サーブレットクラス
|

#### 参考
- - [MVCモデルの簡単な例](https://qiita.com/kefian1go/items/e4f28fa6f4118775708a)


# サーブレットコンテナ(Webコンテナ) 
- HTMLなどのWebページを動的に生成するJavaサーブレットを動作させるためのソフトウェアのことである。
- Java Servletを動かすときに必要なソフト
- Java Servletを動作させる実行環境のことをサーブレットコンテナと言う。

####　参考
- [サーバ構築のために知っておきたい「Apache Tomcat」について](https://persol-tech-s.co.jp/hatalabo/it_engineer/337.html)

## コンテナの種類
- Tomcat
 - Webサーバーの機能も含んだサーブレットコンテナ
- Glassfish
 - Tomcatと同じような性質のアプリケーション
 - Tomcatの大きな違いとして、Glassfishは有償での商用利用が可能
- Jetty
 - 軽量なWebサーブレットコンテナ
 - 軽量であるため組み込み系のJavaシステムに利用することが多いです。



#webサーバー
- WEBブラウザからのリクエストに応じて静的画面や画像などのホームページのデータを Web ブラウザーに送ってくれるサーバーのこと

#### 参考
- [今さら聞けない　WEBサーバとはどんなサーバ？](https://www.no1web.jp/blog/15004/)


## WEBサーバの種類
- Apache
  - オープンソースでありながら高い信頼性と充実した機能を備えた世界中で最も多く使われているWEBサーバであります。Linuxで多く使われている。
- Nginx（エンジンエックス）
  - Apacheと同じくオープンソースであり、同時リクエストの処理に特価していて、軽量で処理が早いWEBサーバ
- IIS（Microsoft Internet Information Services）
  - Microsoft Windowsの標準WEBサーバ

## ApacheとTomcatを連携させるメリット
- Tomcat単体でもWebサーバとしての機能を確保している。
- Tomcatだけでサーバ処理を行えばシンプルだが、Apacheと比較すれば性能は劣るため、2つを連携させることで優位なサーバ構築が可能となる。

#### 参考
- [サーバ構築のために知っておきたい「Apache Tomcat」について](https://persol-tech-s.co.jp/hatalabo/it_engineer/337.html)

# Javaのフレームワーク
 - Spring Framework
 - Seasar2
   - 純国産のJavaフレームワーク
   - Seasarの由来は、中心となって開発した比嘉康雄さんが沖縄出身だったため
   - 2016年9月26日 をもって EOL (End of Life)となっている。
 - Struts
  - Struts1・2ともに脆弱性が指摘されていて現象傾向となっている。
  - Strutsを採用していた大手の企業が、外部からの攻撃により多数の被害が出ている。

# Spring Frameworkとは
 - 2004年にリリースされたオープンソースのフレームワーク。
 - 他のフレームワークと比較し、汎用性の高さに定評がある。
 - DI（依存性注入）やAOP（アスペクト指向プログラミング）など、システム開発やプログラムの修正がしやすくなる仕組みが導入されている。
 - Spring Frameworkはフレームワークの集合体で、機能に応じて多数のフレームワークで構成されている。これによって、幅広い開発ができるが、機能の使い分けが難しいというデメリットもあった。
 

## DI（Dependency Injection:依存性の注入）

 - DIは日本語で言うと「依存性の注入」になります。
意味的には「オブジェクトの注入」と理解すれば良いです。
クラスの外から依存性（オブジェクト）を注入してあげることで、クラス間の依存関係を解決するといった目的を持ちます。

#### 参考
- [Spring Boot入門① ～DI～
](https://qiita.com/gksdyd88/items/7886f54ee8a22d311400)
- [依存性注入（DIコンテナ）について](https://cloudear.jp/blog/?p=1247)

## AOP(Aspect Oriented Programming:アスペクト指向プログラミング)とは
- プログラムの特定の処理を「アスペクト」と呼ばれる機能単位として分離して記述し、プログラム中の様々な対象に適用できるようにする手法

#### 参考
- [ざっくりとSpringで使うAOPの解釈をする](https://qiita.com/ughirose/items/a7c66782f93cd1ae0d68)

# Spring bootとは
- Spring Frameworkの機能の使い分けが難しいというデメリットを解決するために作られたフレームワーク
- Spring BootもSpring Frameworkをベースとするフレームワークの1つである。

# Spring FrameworkとSpring bootの違い

- Spring Frameworkは、Java言語のアプリケーション開発のために作られたフレームワークの集合体。
- Spring bootは、集合体となった機能を使いやすくするためのフレームワーク。

#### 参考
- [Spring Bootとはなにか](https://qiita.com/mzmz__02/items/bfe0b5707f1afbb5ac9a)
 
# テンプレートエンジンとは

- テンプレートと呼ばれる雛形と入力データを合成し、成果ドキュメントを出力する仕組み
- 近年、JSPの代わりにテンプレートエンジンを活用して画面設計を行う事例が増えて来ている。

#### JSPの課題点
- 1．デザイナーとエンジニアの作業の境界が曖昧になる
- 2．最終的にブラウザで描画される結果と異なる

#### 参考
- [テンプレートエンジンとは何か？](https://pyteyon.hatenablog.com/entry/2019/08/23/135834)
- [Thymeleafを使ったテンプレートベースのJava Webアプリケーション開発について](https://www.nttdata.com/jp/ja/data-insight/2019/0805/)

## Spring Bootで利用可能なテンプレートエンジン
- Thymeleaf
  - th:○○という属性をHTMLタグに追加する。独自タグを使用しないため、HTMLファイルを表示しても、HTMLを崩さず表示できる。
  - 参考:https://www.nttdata.com/jp/ja/data-insight/2019/0805/
- FreeMarker
 - 表示する場所に${○○}を埋め込む。制御は<#○○>。HTMLファイルを表示すると、これらのタグはHTMLに影響を与えてしまう。
- Groovy
  - Java仮想マシン上で動作するスクリプト。HTMLとはまったく異なるコード体系なので、学習コストが高い。