Eclipse
オートリロード設定
Serversプロジェクトの「server.xml」の下部にあるContextタグのdocBaseがプロジェクト名のものの「reloadable」を「true」に変更する。
サーブレット
URL
http://localhost:8080/プロジェクト名/URLパターン
URLパターンはサーブレットクラスの上に付けられているアノテーションで設定
@WebServlet("/index")
メソッド
- doGet URL指定やリンクでのブラウザ表示
- doPost フォームでPOST送信されたとき
- 引数request・・・受信したデータ関連(ブラウザから送られてきた)
- 引数response・・・送信するデータ関連(ブラウザに送る)
サーブレット内での出力
response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>Hello World</p>"); out.println("</body>"); out.println("</html>");
フォームからの受け取り
request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); String ageStr = request.getParameter("age"); int age = Integer.parseInt(ageStr);
フォワード
jspファイルを開く
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/sample.jsp"); rd.forward(request, response);
リダイレクト
別ページに飛ぶ
response.sendRedirect("IndexSrv");
リクエストスコープ設定
JSPにデータを渡す
request.setAttribute("slist", list);
JSP
<% Javaプログラム %> <%= 式 %> 式の値の表示 <%-- コメント --%> コメント
ディレクティブ
<%@ page import="java.util.Date" %> インポート <%@ include file="ファイル名" %> 静的インクルード
MVC
名前 | 役割 | クラス |
---|---|---|
Model | データ | 一般的クラス(JavaBeans、DAO/DTOなど) |
View | 表示 | JSP(+CSS) |
Controller | データと表示の橋渡し | サーブレット |
まずサーブレットが呼び出され、表示時にJSPを呼び出すようにする。1ページ=サーブレット+JSP
一般的な流れ
- サーブレットが割り当てたURLで呼び出される
- フォームからのパラメータ取得
- Modelクラスの生成と利用
- ModelクラスをリクエストスコープでJSPに渡す
- JSPの呼び出し(フォワード)
例
// フォームからのパラメータ取得 request.setCharacterEncoding("UTF-8"); String sidStr = request.getParameter("sid"); int sid = Integer.parseInt(sidStr); // Modelクラスの生成と利用 DbConnection con = new DbConnection(); ShouhinDAO dao = new ShouhinDAO(con.getConnection()); Shouhin shouhin = dao.findById(sid); // ModelクラスをリクエストスコープでJSPに渡す request.setAttribute("shouhin", shouhin); // JSPの呼び出し(フォワード) RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/shouhin.jsp"); rd.forward(request, response);
JavaBeans
カプセル化されて、setter/getterがあり、引数なしにコンストラクタがあるクラス
例:class Member{ private String name; private int age; public Member(){ } public Member(String name,int age){ this.name = name; this.age = age; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } }
EL式
JavaBeansがJSPに渡されてきたとき、簡単に表示できる。
サーブレット内で渡すときMember m = new Member("tanaka",30); request.setAttribute("member", m);JSP内での表示
${member.name}
式
EL式内でJavaの計算式を書くことも可能
${member.age +1}
三項演算子(式 ? trueの値:falseの値)を使うとIf文的なこともできる。
${member.age >= 20 ? "大人":"子供"}
SELECTで初期値を指定する例
<select name="seibetu"> <option value="0" ${member.seibetu == 0 ? "selected" : ""}>男</option> <option value="1" ${member.seibetu == 1 ? "selected" : ""}>女</option> </select>
JSTL Core
JSP内でEL式でforEachなどが書ける
準備
- jarファイルのダウンロード
- jstl-api-1.2.jar、jstl-impl-1.2.jar の2つを tomcat/9/lib あるいは WebContents/WEB-INF/lib に入れる。
- JSP内には以下を書く
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
forEach
サーブレット内で、MemberクラスのArrayListオブジェクトが list の名前で渡されたとき。
<c:forEach items="${list}" var="m"> ${m.name} </c:forEach>
要素の番号もvarStatus.indexで出すことができる。
<c:forEach items="${list}" var="m" varStatus="status" > ${status.index]:${m.name} </c:forEach>
varStatusにはindexの他にcount(1からの回数)やfirst、last(真偽値)などがある。
begin、endを使うとfor文と同様の固定の値も出せる。
<select name="month"> <c:forEach begin="1" end="12" var="tuki"> <option>${tuki}</option> </c:forEach> </select>月
画面表示
タグがそのまま表示されないように、特殊文字に変換(エスケープ)して画面に出力
サーブレット内で、MemberクラスのArrayListオブジェクトが list の名前で渡されたとき。<c:out value="${member.name}" />
値のセット
スコープへの値の設定
リクエストスコープ name に member.name を設定
<c:set var="name" value="${member.name}" />
セッションスコープ name に member.name を設定
<c:set var="name" value="${member.name}" scope="session" />
条件分岐
trueのときだけ処理
<c:if test="${member.age>=20}" > 大人 </c:if>
オブジェクトがあるときのみ
<c:if test="${not empty member}" > // memberがあるときの処理 </c:if>
trueのときとfalseの処理で分ける
<c:choose> <c:when test="${member.age>=20}" > 大人 </c:when> <c:otherwise> 子供 </c:otherwise> </c:choose>
JSTL I18N
JSP内でEL式の日付などをフォーマットできる
準備
- jarファイルはCOREと同じ
- JSP内には以下を書く
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
日付フォーマット
yyyy | 年 |
---|---|
MM | 月 |
dd | 日 |
E | 曜日 |
HH | 時 |
mm | 分 |
ss | 秒 |
<fmt:formatDate value="${u.hi}" pattern="yyyy年MM月dd日" />
数値フォーマット
# | 数値(0の場合非表示) |
---|---|
0 | 数字(0の場合0で表示) |
カンマ(,) | 桁区切り |
HH 時 mm 分 ss 秒
<fmt:formatNumber value="${u.kosu}" pattern="###,###" />
セッション
セッションの設定
HttpSession session = request.getSession(); session.setAttribute("name", name);
セッションの取得
HttpSession session = request.getSession(); String name = (String)session.getAttribute("name");
セッションの破棄
HttpSession session = request.getSession(); session.invalidate();
JSP(JSTL)でのセッション判定
セッションスコープ name を判定する(リクエストスコープと同じ)
<c:if test="${not empty name}" > // ログイン時の処理 </c:if>