Eclipse3.3やyuiにも対応している
web.xml : デプロイメントディスクリプター、配備記述子、DDファイルとも呼ばれる。
<?xml version="1.0" encoding="Shift_JIS"?>
<web-app 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
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Sample</display-name>
<!-- 全てのサーブレットで利用可能な初期化パラメータ -->
<context-param>
<description>パラメータの説明</description>
<param-name>any</param-name>
<param-value>1</param-value>
</context-param>
<!-- リスナー設定 -->
<listener>
<listener-class>sample.SampleListener</listener-class>
</listener>
<!-- フィルター設定 -->
<filter>
<filter-name>sampleFilter</filter-name>
<filter-class>sample.SampleFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>sampleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- サーブレット設定 -->
<servlet>
<servlet-name>sampleServlet</servlet-name>
<servlet-class>sample.SampleServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/config/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>any</param-name>
<param-value>1</param-value>
</init-param>
<!-- この属性があればコンテナ起動時に自動的にインスタンス化される -->
<!-- 初回リクエストでインスタンス化されるサーブレットよりもパフォーマンスが向上する -->
<!-- 指定できるのは0以上の整数値で、小さいものから順番にロードされる -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sampleServlet</servlet-name>
<url-pattern>/sample</url-pattern>
<!-- <url-pattern>*.do</url-pattern> -->
<!-- <url-pattern>/*</url-pattern> -->
</servlet-mapping>
<!-- セッションタイムアウト設定 (分単位で設定。0以下は無期限になる。)-->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<!-- ウェルカムページ設定 (上から順に評価される) -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- タグライブラリ設定 (例としてStrutsタグ) -->
<jsp-config>
<taglib>
<taglib-uri>/tags/struts-html</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
</taglib>
</jsp-config>
<!-- エラー設定 (exception-type と error-code 属性はどちらか記述) -->
<error-page>
<exception-type>java.sql.SQLException</exception-type>
<!-- <error-code>500</error-code> -->
<location>/error.html</location>
</error-page>
<!-- MIMEタイプ設定 (リクエストされた静的コンテンツに対して、Content-TypeヘッダーのMIMEタイプを設定する)-->
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
<!-- <extension>txt</extension> -->
<!-- <mime-type>text/plain</mime-type> -->
</mime-mapping>
</web-app>
例えば、ソースの中に利用する固有のクラス名が書かれていると、
そのクラスと切り離して再利用することができなくなってしまう。
もちろんソースを書き換えて、クラス名を変更することはできるが、
ここでいう「部品として再利用」ではソースを書き換えることは考えない。
手元にあるのがクラスファイル(.class)だけでもそのクラスを再利用できるかが大事で、
ソースファイル(.java)がなくても再利用できるかがポイントである。
密に結合しなければならないクラスの名前がソース中に書かれるのは当然であり問題ではないが、
部品として独立させなければならないクラスの名前がソース中に書かれていることは問題である。
(結城 浩 著 デザインパターン入門より)
public void outputZip(HttpServletResponse response) {
response.setHeader("Content-Disposition","attachment; filename=sample.zip");
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(response.getOutputStream());
// 圧縮レベルの設定
zos.setLevel(9);
// とりあえず5ファイル圧縮
int count = 5;
for (int i = 1; i <= count; i++) {
// ファイルに書き込む内容
String str = "テスト" + i;
byte[] buf = str.getBytes();
// ZipEntryが、ZIPアーカイブに入れる「ファイル」や「ディレクトリ」を表す
// ZipEntryをnewして、このインスタンスをputNextEntry()すれば加えられる
zos.putNextEntry(new ZipEntry("zip" + i + ".txt"));
// 現在のZipEntryに書き込む
zos.write(buf, 0, buf.length);
// 次のZipEntryを加えるには必ず現在のZipEntryを閉じる
zos.closeEntry();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
JavaEE5の一部で永続層のための新しい標準仕様。
その実装としてHibernate、Kuina-Dao、TopLinkなどがある。
JPAの構成要素
・エンティティ
RDBに永続化されるJavaクラス及び、そのインスタンス
・永続ユニット
エンティティクラスの集合/使用するJPA実装/接続するRDBMSといった、構成情報をまとめたもの
・永続コンテキスト
実行時の概念で、エンティティインスタンスの集合
・EntityManager
永続コンテキストを操作するためのJavaインターフェース
・JPQL(Java Persistence Query Language)
SQLによく似たJPAの問い合わせ言語
JPAはRDBをJavaのオブジェクトとして扱うための仕様で、
テーブルの代わりにエンティティクラスを、レコードの代わりにエンティティインスタンスを、SQLの代わりにJPQLを使う。
RDBのレコードを、Javaのエンティティインスタンスとして扱うための場が永続コンテキストで、
ここでエンティティインスタンスを追加/変更/削除ができる。
JPA実装は永続コンテキストをRDBと同期化するので、その結果RDBにレコードが追加/変更/削除される。
永続コンテキストは、RDBのJavaメモリへの写像(mapping)で、永続コンテキスト上のエンティティインスタンスは
単なるJavaオブジェクトではなく、RDBにあるレコードの写像である。
よって、永続コンテキストへの操作はRDBへの操作であり、エンティティへの操作はレコードへの操作になる。