cf.

JSP 2.0

JSPの構造

テンプレートテキスト

  1. HTML / XML
  2. コメントの違いに注意
    <!-- XMLのコメント -->
    <%-- JSPのコメント -->
    <%// JSPのコメント(引っかけ問題) %>

ディレクティブ

page ディレクティブ

  1. 書式
    1. スペース区切りで複数の属性を記述してもよいし
       <%@ page buffer="128kb" autoFlash="false" %>
      
    2. 別のpageディレクティブにしてもよい
       <%@ page buffer="128kb" %>
       <%@ page autoFlash="false" %>
      
  2. 13種類
    1. JSPシンタックス(設定値はデフォルト値)
       <%@ page language="java" %>
       <%--
       <%@ page extends="" %>
       --%>
       <%@ page import="java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*" %>
       <%@ page session="true" %>
       <%@ page buffer="8kb" %>
       <%@ page autoFlash="true" %>
       <%@ page isThreadSafe="true" %>
       <%--
       <%@ page info="" %>
       --%>
       <%@ page isErrorPage="false" %>
       <%--
       <%@ page errorPage="" %>
       --%>
       <%@ page contentType="text/html;charset=ISO-8859-1" %>
       <%--
       <%@ page pageEncoding="contentTypeのcharset" %>
       --%>
       <%@ page isELIgnored="false" %>
      
    2. XMLシンタックス
       <jsp:directive.page language="java" />
       <!--
       <jsp:directive.page extends="" />
       -->
       <jsp:directive.page import="java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*" />
       <jsp:directive.page session="true" />
       <jsp:directive.page buffer="8kb" />
       <jsp:directive.page autoFlash="true" />
       <jsp:directive.page isThreadSafe="true" />
       <!--
       <jsp:directive.page info="" />
       -->
       <jsp:directive.page isErrorPage="false" />
       <!--
       <jsp:directive.page errorPage="" />
       -->
       <jsp:directive.page contentType="text/html;charset=ISO-8859-1" />
       <!--
       <jsp:directive.page pageEncoding="contentTypeのcharset" />
       -->
       <jsp:directive.page isELIgnored="false" />
      
  3. 属性の概略
    属性概略
    languageJSP2.0では"java"のみ
    extendsこのJSPからServletをプリコンパイルする際に継承するクラス
    importこのJSPで使うクラス。デフォルトでimportされている以外のクラスを使うときには <%@ page import="〜"%> にカンマ区切りで記述するか、<%@ page import="〜"%> を複数記述する
    session暗黙オブジェクト session を使えるようにする
    buffer,autoFlashHTMLを出力する際のバッファサイズ。autoFlash="false"にすると、バッファからあふれたとき ServletException? を起こす
    isThreadSafe?true固定推奨。このJSPはスレッドセーフに作られているか?
    info"Copyright (C) 1995-2006 KAGYUU CORPORATION, All Rights Reserved." など
    isErrorPage?暗黙オブジェクト exception を使えるようにする
    errorPageこのJSPで例外発生時に遷移するJSP。遷移先のJSPでは暗黙オブジェクト exception で発生した例外を参照可能
    contentType"text/html;charset=Windows31-J"など
    pageEncoding"Windows31-J"など
    isELIgnoredEL式を無視するか?

include ディレクティブ

  1. JSPからServletへのプリコンパイル時に静的に取り込まれる資産
    (つまりは、ServletのJavaコードに取り込まれる)
  2. 標準アクション <jsp:include> との違いに注意
  3. JSPシンタックス
    <%@ include file="パス" %>
  4. XMLシンタックス
    <jsp.directive.include file="パス" />

taglib ディレクティブ

  1. tag定義
  2. JSPシンタックス
    1. タグハンドラ
      <%@ taglib uri="TLDファイルのURI" prefix="JSP内で使われるタグ名" %>
      URI指定法
      JSPからの相対パスsnail.tld
      ContextRoot?からの相対パス/WEB-INF/snail.tld
      web.xmlで指定した論理URLhttp://hondou.homedns.org/tags/snail.tld
      /WEB-INF/lib に配置された Jarファイル内の /META-INF 以下にある tldファイル で指定した論理URLhttp://hondou.homedns.org/tags/snail.tld
    2. タグファイル
      <%@ taglib tagdir="/WEB-INF/tags" prefix="JSP内で使われるタグ名" %>
  3. XMLシンタックス
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
              xmlns:${JSP内で使われるタグ名}="${URI}"
              version="2.0>
    </jsp:root>

スクリプティング

スクリプトレット

  1. JSPシンタックス
    <% Javaコード %>
  2. XMLシンタックス
    <jsp:scriptlet>Javaコード</jsp:scriptlet>

宣言

  1. JSPからプリコンパイルされたServletのフィールド変数、メソッド宣言。
  2. JSPシンタックス
    <%! int count; %>
    <%! int sum(int a,int b){
          return a+b;
        }
    %>
  3. XMLシンタックス
    <jsp:declarations> フォールド変数宣言・メソッド宣言 </jsp:declarations>

JSP式

  1. 式の末尾に ; が付かないことに注意
  2. JSPシンタックス
    <%= count %>
  3. XMLシンタックス
    <jsp:expression> count </jsp:expression>

EL式

  1. 記述方法
    ${式}
  2. EL式を使えるところと使えないところ
    場所
    EL式を使えるところ
    テンプレートテキスト。<FONT COLOR="RED">本日${count}人目のお客様</FONT>
    ディレクティブの属性値<%@ page pageEncoding="${charset}" %>
    アクション(タグ)の属性値<snail:code value="${code}"/>
    EL式を使えないところ
    スクリプトレット <% if(a=${count}){
    宣言 <%! int flag = ${count>10}; %>
    JSP式 <%= ${count} %>
  3. 暗黙オブジェクト
    elObject.png
    • このJSPのソースは、ElObjectExam.jsp
    • このほかに pageContext オブジェクトがある。このオブジェクトの配下に、JSPの暗黙オブジェクトがある・・・はずだが、Tomcat5.5.17では上手く動かなかった。一応テストに出るのでまとめておくと
      1. ${pageContext.page.???}
      2. ${pageContext.request.???}
      3. ${pageContext.session.???}
      4. ${pageContext.application.???}
      5. ${pageContext.response.???}
      6. ${pageContext.exception.???}
      7. ${pageContext.out.???}
      8. ${pageContext.config.???}
  4. 演算子
    elOperator.png
  5. 予約語(変数名として使えない物) 16個
     1.div    2.mod 
     3.eq     4.ne    5.lt 6.gt 7.le 8.ge
     9.and   10.or   11.not 
    12.true 13.false
    14.null 15.emoty 16.instanceof
  6. ファンクション
    1. EL式からJavaクラスのメソッドを使うことが出来る
      package com.snail.sjcwc;
      
      public final class ELFunctionExam {
        public static int sum(final int a,final int b){
          return a+b;
        }
        public static java.lang.String cat(final java.lang.String a,final java.lang.String b) {
          return a + b;
        }
      }
      
      • public static で定義する
      • package 必須。デフォルトパッケージはダメ
    2. tldファイルに定義 (Java SJC-WC tld#function)
      <?xml version="1.0" encoding="UTF-8"?>
      <taglib 
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
        <tlib-version>2.0</tlib-version>
        <short-name>FunctionExample</short-name>
        <function>
          <name>sum</name>
          <function-class>com.snail.sjcwc.ELFunctionExam</function-class>
          <function-signature>
            int sum(int,int)
          </function-signature>
        </function>
        <function>
          <name>cat</name>
          <function-class>com.snail.sjcwc.ELFunctionExam</function-class>
          <function-signature>
            java.lang.String cat(java.lang.String,java.lang.String)
          </function-signature>
        </function>
      </taglib>
      
      • <function-singature> では、返値・引数は完全修飾名で記述する
    3. JSPでは、tldで定義した名前で使う
      <%@ page contentType="text/html;charset=Windows-31J" %>
      <%@ taglib uri="/WEB-INF/func.tld" prefix="myFunc" %>
      
      <head>
      <title>EL Function Example</title>
      </head>
      
      <body>
      
      <table border="1">
      <tr><td>SUM</td><td>${myFunc:sum(1,2)}</td></tr>
      <tr><td>CAT</td><td>${myFunc:cat("ねこ","ねころんだ")}</td></tr>
      </table>
      
      </body>
      
      </head>
      
    4. 実行結果
      elFunc.png

アクション

tagDiagram.png

クラシックタグハンドラ

  1. 解析対象のJSP
    .織杏床疏阿JSP
    
    <my:exTag attr="3">    <%-- 開始タグを◆属性をと呼ぶことにする --%>
    
     BODY
    
    </my:exTag>            <%-- 終了タグをイ箸垢 --%>
    
    残りのJSP
  2. タグによるJSP処理フロー
    tagFlowChart.png
  3. まずは属性を読み取るだけのタグハンドラ
    tagAttr.png
    1. JSP(TagAttribute)
    2. タグハンドラ(TagAttribute)
    3. TLD(tag.tld)
  4. スクリプティング変数と EVAL_BODY_AGAIN 使うタグハンドラ
    tagScripting.png
    1. JSP(TagIteration)
    2. タグハンドラ(TagIteration)
    3. TLD(tag.tld)
  5. タグボディの読み取り
    tagBody.png
    • java.servlet.jsp.tagext.BodyContent? extends JSPWriter
      メソッド機能
      voidcleanBody()Bodyをクリア
      JSPWritergetEnclosingWriter?()JSPWriterを取得
      ReadergetReader()Bodyの内容を出力するReaderを取得
      StringgetString()Bodyの内容をStringとして取得
      voidwriteOut(Write out)outに、Bodyの内容を出力
    • doAfterBody?() で、pageContext.getOut():JSPWriter に書き込んだ内容は、HTMLではなく bodyContent に格納されるようだ
      • [[The tag body is " あいうえお ".]] の部分
    • doEndTag?() で、pageContext.getOut():JSPWriter に書き込んだ内容は、HTMLに出力される
      • タグボディは「 あいうえお [[The tag body is " あいうえお ".]]」でした の部分
    1. JSP(TagBody)
    2. タグハンドラ(TagBody)
    3. TLD(tag.tld)
  6. JSPフラグメント
    tagFragment.png
    • JSP上で特殊な記述方法をするタグ
      <myTag:fragmentExam>
       <jsp:attribute name="attr">
         属性値です
       </jsp:attribute>
       <jsp:body>
         タグBODY (&lt;jsp:body&gt;タグを使う!!)
       </jsp:body>
      </myTag:fragmentExam>
      • <jsp:attribute name="****"> にタグ属性を記述する
      • <jsp:body> にタグBODYを記述する (引っかけ問題に注意)
    1. JSP(JSPFragment#jsp)
    2. タグハンドラ(JSPFragment#java)
      public class FragmentExam extends BodyTagSupport {
      
         private JspFragment attr = null;
      
         public void setAttr(JspFragment param) { attr = param; }
         public JspFragment getAttr() { return attr; }
      
         public int doStartTag() throws JspException {
             // JspFragment#invoke(Write out)で、HTMLにJSPフラグメント
             // を出力。何回でも呼び出せる
             getAttr().invoke(getAttr().getJspContext().getOut());
                 
             // null を指定しても上記と同じ
             getAttr().invoke(null);
             return EVAL_BODY_BUFFERED;
         }
      …
      • タグハンドラのフィールドに JspFragment? 型の変数を用意する(ここにタグ属性が格納される)
      • JspFragment? を HTML に出力するときには invoke() メソッドを使う。
    3. TLD(tag.tld)
  7. 親タグの読み取り
    tagParent.png
    • 次のJSPを解釈
      <myTag:grandFather>
        <myTag:father>
          <myTag:child>
          </myTag:child>
        </myTag:father>
      </myTag:grandFather>
    • javax.servlet.jsp.tagext.TagSupport?
      メソッド機能
      TaggetParent()親タグのタグハンドラを取得する。無い場合はnull
      TaggetAncestorWithClass?(Tag from, Class klass)外側にあるすべてのタグの中から klassタグハンドラ を取得する。無い場合はnull
    1. JSP(ParentTag)
    2. タグハンドラ(ParentTag)
    3. TLD(tag.tld)

シンプルタグハンドラ

simpleTag.png

タグファイル

  1. タグをJSPと同じ構文のタグファイルで定義することも出来る
  2. 設置場所
    tagFile.png
    1. [Context Root]-[WEB-INF]-[tags] 以下(サブディレクトリも可なことに注意)
    2. [Context Root]-[lib] に格納されている JARファイルの [META-INF]-[tags] 以下(サブディレクトリも可なことに注意)
    3. 拡張子は .tag または .tagx
  3. 実装例
    tagFileScreeshot.png
    • タグBODYの内容について、タグ属性fromをtoに全置換するアクションをタグファイルで実装
    1. tfExam.jsp
      <%@ page contentType="text/html;charset=Windows-31J" %>
      <%@ taglib tagdir="/WEB-INF/tags" prefix="myTF" %>
      
      <html>
      <head>
      <title>Tag File Example</title>
      </head>
      
      <body>
      
      BEFORE TAG
      
      <hr/>
      
      <myTF:tfExam from="ドナ" to="DONA">
      ある晴れた 昼さがり<br/>
      市場へ つづく道<br/>
      荷馬車が ゴトゴト<br/>
      子牛を 乗せてゆく<br/>
      何も知らない 子牛さえ<br/>
      売られてゆくのが<br/>
      わかるのだろうか<br/>
      ドナ ドナ ドナ ドナ<br/>
      悲しみをたたえ<br/>
      ドナ ドナ ドナ ドナ<br/>
      はかない命<br/>
      </myTF:tfExam>
      
      <hr/>
      
      AFTER TAG
      
      </body>
      
      </html>
      
      • JSPの方は通常と同じ
    2. tfExam.tag
      <%@ tag body-content="scriptless" %>
      <%@ attribute name="from" required="true" fragment="false"%>
      <%@ attribute name="to" required="true" fragment="false"%>
      
      <jsp:doBody var="bodyString" scope="request"/>
      
      <%= ((String)request.getAttribute("bodyString")).replaceAll(from,to) %>
      
      • tagディレクティブ、attributeディレクティブで、tldファイルに定義した内容を定義
      • タグBODYは、<jsp:dobody>タグでスコープに格納する
      • タグ属性は、このタグファイルからプリコンパイルされたJavaクラス(タグクラス)のインスタンス変数に格納される
  4. 実装例(JSPフラグメント版)
    1. tfExam2.jsp
      <%@ page contentType="text/html;charset=Windows-31J" %>
      <%@ taglib tagdir="/WEB-INF/tags" prefix="myTF" %>
      
      <html>
      <head>
      <title>Tag File Example</title>
      </head>
      
      <body>
      
      BEFORE TAG
      
      <hr/>
      
      <myTF:tfExam2>
        <jsp:attribute name="from">ドナ</jsp:attribute>
        <jsp:attribute name="to">DONA</jsp:attribute>
        <jsp:body>
      ある晴れた 昼さがり<br/>
      市場へ つづく道<br/>
      荷馬車が ゴトゴト<br/>
      子牛を 乗せてゆく<br/>
      何も知らない 子牛さえ<br/>
      売られてゆくのが<br/>
      わかるのだろうか<br/>
      ドナ ドナ ドナ ドナ<br/>
      悲しみをたたえ<br/>
      ドナ ドナ ドナ ドナ<br/>
      はかない命<br/>
        </jsp:body>
      </myTF:tfExam2>
      
      <hr/>
      
      AFTER TAG
      
      </body>
      
      </html>
      
      • JSPの方は通常と同じ
    2. tfExam2.tag
      <%@ tag body-content="scriptless" %>
      <%@ attribute name="from" required="true" fragment="true" %>
      <%@ attribute name="to" required="true" fragment="true" %>
      
      <jsp:doBody var="bodyKey" scope="request"/>
      <jsp:invoke fragment="from" var="fromKey" scope="request"/>
      <jsp:invoke fragment="to" var="toKey" scope="request"/>
      
      <% 
        String bodyValue = (String)request.getAttribute("bodyKey");
        String fromValue = (String)request.getAttribute("fromKey");
        String toValue   = (String)request.getAttribute("toKey");
      %>
      <%= bodyValue.replaceAll(fromValue,toValue) %>
      
      • JSPフラグメント(タグ属性)は、<jsp:invoke>タグでスコープに格納する
  5. タグファイルで使われるアクションの整理
    1. <jsp:dobody>
      属性説明値(○デフォルト値)
      scopeタグBODYの内容をどのスコープに格納するか?○page, request, session, application
      varタグBODYの内容をString型で格納する場合のキー値
      varReaderタグBODYの内容をReader型で格納する場合のキー値
    2. <jsp:invoke>
      属性説明値(○デフォルト値)
      scopeタグ属性の内容をどのスコープに格納するか?○page, request, session, application
      fragmentタグ属性名(JSPフラグメント名)
      varタグ属性の内容をString型で格納する場合のキー値
      varReaderタグ属性の内容をReader型で格納する場合のキー値
  6. タグファイルで使われるディレクティブの整理
    1. tagディレクティブ
      JSPシンタックスXMLシンタックス
      <%@ tag display-name="" %><jsp.directive.tag display-name="" >
      <%@ tag body-content="" %><jsp.directive.tag body-content="" >
      <%@ tag dynamic-attributes="true/false" %><jsp.directive.tag dynamic-attributes="" >
      <%@ tag small-icon="" %><jsp.directive.tag small-icon="" >
      <%@ tag large-icon="" %><jsp.directive.tag large-icon="" >
      <%@ tag description="" %><jsp.directive.tag description="" >
      <%@ tag example="" %><jsp.directive.tag example="" >
      <%@ tag language="java" %><jsp.directive.tag language="" >
      <%@ tag import="" %><jsp.directive.tag import="" >
      <%@ tag pageEncoding="" %><jsp.directive.tag pageEncoding="" >
      <%@ tag isELIgnored="true/false" %><jsp.directive.tag isELIgnored="" >
    2. attributeディレクティブ
      JSPシンタックスXMLシンタックス
      <%@ tag name="" %><jsp.directive.tag name="" >
      <%@ tag requreid="true/false" %><jsp.directive.tag requreid="" >
      <%@ tag fragment="true/false" %><jsp.directive.tag fragment="" >
      <%@ tag rtexprvalue="true/false" %><jsp.directive.tag rtexprvalue="" >
      <%@ tag type="java.lang.String" %><jsp.directive.tag type="" >
      <%@ tag description="" %><jsp.directive.tag description="" >
    3. variableディレクティブ
      JSPシンタックスXMLシンタックス
      <%@ tag name-given="" %><jsp.directive.tag ="" >
      <%@ tag name-from-attribute="" %><jsp.directive.tag ="" >
      <%@ tag alias="" %><jsp.directive.tag ="" >
      <%@ tag variable-class="" %><jsp.directive.tag ="" >
      <%@ tag declare="true/false" %><jsp.directive.tag ="" >
      <%@ tag scope="AT_BEGIN,AT_END,NESTED" %><jsp.directive.tag ="" >
      <%@ tag description="" %><jsp.directive.tag ="" >
  7. includeディレクティブ
  8. taglibディレクティブ

JSPの実装

JSPのライフサイクル

jspLifeCycle.png

JSPの変数スコープと暗黙オブジェクト

暗黙オブジェクトスコープ
pageObjectpageこのJSP(からプリコンパイルされたサーブレット)自身
outJspWriter?pageJspContext?#getOut()
configServletConrig?pagePageContext?#getServletConfig?()
responseServletResponse?page_XXX#_jspService(req,res)
pageContextPageContext?pageJava SJC-WC#scope参照
requestServletRequest?requestJava SJC-WC#scope参照。_XXX#_jspService(req,res)
sessionHttpSession?sessionJava SJC-WC#scope参照。pageディレクティブのsession属性をtrueにする必要がある(デフォルト true)
applicationServletContext?applicationJava SJC-WC#scope参照
exceptionThrowablepageJava SJC-WC#scope参照。pageディレクティブのisErrorPage属性をtrueにする必要がある(デフォルト false)

JSP Config (web.xml)

標準アクション

Bean 操作

  1. <jsp:useBean>
    • サーブレットの内部変数id に、scopeに格納されているオブジェクトを読み出す
    • 属性
      必須属性説明
      id名前
      class完全修飾クラス名
      typeAbstractクラス名、インタフェース名
      beanNameオブジェクト名
      scopepage(デフォルト値)、request、session、application
    • 属性の組み合わせ
      属性if scope.getAttribute("id")!=nullif scope.getAttribute("id")==null
      classclass id=scope.getAttribute("id")type id=new class()
      typetype id=scope.getAttribute("id")ERROR
      class+typetype id=scope.getAttribute("id")type id=new class()
      type+beanNametype id=scope.getAttribute("beanName")ERROR
  2. <jsp:setProperty>
    • nameオブジェクトに、値を書き込む
    • 属性
      必須属性説明
      name名前 (+<jsp:useBean> の id)
      property値を書き込む name 内のフィールド名
      value書き込む値(即値)
      param書き込む値(HTTP REQUEST のパラメータ名)
    • HTTP REQUEST の自動全転記
      <jsp:setProperty name="xxxBean" property="*"/>
       
      • こんなことが起きる
        for each paramName in HTTP-REQUEST
        {
          if( xxxBean には、"paramName" というフィールドがある ){
            xxxBean.setParamName( HTTP-REQUEST.getParamName() );
          }
        }
  3. <jsp:getProperty>
    • nameオブジェクトから、値を読み込み、JSPWriterに出力する
    • 属性
      必須属性説明
      name名前 (+<jsp:useBean> の id)
      property読み込む name 内のフィールドの名前

Include / Forward

  1. <jsp: include>
    • JSP実行時に、他のJSPを取り込む
      <%@ include><jsp:include>
      概要JSPプリコンパイル時に取り込み実行時に取り込み
      JSP取り込み
      HTML取り込み
      Servlet取り込み×
      パラメータ引き渡し×
    • 属性
      必須属性説明
      page取り込む資産のURL
      flushfalse(デフォルト)/true
    • 実装例
      include.png
      • IncludeExam?.jsp
        <%@ page contentType="text/html;charset=Windows-31J" %>
        
        <html>
        
        <head>
        <title>JSP Include Example</title>
        </head>
        
        <body>
        
        ▽親JSP開始▽
        
        <hr/>
        
        <jsp:include page="/include.jsp" flush="true">
          <jsp:param name="name" value="Taro"/>
          <jsp:param name="tel" value="03-xxxx-xxxx"/>
          <jsp:param name="tel" value="090-yyyy-yyyy"/>
        </jsp:include>
        
        <hr/>
        
        △親JSP終了△
        
        </body>
        
        </html>
        
      • include.jsp
        <%@ page contentType="text/html;charset=Windows-31J" %>
        --▽子JSP開始▽--
        <hr/>
        
        <table>
        <tr>
          <td>${param.name}</td>
          <td>=</td>
          <td>${param.name}</td>
        </tr>
        <tr>
          <td>${paramValues.tel[0]}</td>
          <td>=</td>
          <td>${paramValues.tel[0]}</td>
        </tr>
        <tr>
          <td>${paramValues.tel[1]}</td>
          <td>=</td>
          <td>${paramValues.tel[1]}</td>
        </tr>
        <tr>
          <td><%= request.getParameter("name") %></td>
          <td>=</td>
          <td><%= request.getParameter("name") %></td>
        </tr>
        <tr>
          <td><%= request.getParameterValues("tel")[0] %></td>
          <td>=</td>
          <td><%= request.getParameterValues("tel")[0] %></td>
        </tr>
        <tr>
          <td><%= request.getParameterValues("tel")[1] %></td>
          <td>=</td>
          <td><%= request.getParameterValues("tel")[1] %></td>
        </tr>
        
        </table>
        
        <hr/>
        --△子JSP終了△--
        
        <html> は不要
  2. <jsp: fowrard>
    • JSP実行時に、他のJSPに差し替える
    • 属性
      必須属性説明
      page取り込む資産のURL
      flushfalse(デフォルト)/true
    • 実装例
      forward.png
      • ForwardExam?.jsp
        <%@ page contentType="text/html;charset=Windows-31J" %>
        
        <html>
        
        <head>
        <title>JSP Forward Example(Parent)</title>
        </head>
        
        <body>
        
        ▽親JSP開始▽
        
        <hr/>
        
        <jsp:forward page="/forward.jsp">
          <jsp:param name="name" value="Taro"/>
          <jsp:param name="tel" value="03-xxxx-xxxx"/>
          <jsp:param name="tel" value="090-yyyy-yyyy"/>
        </jsp:forward>
        
        <hr/>
        
        △親JSP終了△
        
        </body>
        
        </html>
        
      • forward.jsp
        <%@ page contentType="text/html;charset=Windows-31J" %>
        
        <html>
        
        <head>
        <title>JSP Forward Example(Child)</title>
        </head>
        
        <body>
        
        --▽子JSP開始▽--
        <hr/>
        
        <table>
        <tr>
          <td>${param.name}</td>
          <td>=</td>
          <td>${param.name}</td>
        </tr>
        <tr>
          <td>${paramValues.tel[0]}</td>
          <td>=</td>
          <td>${paramValues.tel[0]}</td>
        </tr>
        <tr>
          <td>${paramValues.tel[1]}</td>
          <td>=</td>
          <td>${paramValues.tel[1]}</td>
        </tr>
        <tr>
          <td><%= request.getParameter("name") %></td>
          <td>=</td>
          <td><%= request.getParameter("name") %></td>
        </tr>
        <tr>
          <td><%= request.getParameterValues("tel")[0] %></td>
          <td>=</td>
          <td><%= request.getParameterValues("tel")[0] %></td>
        </tr>
        <tr>
          <td><%= request.getParameterValues("tel")[1] %></td>
          <td>=</td>
          <td><%= request.getParameterValues("tel")[1] %></td>
        </tr>
        
        </table>
        
        <hr/>
        --△子JSP終了△--
        
        </body>
        
        </html>
        
        <html> が必要

Applet

<jsp:plugin 
	type="bean|applet"  
	code="classFileName"  
	codebase="classFileDirectoryName"
	[ name="instanceName" ]
	[ archive="URIToArchive, ..." ] 
	[ align="bottom|top|middle|left|right" ]
	[ height="displayPixels" ]
	[ width="displayPixels" ]  
	[ hspace="leftRightPixels" ]
	[ vspace="topBottomPixels" ]
	[ jreversion="JREVersionNumber | 1.1" ]
	[ nspluginurl="URLToPlugin" ]
	[ iepluginurl="URLToPlugin" ] >

	[ <jsp:params>
		[ <jsp:param name="parameterName"  value="parameterValue" /> ]+
	</jsp:params> ]

	[ <jsp:fallback> text message for user </jsp:fallback> ]

</jsp:plugin>

tagファイル

  1. <jsp:invoke>
  2. <jsp:doBody>

XMLシンタックス

JSP SyntaxXML Syntax
<%-- ... --%><!-- ... -->
<%! ... %><jsp:declaration> ... </jsp:declaration>
<%@ include ... /><jsp:directive.include ... />
<%@ page ... /><jsp:dicectiove.page ... />
<%@ taglib uri="yyy" prefix="xxx" /><html xmlns:xxx="yyy"/> = <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:xxx="yyy" version="2.0>
<%= ... %><jsp:expression> ... </jsp:expression>
<% ... %><jsp:scriptlet> ... </jsp:scriptlet>
Template Data<jsp:text> ... </jsp:text>

XHTML

  1. JSP
    <?xml version="1.0" encoding="Windows-31J" ?>
    <jsp:root
      xmlns:jsp="http://java.sun.com/JSP/Page"
      version="2.0">
      
      <jsp:output
        omit-xml-declaration="false"
        doctype-root-element="html"
        doctype-public="-//W3C//DTD XHTML Basic 1.0//EN"
        doctype-system="http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd" />
        
      <jsp:element name="sector">
        <jsp:attribute name="name">accounting</jsp:attribute>
        <jsp:body>
          <jsp:element name="employee">
            <jsp:attribute name="name">Taro</jsp:attribute>
            <jsp:body>A-Class</jsp:body>
          </jsp:element>
          <jsp:element name="employee">
            <jsp:attribute name="name">Jiro</jsp:attribute>
            <jsp:body>B-Class</jsp:body>
          </jsp:element>
          <jsp:element name="employee">
            <jsp:attribute name="name">Sabro</jsp:attribute>
            <jsp:body>C-Class</jsp:body>
          </jsp:element>
        </jsp:body>
      </jsp:element>
    </jsp:root>
    
  2. 出力
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
    <sector name="accounting">
      <employee name="Taro">A-Class</employee>
      <employee name="Jiro">B-Class</employee>
      <employee name="Sabro">C-Class</employee>
    </sector>
    
     
    <jsp:output omit-xml-declaration="xxx"><?xml version="1.0" encoding="UTF-8"?>の出力
    true or on (デフォルト値)出力されない
    false of off出力される

JSTL

core

  1. taglib宣言
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  2. set,out,remove
    JSTL.png
    • ソースコード
    • setタグはスコープに文字列を格納する
      • スコープに直接格納するとき
        必須属性
        varセットする文字列のスコープへの格納名
        value格納する文字列
        scopepage(デフォルト),request,session,application
      • スコープに格納されているMap/Beanの属性として格納するとき
        必須属性
        targetBean / Map のスコープへの格納名
        propertyセットする文字列の Bean / Map 内の属性名
        value格納する文字列
        scopepage(デフォルト),request,session,application
    • removeタグはスコープからオブジェクトを削除する
      必須属性
      var削除するオブジェクトのスコープへの格納名
      scopepage(デフォルト),request,session,application
  3. if,forEach
    JSTL2.png
    ※[1,2,1,2,1,2]はLinkedList?
    • ソースコード
    • c:forEachのitemに指定できるオブジェクト
      1. java.util.Collection (サンプル)
      2. java.util.Map
      3. java.util.Iterater
      4. java.util.Enumlation
      5. 配列
      6. カンマ区切りの文字列
      7. java.servlet.jsp.jstl.sql.Result
    • c:if
      <c:if test="${item % 2 == 0}">
        <c:out value="${item} は、偶数"/>
      </c:if>
    • testの評価結果を格納したいときには以下のようにする
      <c:if test="${item % 2 == 0}" var="isOdd" scope="request">
        <c:out value="${item} は、偶数"/>
      </c:if>
      (scope="page(デフォルト値) | request | session | application")
  4. forTokens,choose,when,otherwise
    JSTL3.png
    • ソースコード
    • c:forToken では、文字列を delims で区切る
    • c:choose
      <c:choose>
        <c:when test="<%= ((String)pageContext.getAttribute("item")).endsWith("子") %>">
          female
        </c:when>
        <c:when test="<%= ((String)pageContext.getAttribute("item")).endsWith("郎") %>">
          male
        </c:when>
        <c:otherwise>
          unknown
        </c:otherwise>
      </c:choose>
      
  5. url
    • JSP
      <c:url value="/index.jsp"/>
    • 出力
      /SJCWC/index.jsp;jsessionid=1150DFC40563F6A89063760161236CC0
    • 相対アドレス→絶対アドレス
    • sessionidの付加
  6. catch,import,redirect,param
    <c:catch var="exp">
      <c:import url="/include.jsp">
        <c:param name="name" value="Taro"/>
        <c:param name="tel" value="03-xxxx-xxxx"/>
        <c:param name="tel" value="090-yyyy-yyyy"/>
      </c:import>
    </c:catch>
    
    <c:if test="${not empty exp}">
      <c:redirect url="/error.jsp" context="exp">
        <c:param name="name" value="Taro"/>
      </c:redirect>
    </c:if>
    
    • c:catch エラーの検出
    • c:import
      • jsp:includeと同じ
      • url属性(jsp:includeではpage属性) は、c:url と同様にsessionidが付加される
      • c:param で、取り込むJSPにパラメータを渡すことができる
    • c:redirect
      • jsp:forwardと同じ
      • url属性(jsp:forwardではpage属性) は、c:url と同様にsessionidが付加される
      • jsp:forward と違い、コンテナ外の URL を指定することも出来る
      • contextに、exception を設定できる
      • c:param で、転送先JSPにパラメータを渡すことができる

sql

  1. taglib宣言
    <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  2. data source の定義
    • JDBC定義 Java SJC-WC web.xml#resource-ref
    • sqlタグからの参照定義 Java SJC-WC web.xml#context-param
      <context-param>
        <param-name>javax.servlet.jsp.jstl.sql.DataSource</param-name>
        <param-value>jdbc/TestDB</param-value>
      </context-param>
      
    • sqlタグからの参照定義 JSP内に記述
      <sql:setDataSource dataSource="jdbc/TestDB">
      
      • var属性・scope属性を利用すると、JSP中で複数のデータソースを使うことが出来る
  3. select
    <sql:query var="queryResult"
      sql="SELECT * FROM ORDER_TABLE WHERE CUSTOMER_ID=? ORDER BY ORDER_DATE">
      <sql:param value="${id}"/>
    </sql:query>
    
    <c:forEach var="row" items="${queryResult.rows}>
      <c:out value="${row.order_date}/>
      <c:out value="${row.customer_id}/>
      <c:out value="${row.status}/>
      <br/>
    </c:forEach>
    
    • ページ制御
       <sql:query var="queryResult" startRow="${start}" maxRows="50">
         ...
       </sql:query>
       <a href="<c:url url="/sql.jsp?start=${start-50}>前の50件</a>
         
       <a href="<c:url url="/sql.jsp?start=${start+50}>次の50件</a>
      
    • 結果セットに含まれる属性
      属性説明
      queryResult.rows検索セット(SortedMap?形式)
      queryResult.rowsByIndex?検索セット(配列形式)
      queryResult.columnNames列名
      queryResult.rowCount結果セットの行数
      queryResult.limitedByMaxRows?次ページがあるか?(検索結果の行数がmaxRowに達しているか?)
  4. update / insert / delete
    <sql:transaction>
      <sql:update
        sql="UPDATE ORDER_TBLE SET STATUS=? WHERE ORDER_ID=?">
        <sql:param value="${stat}"/>
        <sql:param value="${id}"/>
      <sql:update>
      <sql:query
        sql="DELETE LOCK_TBLE WHERE LOCK_ID=?">
        <sql:param value="${lock}"/>
      <sql:update>
    </sql:transaction>
    

format

  1. taglib宣言
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
  2. デフォルトロケールの設定 Java SJC-WC web.xml#context-param
    <context-param>
      <!-- デフォルト ロケール -->
      <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
      <param-value>ja</param-value>
      <!-- 指定されたロケールのファイルが存在しない時に使うロケール -->  
      <param-name>javax.servlet.jsp.jstl.fmt.fallBackLocale</param-name>
      <param-value>ja</param-value>
    </context-param>
    
  3. ロケールの設定
    <fmt:setLocale value="jp"/>
    • HTTP HEADER の Accept-Language を上書き
    • 通常は使わなくてよい
  4. HTTP REQUESTのエンコーディング
    <fmt:requestEncoding value="UTF-8"/>
    • 通常はフィルタをかます
    • J2EEコンテナがエンコーディングしてから、JSP/Servlet に制御を移す実装になっている場合もある(余計なことするな!!)
  5. メッセージファイルの利用
    <fmt:setBundle basename="resources/application" var="msg" />
    <fmt:message key="err.msg1" bundle="${msg}/>
    
    • ロケールにより出力ファイルの内容が違う
    • jpの場合、resources/application_jp.properties の次の行が使われる
      err.msg1=make: *** ターゲット `gril-friend' を make するルールがありません。中止。
    • enの場合、resources/application_en.properties の次の行が使われる
      err.msg1=make: *** No rule to make target `gril-friend'.  Stop.

xml

  1. taglib宣言
    <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
  2. x:transform
    • XSLTの適用
  3. x:parse
    • DOMへの格納
  4. x:out
    • x:parse で取得した DOM オブジェクトから、XPathで指定した要素のを抜き出して出力

参考文献

  1. JSR-000152 JavaTM JSP 2.0 仕様書, http://jcp.org/en/jsr/detail?id=152 (こちらを主に勉強)
  2. SUN教科書 Webコンポーネントデベロッパ(SJC-WC 310-81),翔栄社,米山学,2006 (補足資料、練習問題)
    AMAZON
  3. JSR-000052 JSP Standard Tag Library 仕様書, http://jcp.org/en/jsr/detail?id=52
  4. 10日でおぼえるJakarta入門教室, 翔泳社, 山田祥寛, 2003
    AMAZON
  5. JSTL入門: 式言語, IBM Developer Works, Mark A. Kolb(IBM), 2003, http://www-06.ibm.com/jp/developerworks/java/030411/j_j-jstl0211.shtml
  6. JSTL入門: 核心(core)に触れる, Mark A. Kolb(IBM), 2003, http://www-06.ibm.com/jp/developerworks/java/030516/j_j-jstl0318.shtml
  7. JSTL入門: プレゼンテーションがすべて, IBM Developer Works, Mark A. Kolb(IBM), 2003, http://www-06.ibm.com/jp/developerworks/java/030620/j_j-jstl0415.shtml
  8. JSTL入門 第4回:SQLおよびXMLコンテンツへのアクセス, IBM Developer Works, Mark A. Kolb(IBM), 2003, http://www-06.ibm.com/jp/developerworks/java/030718/j_j-jstl0520.shtml

Java


添付ファイル: fileelObject.png 709件 [詳細] filetagFile.png 686件 [詳細] fileinclude.png 684件 [詳細] filesimpleTag.png 666件 [詳細] filetagFlowChart.png 819件 [詳細] filetagScripting.png 632件 [詳細] fileJSTL3.png 656件 [詳細] filetagAttr.png 603件 [詳細] filetagFileScreeshot.png 656件 [詳細] filejspLifeCycle.png 740件 [詳細] filetagParent.png 837件 [詳細] filetagFragment.png 724件 [詳細] fileforward.png 656件 [詳細] fileelOperator.png 585件 [詳細] filetagBody.png 651件 [詳細] fileJSTL.png 626件 [詳細] fileJSTL2.png 566件 [詳細] fileelFunc.png 629件 [詳細] filetagDiagram.png 618件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2007-01-21 (日) 18:33:56 (3610d)
ISBN10
ISBN13
9784061426061