- HttpServlet#doXXX()
- HttpResponseの文字コード
- HttpRequestヘッダの取得
- HttpRequest , HttpSession , ServletContext へのオブジェクトの格納・参照
- 主要なweb.xmlの要素
- web.xml の URL指定
- セキュリティ用語
- JSPシンタックス-XMLシンタックス
- pageディレクティブ
- <%@ include> , <jsp:include> , <c:import> , <%@ forward> , <jsp:forward> , <c:redirect>
- JSP暗黙オブジェクト,EL暗黙オブジェクト,EL予約語
- EL式を使えるところ使えないところ
- EL式でMapからの値の取り出し
- EL式で配列pからの値の取り出し
- EL式で文字列との大小比較
- EL式のempty演算子がtrueになるとき
- <jsp:useBean> type,class,beanName属性の組み合わせ
- <jsp:setProperty> の value,property属性
- <c:set>
- <c:out> の デフォルト値指定方法(2通り)
- <c:url>のパラメータ指定
- tagハンドラ継承関係
- tagハンドラのメソッドの返値
- tld
- タグファイル
- J2EEパターン問題のキーワード
- 無効化したSessionから属性を取得しようとすると・・・
- 本編
- 練習問題
HttpServlet?#doXXX() †
- javax.servlet.http.HttpServlet? の doXXX を overwrite
- protected void doGet( HttpServletRequest? req , HttpServletResponse? res ) throwns IOException
HttpResponse?の文字コード †
- response.setContentType?("text/html;charset=Windows-31J");
- response.getCharsetEncoding?();
- 存在せず
response.setCharsetEncoding?("Windows-31J");
HttpRequest?ヘッダの取得 †
Enumlation | getHeaderNames?() |
String | getHeader(header-name) |
int | getIntHeader?(header-name) |
long | getDateHeader?(header-name) |
Enumlation | getHeaders(header-name) |
HttpRequest? , HttpSession? , ServletContext? へのオブジェクトの格納・参照 †
void | setAttribute(String,Object) |
Object | getAttribute(String) |
Enumlation | getAttributeNames?() |
void | removeAttribute(String) |
- ServletConfig?にはオブジェクトの格納・参照はできない
主要なweb.xmlの要素 †
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
context-param * †
String HttpServlet.getServletContext().getInitParameter("param-name");
Enumlation HttpServlet.getServletContext().getInitParameterNames();
- param-name ◇
- param-value ◇
filter * †
filter-mapping * †
listener * †
ここに登録するもの
クラス | イベント |
ServletContextListener? | ServletContext?の生成・消滅時 |
ServletRequestListener? | ServletRequest?の生成・消滅時 |
HttpSessionListener? | HttpSession?の生成・消滅時 |
voidxxxxInitialized(ServletContextEvent event)
void xxxxDestroyed(ServletContextEvent event)|
クラス | イベント |
ServletContextAttributeListener? | ServletContext?の属性変更 |
ServletRequestAttributeListener? | ServletRequest?の属性変更 |
HttpSessionAttributeListener? | HttpSession?の属性変更 |
void attributeAdded(ServletContextAttributeEvent event)
void attributeRemoved(ServletContextAttributeEvent event)
void attributeReplaced(ServletContextAttributeEvent event)
ここに登録しないもの
クラス | イベント |
HttpSessionActivationListener? | これを実装したクラスが登録されているHttpSession?が、メモリ不足によりHDDに退避(WillPassivate?)/復活(DidActivate?)されるとき |
void sessionDidActivate(HttpSessionEvent event)
void sessionWillPassivate(HttpSessionEvent event)
クラス | イベント |
HttpSessionBindingListener? | これを実装したクラスがHttpSession?に登録・削除されるとき(HttpSession?のタイムアウトによる消滅時) |
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)
servlet * †
servlet-mapping * †
- servlet-name ◇
- url-pattern ◇
session-config * †
- session-timeout ?
セションタイムアウトまでの分数
void HttpSession?.setMaxInactiveInterval?(int) | セションタイムアウトまでの秒数を設定 |
int HttpSession?.getMaxInactiveInterval?() | セションタイムアウトまでの秒数を取得 |
void HttpSession?.invalidate() | セションタイムアウトを起こす |
boolean HttpSession?.isNew() | 新しいセッションか? |
mime-mapping * †
welcome-file-list * †
error-page * †
- error-code or exception-type ◇
- location ◇
jsp-config * †
<taglib>
<taglib-uri>/http://hondou.homedns.org/tags/snail.tld</taglib-uri>
<taglib-location>/WEB-INF/snail.tld</taglib-location>
</taglib>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<include-prelude>/header.jsp</include-prelude>
<include-coda>/footer.jsp<include-coda>
</jsp-property-group>
security-constraint * †
- web-resource-collection +
- url-pattern +
アクセス制限をかけるURLパターン
- auth-constraint ?
- role-name *
アクセスに必要なロール(権限)
- user-data-constraint ?
- transport-guarantee
NONE | 通信の保証は不要 |
INTEGRAL | 通信の完全性が必要(SSLに切り替える) |
CONFIDENTIAL | 通信の秘匿性が必要(SSLに切り替える) |
login-config * †
- auth-method ?
BASIC |
DIGEST |
FORM |
CLIENT_CERT |
- form-login-config ?
- form-login-page
j_username 、j_password を j_security_chekc に POST する
- form-error-page
security-role * †
この webアプリ で使うロールを列挙
web.xml の URL指定 †
セキュリティ用語 †
- 完全性(改竄されていないこと , デジタル署名)
- 機密性(認証を行う)
- 認証(ユーザID , パスワード)
- 悪意有るコード(コンピュータウイルス)
- バックドア
JSPシンタックス-XMLシンタックス †
JSP Syntax | XML 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> |
pageディレクティブ †
<%@ 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" %>
- 上記はデフォルト値
- 引っかけ : isELIgnored = EL式を無視するか? = デフォルト値は false
<%@ include> , <jsp:include> , <c:import> , <%@ forward> , <jsp:forward> , <c:redirect> †
- <%@ include>
<%@ include file="パス" %>
~~~~
- パス1:JSPからの相対パス
- パス2:ContextRoot??からの絶対パス
- 不可
- <%jsp:include>
<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>
${param.name}
${paramValues.tel[0]}
${paramValues.tel[1]}
<%= request.getParameter("name") %>
<%= request.getParameterValues("tel")[0] %>
<%= request.getParameterValues("tel")[1] %>
- <c:import> , <c:redirect>
<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>
- 比較
| <%@ include> | <jsp:include> | <c:import> |
JSP取り込み | ○ | ○ | ○ |
HTML取り込み | ○ | ○ | ○ |
Servlet取り込み | × | ○ | ○ |
パラメータ引き渡し | × | ○ | ○ |
別コンテキストの読み込み | × | × | ○* |
- <c:import url="/include.jsp" context="/OtherWar?">
JSP暗黙オブジェクト,EL暗黙オブジェクト,EL予約語 †
- JSPの暗黙オブジェクト
- page
- out
- config
- response
- pageContext
- request
- session
- application
- exception
error
- ELの暗黙オブジェクト
- pageScope
- requestScope
- sessionScope
- applicationScope
- param
- paramValues
- header
- headerValues
- cookie
- initParam
- pageContext
- pageContext.page
- pageContext.request
- pageContext.session
- pageContext.application
- pageContext.response
- pageContext.exception
- pageContext.out
- pageContext.config
- ELの予約語
- div
- mod
- eq
- ne
- lt
- gt
- le
- ge
- and
- or
- not
- true
- false
- null
- empty
- instanceof
EL式を使えるところ使えないところ †
場所 | 例 |
EL式を使えるところ |
テンプレートテキスト。 | <FONT COLOR="RED">本日${count}人目のお客様</FONT> |
ディレクティブの属性値 | <%@ page pageEncoding="${charset}" %> |
アクション(タグ)の属性値 | <snail:code value="${code}"/> |
EL式を使えないところ |
スクリプトレット | <% if(a=${count}){ |
宣言 | <%! int flag = ${count>10}; %> |
JSP式 | <%= ${count} %> |
EL式でMapからの値の取り出し †
- ${map.key}
- ${map["key"]
- ${map[`key`]
EL式で配列pからの値の取り出し †
- ${map[1]
- ${map["1"]
- ${map[`1`]
EL式で文字列との大小比較 †
- ${0<"5"}
- はOK 文字列は自動的に型変換される
EL式のempty演算子がtrueになるとき †
${empty null} | null |
${empty ""} | 空文字 |
${empty new ArrayList?()} | 空のCollection |
${empty new HashMap?()} | 空のMap |
${empty int[0]} | 要素数0の配列 |
<jsp:useBean> type,class,beanName属性の組み合わせ †
属性 | if scope.getAttribute("id")!=null | if scope.getAttribute("id")==null |
class | class id=scope.getAttribute("id") | type id=new class() |
type | type id=scope.getAttribute("id") | ERROR |
class+type | type id=scope.getAttribute("id") | type id=new class() |
type+beanName | type id=scope.getAttribute("beanName") | ERROR |
- 引っかけ : scope を省略すると page スコープを見に行く
→requestスコープに格納した myBean(com.foo.Bean型) を
<jsp:useBean id="myBean" type="com.foo.Bean"/>
のように呼び出すと 実行時エラー
<jsp:setProperty> の value,property属性 †
必須属性 | name | |
必須属性 | property | |
排他 | value | 即値、EL式の値を name.property に格納 |
param | HTTP REQUESTのパラメータを name.property に格納 |
(省略) | <jsp:setProperty name="myBean" property="*"> とすると、HTTP REQUEST を myBean に自動転記 |
<c:set> †
- スコープに直接格納するとき
必須 | 属性 | 値 |
○ | var | セットする文字列のスコープへの格納名 |
○ | value | 格納する文字列 |
| scope | page(デフォルト),request,session,application |
- スコープに格納されているMap/Beanの属性として格納するとき
必須 | 属性 | 値 |
○ | target | Bean / Map のスコープへの格納名 |
○ | property | セットする文字列の Bean / Map 内の属性名 |
○ | value | 格納する文字列 |
| scope | page(デフォルト),request,session,application |
<c:out> の デフォルト値指定方法(2通り) †
<c:out value="${val}">
val is null
</c:out>
<c:out value="${val}" defalut="val is null">
<c:url>のパラメータ指定 †
<c:url value="/graph.do">
<c:param name="xUnit" value="km"/>
<c:param name="yUnit" value="degC"/>
</c:url>
/graph.do?xUnit=km&yUnit=degC
tagハンドラ継承関係 †
tagハンドラのメソッドの返値 †
- TagSupport?
- int doStartTag?()
- SKIP_BODY
- EVAL_BODY_INCLUDE
- int doAfterBody?()
- SKIP_BODY
- EVAL_BODY_AGAIN
- int doEndTag?()
- BodyTagSupport?
- int doStartTag?()
- SKIP_BODY
- EVAL_BODY_INCLUDE
- EVAL_BODY_BUFFERED
- int doAfterBody?()
- SKIP_BODY
- EVAL_BODY_AGAIN
- int doEndTag?()
- SimpleTagSupport?
tld †
<?xml version="1.0" encoding="UTF-8"?><taglib>
taglib-version ◇ †
必須項目なことに注意
short-name ◇ †
必須項目なことに注意
tag * †
tag-file * †
function * †
- function-class
- function-signature
タグファイル †
- タグファイル定義
<%@ taglib tagdir="/WEB-INF/tags" prefix="myTF" %>
- タグライブラリ定義
<%@ taglib uri="/WEB-INF/tag.tld" prefix="myTag" %>
- タグファイルで使われるアクション(通常版)
<myTF:tfExam from="ドナ" to="DONA">
ドナ ドナ ドナ ドナ<br/>
悲しみをたたえ<br/>
ドナ ドナ ドナ ドナ<br/>
はかない命<br/>
</myTF:tfExam>
<%@ 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) %>
- タグファイルで使われるアクション(JSPフラグメント版)
<myTF:tfExam2>
<jsp:attribute name="from">ドナ</jsp:attribute>
<jsp:attribute name="to">DONA</jsp:attribute>
<jsp:body>
ドナ ドナ ドナ ドナ<br/>
悲しみをたたえ<br/>
ドナ ドナ ドナ ドナ<br/>
はかない命<br/>
</jsp:body>
</myTF:tfExam>
<%@ 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) %>
J2EEパターン問題のキーワード †
- Interceptiong Filter
- Front Controller
- Session Facade
- ネットワークオーバーヘッドの減少
- プレゼン層とビジネスロジックの疎結合
- 共通ロジックの局所化
- トランザクションの整合性
- Business Deligate
- サービス固有のコードをクライアントから隠蔽
- データのローカルキャッシング
- モックオブジェクトへの切り替えが容易
- トランザクションの透過的な再実行
- Service Locator
- 煩雑な処理を局所化
- アプリケーションのパフォーマンス向上(JNDI の look-up を毎回しない)
- DTO
無効化したSessionから属性を取得しようとすると・・・ †
IllegalStateException? が起きる
<%@ page contentType="text/html;charset=Windows-31J" %>
<html>
<head>
<title>Session Exam</title>
</head>
<body>
1.Sessionにkey属性を格納
<% session.setAttribute("key","val"); %>
<hr/>
2.Sessionのkey属性 =
<%= session.getAttribute("key") %>
<hr/>
3.Session無効化
<% session.invalidate(); %>
<hr/>
4.Sessionのkey属性 =
<%= session.getAttribute("key") %>
</body>
</html>
org.apache.jasper.JasperException: Exception in JSP: /SessionExam.jsp:26
23: <hr/>
24:
25: 4.Sessionのkey属性 =
26: <%= session.getAttribute("key") %>
27:
28: </body>
29:
原因
java.lang.IllegalStateException: getAttribute: セッションは既に無効化されています
org.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:1011)
org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:109)
org.apache.jsp.SessionExam_jsp._jspService(SessionExam_jsp.java:70)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
本編 †
練習問題 †
- Sun認定資格 Java認定資格(試験範囲・練習問題)
- 【連載 】【Java認定資格】SJC-WCに合格しよう
Java