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]}"/>