Java開発 虎の巻

Java Web

Spring Boot

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

一般的な流れ

  1. サーブレットが割り当てたURLで呼び出される
  2. フォームからのパラメータ取得
  3. Modelクラスの生成と利用
  4. ModelクラスをリクエストスコープでJSPに渡す
  5. 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>