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>