JSP/JSTL
★JSP構成
ディレクティブ要素
<%@ page contentType="text/html; utf-8" language="java" %>
<%@ include file="header.jsp" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
スクリプト要素
<%! List<Book> books = new ArrayList<Book>(); %>
<% books.add(...); %>
<%= books.getCount()%>
アクション要素
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:include>
<jsp:forward>
<jsp:param>
<jsp:plugin>
<jsp:params>
<jsp:element>
<jsp:attribute>
<jsp:body>
★JSPの暗黙オブジェクト
※範囲昇順:page⇒request⇒session⇒application
★pageEncodingとcontentType
pageEncoding JSPファイルがどの文字コードで記述される
contentType HTTPコンテンツタイプ
pageEncoding UTF-8 contentType
xxx.jsp ⇒ xxx.java ⇒ xxx.class ⇒ xxx.html
<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%> 中国語の例
<%@ page contentType="text/html;charset=utf-8" pageEncoding="windows-31j"%> 日本語の例
★JavaBeanについて
<jsp:useBean id="name" scope="page|request|session|application"
class= "package.className" type="typeName" />
scopeのデフォルト値はpageで、正しく設定するのは大切
★JSTLについて
コアアクション
<c:out>
<c:set>
<c:remove>
<c:catch>
<c:if>
<c:choose>
<c:when>
<c:otherwise>
<c:forEach>
<c:forTokens>
<c:import>
<c:url>
<c:param>
<c:redirect>
<c:set var="limit" value="10" />
<c:forEach var="i" begin="2" end="${limit - 3}">
<c:choose>
<c:when test="${i%2 == 0}">
<c:out value="${i} is even" /><br />
</c:when>
<c:otherwise>
<c:out value="${i} is odd" /><br />
</c:otherwise>
</c:choose>
</c:forEach>
フォーマットアクション
<fmt:message>
<fmt:param>
<fmt:bundle>
<fmt:setLocale>
<fmt:requestEncoding>
<fmt:timeZone>
<fmt:setTimeZone>
<fmt:formatNumber>
<fmt:parseNumber>
<fmt:formatDate>
<fmt:parseDate>
<c:set var="now" value="<%=new java.util.Date()%>" />
<fmt:formatDate type="time" value="${now}" /><br />
<fmt:formatDate type="date" value="${now}" /><br />
<fmt:formatDate type="both" dateStyle="short" timeStyle="long" value="${now}" />
<fmt:setLocale value="en_us" />
<fmt:formatNumber value="12.50" type="currency" />
関数
<fn:contains>
<fn:containsIgnoreCase>
<fn:endsWith>
<fn:escapeXml>
<fn:indexOf>
<fn:join>
<fn:length>
<fn:replace>
<fn:split>
<fn:startsWith>
<fn:substring>
<fn:substringAfter>
<fn:substringBefore>
<fn:toLowerCase>
<fn:toUpperCase>
<fn:trim>
<c:set var="target" value="xxx" />
<c:out value="${fn:toLowerCase(target)}" />
<c:if test="${fn:length(target) == 3}">...</c:if>
★taglib
JSTL
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
JSF
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="ui" uri="http://java.sun.com/jsf/facelets"%>
<%@taglib prefix="composite" uri="http://java.sun.com/jsf/composite"%>
Struts
<%@taglib prefix="html" uri="http://struts.apache.org/tags-html"%>
<%@taglib prefix="logic" uri="http://struts.apache.org/tags-logic"%>
<%@taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<%@taglib prefix="nested" uri="http://struts.apache.org/tags-nested"%>
<%@taglib prefix="tiles" uri="http://struts.apache.org/tags-tiles"%>
SAStruts
<%@taglib prefix="s" uri="http://sastruts.seasar.org"%>
<%@taglib prefix="f" uri="http://sastruts.seasar.org/functions"%>
★タグの使い分け
値を表示する場合、ELを使う
HTMLフォームの表示はStrutsのhtmlタグを使う
ループや分岐などは、JSTLのcタグとELを組み合わせる
>HTMLの各種タグ
s:form
s:link
html:submit(クライアントバリデーションを使う場合にs:submit)
html:text
html:radio
html:multibox
html:select
>リソースファイルの値の出力
<bean:message key="message.name" />
>日付の出力
Date型の場合
<fmt:formatDate value="${dateDay}" pattern="yyyy/MM/dd HH:mm:ss" />
String型の場合
<fmt:formatDate value="${f:date(stringDay, 'yyyy-MM-dd HH:mm:ss')} "pattern="yyyy/MM/dd HH:mm:ss" />
>数値の出力
数値型の場合
<fmt:formatNumber value="${numberId}" pattern="###,###" />
String型の場合
<fmt:formatNumber value="${f:number(stringId, '####'}" pattern="###,###" />
<fmt:formatNumber type="percent" value="${num}" />
<fmt:formatNumber type="number" value="${num}" pattern="#,##0.00" />
>値の出力
public class UserDto {
public String name
};
public class SampleForm {
public String id;
public UserDto userDto;
public List<UserDto> userList;
};
${f:h(id)} }
${f:h(userDto.name)
>ループ
<c:forEach var="user" varStatus="s" items="${userList}">
${f:h(user.name)}
${f:h(s.index)}<br />
</c:forEach>
<c:forEach var="i" begin-"0" end="5" varStatus="st">
...
</c:forEach>
varStatusのプロパティ
・index:0から始まるループ回数
・count:1から始まるループ回数
・current:カレント状態にあるオブジェクト
・first:ループ開始フラグ(最初だけtrue)
・last:ループ終了フラグ(最後だけtrue)
・begin
・end
・step
>条件判定
<c:if test="${id == 10}" >
${f:h(id)}
</c:if>
<c:if test="${empty userList}" >
データが0件です。
</c:if>
>条件分岐
<c:choose>
<c:when test="${empty userList}">
データが0件です。
</c:when>
<c:otherwise>
<c:forEach var="user" varStatus="s" items="${userList}">
${f:h(user.name)}<br />
</c:forEach>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${10 <= age}">...</c:when>
<c:when test="${0 <= age && age < 10}">...</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
>デリミタで文字列分割
<c:forTokens var="m" items="${strings}" delims=":">
<c:out value="${m}">
</c:forTokens>
>文字列関連
<c:if test="${fn:contains(msg, 'xxx')}">
<c:if test="${fn:containsIgnoreCase(msg, 'xxx')}">
<c:if test="${fn:startsWith(msg, 'xxx')}">
<c:if test="${fn:endsWith(msg, 'xxx')}">
...
</c:if>
<c:out value="${fn:escapeXml(msg)}" />
<c:out value="${fn:indexOf(msg, 'xxx')}" />
<c:out value="${fn:join(msgs, ',')}" />
<c:out value="${fn:length(msg)}" />
<c:out value="${fn:replace(msg, 'xxx', 'yyy')}" />
<c:out value="${fn:substring(msg, 1, 5)}" />
<c:out value="${fn:substringBefore(msg, '@')}" />
<c:out value="${fn:substringAfter(msg, '@')}" />
<c:out value="${fn:toLowerCase(msg)}" />
<c:out value="${fn:toUpperCase(msg)}" />
<c:out value="${fn:trim(msg)}" />
<c:set var="st" value="${fn:split(msgs, ',')}" />
<c:out value="${st[0]}"/>