Servlet JSP の 覚え書き

Last Up Date 2010/01/16 00:50

Techscore http://www.techscore.com/tech/Java/main.html#J2SE


001 <jsp:useBean>タグの働き
002 jspの日本語でエクケープエラーが出るとき
003 ServletとJSPにおける文字化けについて
004 セッションが継続できないのはなんで?
20050119-1 Servletの初歩的なサンプル
20050124-1 オブジェクトのスコープ
20050125-1 単純なDB読み込みサンプル
20050125-2 APサーバーのJDBCコネクションプーリングを使用したDB読み込みサンプル
20050201-1 動的に生成したページをキャッシュさせないために
20050208-1 EJBを使った方がやっぱりベンリなのかなぁ
20050307 URLマッピングについてのメモ
20050308 JSPからのディスパッチ
20050310 共通的な部品の配置について
20050312 LIBフォルダへのクラスパス
20050403 web.xmlでの切る順番
20050404 クライアントのホスト名を識別するには
20050407 JSPタグあれこれ
20090611_サーブレットアプリケーションにおいて、カレントパスは何処?
20050615 ServletからJSPへのフォワード
20050615 クライアントからの入力パラメータの一覧
20090624_ServletConfig_が取得できず、null_で例外発生していまう
20090624_サーブレットから_JSPを呼び出すときの_パスについて
20090624_サーブレットから_HTMLを呼び出すとき
20050630 web.xml からのinit-param情報の取得
20050704 ファイルのアップロード
20050708 JSPでのセッションの生成
20050721 フォワードとリダイレクト
20050722 代表的なクラス図
20081220_doGet系のパラメタの渡し方
20090604_Webアプリのフォルダ構成の基本
20090605_web.xml_url-pattern_のきり方について
20090716_文字のエンコーディング_フィルター編
20090716_JDBC_例外発生_Error_while_registering_Oracle_JDBC_Diagnosability_MBean.
20090729_セッションに格納するオブジェクトは、シリアライズ可能なオブジェクトであるべし
20090824_CSVファイルなどのダウンロード
20091004_サーブレットからのエラーコード返し
20100115_リストチェックされた行のキーを送信


001    <jsp:useBean>タグの働き

次の二つは全くの等価である。

<jsp:useBean id="myBean" class="MyBean" scope="session"> 
<jsp:useProperty name="myBean" property="prop" value="val">
<%
    MyBean myBean = (MyBean)session.getAttribute("myBean");
    if (myBean == null){
        myBean = new MyBean();
        session.setAttribute("myBean",myBean);
    }
    myBean.setPorp("val");
%>

2002/02/26


002 jspの日本語でエクケープシーケンスエラーが出るとき

JSPの中で、日本語リテラルを含むソースをコンパイルすると「エクケープ文字が不正です」が出るときがあるらしい。

"削除可能"などがでる。

JSPからユニコードに変換する時の諸問題で発生するらしい。詳細は未調査。

回避方法は、

"削除可能\

とすると良い。
上の例では、[能]の字がエラーをおこしているようだ。

2002/03/26


003 ServletとJSPにおける文字化けについて

http://www.ingrid.org/java/jserv/i18n/corruptedchar.html にわかりやすい記述があった

ローカル

2002/07/19

JSPベースでのテストした時のもの

自分なりのまとめ


@IT Webブラウザが文字コードを判定する基準は?
http://www.atmarkit.co.jp/fjava/rensai3/mojibake01/mojibake01.html


004 セッションが継続できないのはなんで?

サーブレットはcookieによる方法と、URLwritingによる方法があるそうだ。

URLwritingによる実装の場合は、クッキーに依存しないため、クライアント側でcookieの使用をoffにしていても使用できる。

現時点で判っていないのは、クライアント側でcookieを無効にしていたら、自動的にURLwritingに変更されるようにサーブレットが実装されているのか、それとも実装設計で決めなければならないのか...

2003/01/28



public class TestServlet05 extends HttpServlet {

public void init(ServletConfig config) throws ServletException {
super.init(config);
//TODO Method stub generated by Lomboz
}
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {


20050119-1 Servletの初歩的なサンプル

TestServlet.java

    


20050124-1 オブジェクトのスコープ

http://ash.or.jp/java/webapp_scope.htm

三つのスコープがある


リクエストスコープ

1回のHTTPプロトコルで実行される、サーブレットとforwardされたJSP間で有効なオブジェクトです。リクエストの処理が終わると破棄されます。 HttpServletRequestの属性として設定します。

Servlet

request.setAttribute("testBean",testBean); 

JSP

<jsp:useBean id="testBean" class="testPackage.TestBean" scope="request" />
…
<%= testBean.getDate() %>

セッションスコープ

同一のセッションで実行される、サーブレットやJSPで有効なオブジェクトです。一定時間が経過しsessionが終了すると破棄されます。 HttpSessionの属性として設定します。

Servlet

HttpSession session = request.getSession();
session.setAttribute("testBean",testBean); 

JSP

<jsp:useBean id="testBean" class="testPackage.TestBean" scope="session" />
…
<%= testBean.getDate() %>

このセッションスコープですが、Webアプリケーション間でのセッションスコープは共有されません

本来は、アプリケーション内での会話どうしを連携させるもととして使うもののようです


アプリケーションスコープ

同じアプリケーション内のすべてのサーブレットやJSPで共有されるオブジェクトです。サーバを終了すると破棄されます。
セッション間でも情報共有されます。

ServletContextの属性として設定します。

Servlet

ServletContext servletContext = getServletConfig().getServletContext();
servletContext.setAttribute("testBean",testBean); 

JSP

<jsp:useBean id="testBean" class="testPackage.TestBean" scope="application" />
…
<%= testBean.getDate() %>

20050125-1 単純なDB読み込みサンプル

TestDB.java


20050125-2 APサーバーのJDBCコネクションプーリングを使用したDB読み込みサンプル

ポイントは、JNDIツリーから、データソースを取得する事。

	//データソースをJNDIから取得する			
	InitialContext initialContext = new InitialContext();
	DataSource dataSource = (DataSource) initialContext.lookup("jdbc_test_pool");

JDBC接続プールの作成(WebLogic)

単純なサンプルコード


20050201-1 動的に生成したページをキャッシュさせないために

JSPで生成したページをキャッシュさせたくない場合には、以下のようなファイルを用意して、
<%@ page include="Nocache.inc" %> のようにインクルードするとよい。

Nocache.inc

<%! private String getHTTPDate() {
    java.text.SimpleDateFormat formatter =
      new java.text.SimpleDateFormat("E, dd MMM yyyy hh:mm:ss zzz", java.util.Locale.US);
    formatter.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
    return formatter.format(new java.util.Date());
  }
%><%
  response.setHeader("Expires", getHTTPDate());
  response.setHeader("Pragma","no-cache");
  response.setHeader("Cache-Control","no-cache");
%> 

また、レスポンスヘッダは以下のようになる。

HTTP/1.1 200 OK
Content-Type: text/html;charset=Shift_JIS
Cache-control: no-cache
Pragma: no-cache
Expires: Tue, 17 12 2002 15:34:27 GMT
Date: Tue, 17 Dec 2002 15:34:27 GMT
Server: Apache Coyote/1.0
Proxy-Connection: close
Connection: close

20050208-1 EJBを使った方がやっぱりベンリなのかなぁ

Webアプリケーションにおける サーバ・サイドJavaの効果的な利用(前編)
http://www.atmarkit.co.jp/fjava/special/ejb01/ejb01.html

Webアプリケーションにおける サーバ・サイドJavaの効果的な利用 (後編)
http://www.atmarkit.co.jp/fjava/special/ejb02/ejb02.html

JDBCはもう不要? パフォーマンス問題を解決したEJBは 実用期を迎える
http://www.atmarkit.co.jp/fjava/special/ejb20/ejb20.html

JBossでかんたんEJB(3)
http://www.atmarkit.co.jp/fjava/rensai3/jboss03/jboss03.html

EclipseでEJBを作成するあたりが少し書いてあった
http://mictan.gozaru.jp/jboss_eclipse.html

 


20050304-1 サーブレットはマルチスレッドか?

サーブレットや、JSPは、一般的にマルチスレッドで稼働されるものと認識すべきである。

http://www.atmarkit.co.jp/fjava/rensai2/webopt04/webopt04.html

つまりスタティック変数はもとより、インスタンス変数も、異なるスレッドから同時アクセスの可能性がある事を考慮すべきである。

サーブレットの場合の解決方法

方法1
インターフェイス javax.servlet.SingleThreadModel をインプリメントしてシングルスレッドモデルにしてしまう。

方法2
メソッドをsynchronizedにしてしまう。

方法3
必要な箇所を synchronized で囲む。

クラス変数に対し、スレッドセーフにする為には、クラス変数のsynchronizedのアクセサを用いれば良い。

JSPの場合の解決方法

<%! と %>で変数宣言だけするとインスタンス変数になってしまうので、
<%  と %>でjavaコーディングすれば、ローカル変数扱いになる。

http://www.nihon-eng.co.jp/c-break/TechNote/java/JAVA_SVLT5.htm


20050307 URLマッピングについてのメモ

web.xml の URLマッピングに記述する内容は、コンテキストルートは含まない。

20090605_web.xml_url-pattern_のきり方について


20050308 JSPからのディスパッチ

<jsp:forward page="/response.jsp" />

http://msugai.fc2web.com/java/servlet/dispatcher.html

K氏の実験によれば、ディスパッチする時、HTMLとJSPでは、切り方に相違があるとの事

JSPにディスパッチする時

/ 始まりの場合は、コンテキストルートからの絶対指定になる。

/ 以外の始まりは、JSPからJSP呼び出しの場合は、JSPどおしの相対パスになる。

HTMLにディスパッチするとき

/ 始まりの場合は、webRootからの絶対指定になる。

/ 以外の始まりは、呼び出しもとのフォルダからの相対パスになる。


20050310 共通的な部品の配置について

複数のアプリケーションで共有する 部品 を 配置する方法は、いくつかの方法があるようだ

1 APサーバーの起動スクリプトのクラスパスに登録をする方法。

jarもclassファイルもシステムクラスパスに宣言して使用できる。

2 ear形式の配置を行う。

APP-INF/LIB にjarをおいたり、APP-INF/classes に classファイルを置いたりする事ができる。

3 それぞれのWEB-INF/LIB に配置を行う。

JARファイルを配置する。
異なるフォルダに同じJARファイルが存在する事になる。

本来の形は、 の方式なのだろう。

リソースの入替・追加が発生した時に、
・アプリケーションの停止を避けたい
・入替するモジュールを最小限にしたい
の念頭にするならば、はEAR全体の再デブロイが発生してしまうので、
で クラスパス指定により、CLASSファイルを裸で置く案が有望になる。

しかし、だとファイルを更新した場合は、APサーバーの再起動が必要になる。
それは、クラスローダーで、そのクラスがメモリにローディングされている可能性があるからである。

http://muimi.com/j/apsrv/weblogic/dirdep/

 

サーブレットコンテナでの、基本的なフォルダ構成

Javaの道:Tomcat(2.プログラム配置・実行):
http://www.javaroad.jp/opensource/js_tomcat2.htm


20050312 LIBフォルダへのクラスパス

WEB-APP/classes  WEB-APP/ib  WEB-INF/classes  WEB-INF/lib などへは、明示的にclasspath を切らなくても 使用可能になっている。
それは、classLoder がサーチをする時に、検索範囲にしかけを入れているようである。

JVMに対するクラスパスは、どこでからでも 検索できる位置づけとなる。

JVM でのクラスパスに配置されているクラスからは、WEB-APP、WEB-INF 配下のクラスは参照できない。

WEB-APP/classes  WEB-APP/ib のクラスからは、WEB-INF/classes  WEB-INF/lib のクラスは参照できない。

これは、一般化された物から、特化された物は 使用できない事を表していると考えられる。

クラスパス WEB-APP WEB-INF という方向へは利用可能である。


20050403 web.xmlでの切る順番

http://java.sun.com/dtd/web-app_2_3.dtd によると、次のように順番が設定されているようだ

<!ELEMENT web-app (
	icon?, 
	display-name?, 
	description?, 
	distributable?,
	context-param*, 
	filter*, 
	filter-mapping*, 
	listener*, 
	servlet*,
	servlet-mapping*, 
	session-config?, 
	mime-mapping*, 
	welcome-file-list?,
	error-page*, 
	taglib*, 
	resource-env-ref*, 
	resource-ref*, 
	security-constraint*,
	login-config?, 
	security-role*, 
	env-entry*, 
	ejb-ref*,  
	ejb-local-ref*
)>

この順番を守らないと、xmlパース例外が発生する。


20050404 クライアントのホスト名を識別するには

HttpServletRequest::getRemoteAddr()

要求を送信したクライアントのインターネットプロトコル (IP) アドレスを返します。HTTP サーブレットの場合、返される値は CGI 変数 REMOTE_ADDR の値と同じです。

HttpServletRequest::getRemoteHost()

要求を送信したクライアントの完全指定のドメイン名を返します。Web コンテナがホスト名を解決できなかったり、パフォーマンス向上のためにホスト名を解決しないことを選択した場合は、ドットで区切られた書式の IP アドレスを返します。HTTP サーブレットの場合、返される値は CGI 変数 REMOTE_HOST の値と同じです。


20050407 JSPタグあれこれ

WebLogic JSP リファレンス
http://edocs.beasys.co.jp/e-docs/wls/docs81/jsp/reference.html  Ver8.1
http://edocs.beasys.co.jp/e-docs/wls61/jsp/reference.html#68555 VER6.1


200506015 ServletからJSPへのフォワード

		//JSPに処理を委譲する
		ServletContext sc = super.getServletContext();
		RequestDispatcher disp = sc.getRequestDispatcher("/test.jsp");
		disp.forward(request,response);

test.jsp は、コンテキストルート直下にいます。


20050615 クライアントからの入力パラメータの一覧

requestから、入力パラメタを取得して、外部のファイルに出力する例

	private void inputDump(HttpServletRequest request) {

		Enumeration enum = request.getParameterNames();

		PrintWriter writer = null;
		try {

			writer =
				new PrintWriter(
					new BufferedWriter(
						new FileWriter("c:\\temp\\testlog.log")));

		} catch (IOException e) {

			e.printStackTrace();
		}

		while (enum.hasMoreElements()) {

			String parameterName = (String) enum.nextElement();
			String[] parameterValues =
				request.getParameterValues(parameterName);

			String outString = parameterName;
			for (int i = 0; i < parameterValues.length; i++) {
				outString += " = " + parameterValues[i];
			}

			writer.println(outString);

		}

		writer.flush();

	}

20050630 web.xml からのinit-param情報の取得

<web-app>

    <!-- Action Servlet Configuration -->
    <servlet>
        <servlet-name>xxxStrutsServlet</servlet-name>
        <servlet-class>uxx.session.ActionServlet</servlet-class>

        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
      …

javax.servlet.getInitParameter(java.lang.String name) を用いて取得できます。

HttpServlet を継承していれば、使用できます。

getInitParameter("config") で、 "/WEB-INF/struts-config.xml" が取得できます


20050704 ファイルのアップロード

JakartaProjectにて、便利なクラスが存在するようです

JakartaProject
http://www.javaroad.jp/servletjsp/sj_servlet12.htm

Struts
http://www.javaroad.jp/opensource/js_struts20.htm

 

参考:クライアント側のタグ


20050708 JSPでのセッションの生成

JSPでは、session オブジェクトは予め定義されているオブジェクト変数として使用できる。

使用したく無い場合は、以下のように宣言する必要がある。さもなくば、<%@ page session= "true" %> となり

既存のセッションの取得、もしくは、新たに生成したセッションが設定される。

<%@ page session= "false" %>

20050721 フォワードとリダイレクト

フォワードは、Servlet/JSPコンテナ内で処理の委譲

リダイレクトは、一度クライアントブラウザへ返した後、httpリクエストの再発行である

JSPフォワードの例

<jsp:forward page="menu.html"/>

20050722 代表的なクラス図


20081220 doGet系のパラメタの渡し方

Tomcat 6.0系を標準インストールした時のデモを利用した

http://localhost:8080/examples/servlets/servlet/RequestParamExample

このリストストを受け取るサーブレットは、doPost と doGet は 同一のメソッドで処理するようになっているので

    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        doGet(request, response);
    }

urlから渡しても、同様の動きが再現できるはず


http://localhost:8080/examples/servlets/servlet/RequestParamExample?firstname=さしすせそ&lastname=たちつてと

パラメタータ は ? につづき 変数名=値&変数名=値&変数名=値 …という書式である


20090604 Webアプリのフォルダ構成の基本


20090605 web.xml url-pattern のきり方について

http://www39.atwiki.jp/dragon109/pages/29.html

URLパターン(パスマッピング)

<url-pattern> /hello/* </url-pattern>

この場合、「http://localhost:8080/webxmltest/hello/」から始まる全ての呼び出しに対して指定のサーブレットを実行する。 下記のどの呼び出し方をしても同じサーブレットが呼び出される。

http://localhost:8080/webxmltest/hello/hellowolrd
http://localhost:8080/webxmltest/hello/index.html
http://localhost:8080/webxmltest/hello/sub/sub2/exsample.jpg

URLパターン(拡張子マッピング)

<url-pattern>*.gif</url-pattern>

この場合、呼び出しのURLの最後が「.gif」で終わる全ての呼び出しに対して指定のサーブレットを実行する。
下記のどの呼び出し方をしても同じサーブレットが呼び出される。

http://localhost:8080/webxmltest/sample.gif
http://localhost:8080/webxmltest/hello.gif
http://localhost:8080/webxmltest/hello/abc.gif

URLパターン(デフォルトマッピング)

どのURLマッピングにもマッチしなかった全ての呼び出しに対して対応するサーブレットを呼び出すためのもの。

<url-pattern>/</url-pattern>

URLパターンの優先順位

高 特定のファイルへのマッピング
↑ パスマッピング
↓ 拡張子マッピング
低 デフォルトマッピング


<url-pattern>
/
</url-pattern>

を、宣言すると、
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
が、有効にならない

 


20090611 サーブレットアプリケーションにおいて、カレントパスは何処?

以下のコードを仕込めばわかるが System.out.println(new File(".").getAbsolutePath());

自分の場合は、ココでした D:\Eclipse\tomcat6.0\.

外部パスを取得するなら、プロパティファイルを用いるとかしたほうが良いかも


20090624 ServletConfig が取得できず、null で例外発生していまう

サーブレットの基礎を行っているときに

doPost メソッド内で ServletConfig ss = getServletConfig();

をおこなったら、取得に失敗 NULLになった。
なんで?

サーブレットコンテナ(Tomcat)を再起動したら、OKだった 。
デバッグモードで 起動させたまま、ソース修正をしていたのが原因か

原因2 init(ServletConfig config) を オーバーライズしていた
しかし、super.init(ServletConfig config) を呼び出していなかった。

通常は、引数なしの public void init() を呼び出すだけでよい。 これだと、Super呼び出しが不要。

 


20090624 サーブレットから JSPを呼び出すときの パスについて

http://localhost:8080/コンテキストルート/jsp/out01.jsp
ココに存在する JSPに委譲したい場合

// JSPに処理を委譲する
ServletContext sc = super.getServletContext();
RequestDispatcher disp = sc.getRequestDispatcher("/jsp/out01.jsp");
disp.forward(request, response);

JSPの指定先は、コンテキストルート配下のパスで切る

でも、

http://localhost:8080/fw_proto_servlet01/start.html
<form action="/fw_proto_servlet01/servlet" method=post>

submit したら…

jspは開いたけど、ブラウザのURLは /servletが表示されていた。

http://localhost:8080/fw_proto_servlet01/servlet

って事は、JSPの存在位置と、URLがあっていない事になる。

そういうもんだっけ?

実験からあぶりだすと…

サーブレット内のディスパッチャーは、 どのJSPを使用するかー である。

したがって、コンテキストルート を起点とした、使用するJSPの所在を指定するものである。

クライアントブラウザーの上部の URL欄は、 レスポンスされたコンテンツではなく、リクエスト/要求した内容である。

クライアントから URLをリクエストする際に、相対を指定したときには、 次のルールで 絶対パスに組み立てられなおして、要求が投げられるようである。

要求相対パスが… 上部のURLが …
host/root/base host/root/base/
aaa host/root/aaa host/root/base/aaa
/aaa host/aaa host/aaa
/aaa/ host/aaa/ host/aaa/
/aaa/bbb host/aaa/bbb host/aaa/bbb
/aaa/bbb/ host/aaa/bbb/ host/aaa/bbb/
aaa/ host/root/aaa/ host/root/base/aaa/
aaa/bbb host/root/aaa/bbb host/root/base/aaa/bbb
aaa/bbb/ host/root/aaa/bbb/ host/root/base/aaa/bbb/

太字は、フォルダを示すことになる

ベストプラクティスを考えて見みると
ベストじゃないなぁ

welcomPage host/Docroot/index.html host/Docroot/index.html
サーブレット呼び出し action host/Docroot/action

20090624 サーブレットから HTMLを呼び出すとき

JSPにディスパッチするときと、同じ方法で、HTMLが指定できるみたいだ

ディスパッチャーは、リクエストオブジェクトからでも、取得できるぞ

RequestDispatcher disp = request.getRequestDispatcher("/simpletest01/html01.html");


20090716 文字のエンコーディング フィルター編

http://himtodo.fc2web.com/java/encode.html


20090716 JDBC 例外発生 Error while registering Oracle JDBC Diagnosability MBean.

Oracle JDBCドライバ 周りで 例外が発生

Eclipse上で Tomcatの初回実行後に、例外が発生してしまう

致命的: Error while registering Oracle JDBC Diagnosability MBean.
javax.management.MalformedObjectNameException: Invalid character '
' in value part of property
at javax.management.ObjectName.construct(ObjectName.java:602)
at javax.management.ObjectName.<init>(ObjectName.java:1403)
at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:303)
at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:213)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:209)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at resources.CustomerResource.getCustomerAsXml(CustomerResource.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
以下省略

環境 Eclipse 3.4.2
Oacle 11g 11.1.0.6.0
JDBC 11.1.0.6.0 ojdbc6.jar

原因 不明

対処方法

Oracleから、JDBCの新しい版がでているので、それを使用せよ

Oracle 11.1.0.7.0-Production JDBC 4.0 compiled with JDK6

以下のページから入手

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_111060.html


20090729 セッションに格納するオブジェクトは、シリアライズ可能なオブジェクトであるべし

Tomcat5.5で実験した。

セッションに格納したオブジェクトは、シリアライズ可能なオブジェクトである。

コンテキストをリロードしても、シリアライズ可能なオブジェクトは復元されていた。

WEBアプリケーションの停止/起動を行っても、シリアライズ可能なオブジェクトは復元されていた。

Tomcat自身を停止した場合は、再現できなかった。

 

シリアライズ可能なオブジェクトの作り方
../java/basic_language/basic_language.html#20090730_シリアライズ


20090824 CSVファイルなどのダウンロード

http://www.atmarkit.co.jp/fjava/javatips/028jspservlet019.html

ControlServlet

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ControlServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        resp.setContentType("application/octet-stream;charset=Windows-31J");
        resp.setHeader("Content-Disposition", "attachment; filename=db.csv");
        PrintWriter out = resp.getWriter();

        try {

            String lineSeparator = System.getProperty("line.separator");

            out.print("項目A,項目B,項目C,項目D,項目E");
            out.print(lineSeparator);
            out.print("aaa1,bbb1,ccc1,ddd1,eee1");
            out.print(lineSeparator);
            out.print("aaa2,bbb1,ccc2,ddd1,eee2");
            out.print(lineSeparator);
            out.print("aaa3,bbb1,ccc3,ddd1,eee3");
            out.print(lineSeparator);

        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                throw new ServletException(e);
            }
        }

    }
}

web.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

    <description>20090824_csv_download</description>
    <display-name>20090824_csv_download</display-name>

    <servlet>
      <servlet-name>controlServlet</servlet-name>
      <servlet-class>ControlServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>controlServlet</servlet-name>
        <url-pattern>*.go</url-pattern>
    </servlet-mapping>

</web-app>

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>index.html simple hallow java1</title>
</head>
<body>

<form action="action.go" method=POST>

<input type=submit>

</form>


</body>
</html>

項目A,項目B,項目C,項目D,項目E
aaa1,bbb1,ccc1,ddd1,eee1
aaa2,bbb1,ccc2,ddd1,eee2
aaa3,bbb1,ccc3,ddd1,eee3


サーブレットのコンテントタイプについて

種類 拡張子 Content-Type
HTMLファイル html, htm text/html
テキストファイル txt text/plain
GIF gif image/gif
PNG png image/png
Windows 実行ファイル exe application/octet-stream

20091004 サーブレットからのエラーコード返し

httpServletResponse.sendError( HttpServletResponse.SC_NOT_FOUND,"テスト的に404返しをしてみた" );

FierBugで見てみると。

web.xml にエラーページを設定した場合はどうなるか?

    <error-page>
        <error-code>404</error-code>
        <location>/404.html</location>
    </error-page>

エラーページがあてがわれても、404が帰ってきている事が確認できました。


20100115 リストチェックされた行のキーを送信

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">

<!--
http://localhost:8080/20100114_list_get/
 -->


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>リスト形式の画面から、選択された行のキーを得る</title>
<script type="text/javascript" src="jquery-1.3.2.js"></script>

<script type="text/javascript">

$(document).ready(function(){
});


function funcCheckedkey(){
    var c
    c =   $("#myTable1").find("input:checked").length;
    alert(c);

    var $sendKeys = $("#myTable1 [name='chk']:checked ").parent().parent().find("[name='key']")

    $sendKeys.each(function(){

    //  $("#sendkey").clone().
    //  alert($(this).text());

        $("#sendKeys").append("<div name='sendKey'>" + $(this).text() + "</div>" )

//    $("#sendKey")
//    $(this).toggleClass("example");
    });


//  alert($sendKeys.text());


}
</script>

</head>
<body>


<table id="myTable1" border="1">
<thead>
<tr>
<th>check</th><th>key</th><th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td><input id="chk1" type="checkbox" name="chk"  > </td><td name="key">keyA</td><td>valueA</td>
</tr>
<tr>
<td><input id="chk2" type="checkbox" name="chk" checked > </td><td name="key">keyB</td><td>valueA</td>
</tr>
<tr>
<td><input id="chk3" type="checkbox" name="chk" > </td><td name="key">keyC</td><td name="abc">valueA</td>
</tr>
<tr>
<td><input id="chk4" type="checkbox" name="chk" > </td><td name="key">keyD</td><td>valueA</td>
</tr>

</tbody>
</table>
<input id="myButon" type="button" value="chekcdkey" onclick="funcCheckedkey()"></input>

<hr/>
<div id="sendKeys"></div>

<hr/>


<form action="sss.go" method=POST>

<input type=text size=20 name=dataname>
<br>

aaaaaaaaaaaaaa


<input type=submit>

</form>



</body>
</html>


戻る