JSP & Servlet
Java Server Pages
JSP File
- Javaを含 むHTMLページ
- Javaコードからの動的 コンテンツを含 む
.jsp & .html へのアクセス
- webapp
- a.html :
http://ip:port/プロジェクトパス/a.html - b.jsp :
http://ip:port/プロジェクトパス/b.jsp
- a.html :
JSP の本質
graph BT
HJB[Class HttpJspBase]
HS((Interface HttpServlet))
HJP((Interface HttpJspPage))
HJB --> HS
HJB -.-> HJP
- JSPはServletプログラム
- 初回 の.jspページアクセス時 、Tomcat Serverが.javaを生成 し、.classにコンパイル
JSP - Syntax
page Directives ディレクティブ
<%@ directive attribute="value" %>
- language 属性 ︰JSP内 で使用 する言語
- contentType 属性 ︰JSPが返 すデータ型
- pageEncoding 属性 ︰JSPページファイル自体 のCharacter set
- import 属性
- autoflush 属性 ︰out出力 ストリームバッファがいっぱいになった後 、自動 フラッシュするかどうか
- buffer 属性 ︰outバッファのサイズ。デフォルト8kb
- errorPage 属性 ︰JSPエラー時 のカスタム404ページへの自動 ジャンプ
- isErrorPage 属性 :JSPがエラー情報 ページかどうか
- session 属性 ︰現在 のJSPページでHttpSessionオブジェクトを作成 するかどうか
- extends 属性
JSP Implicit Objects
- request
- response
- pageContext
- session
- application - ServletContext オブジェクト
- config - ServletConfig オブジェクト
- out
- page
- exception
JSP Scope Object
- pageContext ( PageContextImpl ):現在 のJSPページ範囲 内 で有効
- request ( HttpServletRequest ):1回 のリクエスト内 で有効
- session ( HttpSession ):ブラウザを開 いてリクエストしてからブラウザを閉 じるまで
- application ( ServletContext ):Webプロジェクト全体 で有効
使用優先順位
pageContext → request → session → application
常用タグ
Static include
<%@include file="/include/footer.jsp" %>Dynamic include
<jsp:include page="/include/footer.jsp">
<jsp:param value="root" name="username"/>
</jsp:include>EL ( Expression Language ) & JSTL
- ELはJSPページでのデータ出力 のためにScriptを置 き換 え
- ELがnullを出力 する場合 、空 文字列 を表示
EL 11 implicit object
| Variable | Type | 用途 |
|---|---|---|
| pageContext | PageContextImpl | JSPの9つのimplicit Objectを取得 |
| pageScope | Map<String, Object> | pageContext範囲 のデータを取得 |
| requestScope | Map<String, Object> | Request範囲 のデータを取得 |
| sessionScope | Map<String, Object> | Session範囲 のデータを取得 |
| applicationScope | Map<String, Object> | ServletContext範囲 のデータを取得 |
| param | Map<String, String> | Requestパラメータを取得 |
| paramValues | Map<String, String[]> | 複数 値 のRequestパラメータを取得 |
| header | Map<String, String> | Request Header情報 を取得 |
| headerValues | Map<String, String[]> | 複数 値 のRequest Header情報 を取得 |
| cookie | Map<String, Cookie> | 現在 のrequestのCookie情報 を取得 |
| initParam | Map<String, String> | web.xmlの<context-param>を取得 |
JSTLタグLib
| 機能 範囲 | Prefix |
|---|---|
| コアタグLib | c |
| フォーマット | fmt |
| 関数 | fn |
Servlet
階層図
graph BT
O{Object}
SVL((Servlet))
HS[/HttpServlet/]
GS[/GenericsServlet/]
Custom[カスタムServletプログラム]
GS -.-> SVL
HS --> GS --> O
Custom --> HS
- Interface Servlet:Servletプログラムのアクセス規範 を定義
- abstract class GenericServlet:ServletConfigの使用 方法 を提供
- abstract class HttpServlet:service()メソッドを実装 し、リクエストの振 り分 け処理 を実装
- カスタムServletプログラム:doGet()、doPost()をオーバーライドするだけ
Lifecycle
- Servletコンストラクタメソッドを実行
- init初期化 を実行
Step 1、2は初回
アクセス時
にServlet作成
時
に呼
び出
し
- serviceメソッドを実行 (毎回 呼 び出 し)
- destroyメソッドを実行 (プログラム停止 時 に呼 び出 し)
Interface ServletConfig
Servletプログラムの設定
情報
に使用
3つの役割 :
- Servletプログラムの別名 servlet-nameの値 を取得
- 初期化 パラメータinit-paramを取得
- ServletContextオブジェクトを取得
Interface ServletContext
- Servlet上 下 文 オブジェクト
- 1つのProjectに1つのServletContextオブジェクトインスタンスのみ
- ServletContextオブジェクトはDomain Object
4つの役割 :
- web.xmlの上 下 文 パラメータcontext-paramを取得
- 現在 のプロジェクトパスを取得
- プロジェクトデプロイ後 のServer上 の絶対 パスを取得
- Mapのようにデータを保存 ・取得
GET & POST リクエスト
GET:
<form>tag - method=get<a href="">tag : ハイパーリンク<link>tag でcssを埋 め込 み<script>tag でjsファイルを埋 め込 み<img>tag で画像 を埋 め込 み- iframeでhtmlページを埋 め込 み
- ブラウザのアドレスバーにアドレスを入力 してEnter
POST:
<form>tag - method=post
常用のResponse Status Code
200 - Request成功
302 - Requestリダイレクト
304 - 読 み取 り済 みの画像 やページ、ブラウザキャッシュから読 み取 り
404 - Requestアドレスエラー
500 - Server内部 エラー
Interface HttpServletRequest
RequestがTomcat Serverに入
ると、Tomcat ServerはHTTPプロトコル情報
を解析
してRequestオブジェクトにカプセル化
し、service()メソッドに渡
す。
常用 メソッド:
| メソッド | 説明 |
|---|---|
| getRequestURI() | Requestのパスを取得 |
| getRequestURL() | 絶対 パスを取得 |
| getRemoteHost() | Client側 のIPアドレスを取得 |
| getHeader() | Request Headerを取得 |
| getParameter() | Requestパラメータを取得 |
| getMethod() | Requestメソッド(GET/POST)を取得 |
リクエストの転送
sequenceDiagram
Client(Browser)->>+Tomcat(Servlet_1): http://ip:port/プロジェクト名/servlet_1
Tomcat(Servlet_1)->>Tomcat(Servlet_2): Servlet_1からServlet_2への操作をリクエスト転送と呼ぶ
Tomcat(Servlet_2)->>+Client(Browser):Servlet_1 & Servlet_2で完全なビジネス機能を完成
リクエスト転送 の特徴 :
- ブラウザのアドレスバーは変化 しない
- 1回 のリクエスト
- Request内 のDataを共有
- WEB-INFディレクトリ下 に転送 可能
- Project外 には転送 不可
リダイレクト
sequenceDiagram
Client->>Server: Request
Server->>Client: Response 302 + Location: new_url
Client->>Server: new_urlへのRequest
Server->>Client: Final Response
リダイレクトの特徴 :
- ブラウザのアドレスバーが変化 する
- 2回 のRequest
- Request内 のDataを共有 しない
- WEB-INFディレクトリ下 のリソースにアクセス不可
- プロジェクト外 のリソースにアクセス可能
JavaEE 三層アーキテクチャ
flowchart LR
W[Client / Browser]
V[V / View]
S[Service サービス]
M[M / Model / DAO 永続化]
DB[(MySQL / Oracle / ...etc.)]
subgraph Database
DB
end
subgraph JaveEE
V
S
M
end
subgraph Browser
W
end
W --> V -->|Controller / Servlet| S --> M --> DB
DB --> M --> S -->|Controller / Servlet| V --> W
- Browser:HTML、CSS、JS、JQuery
- View:Servlet、Spring MVC、Struts
- Service:Spring Framework
- Model / DAO:JDBC、Hibernate