Servlet JSP の 覚え書き

Last Up Date 2008/12/21 02:42

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タグあれこれ
20050615 ServletからJSPへのフォワード
20050615 クライアントからの入力パラメータの一覧
20050630 web.xml からのinit-param情報の取得
20050704 ファイルのアップロード
20050708 JSPでのセッションの生成
20050721 フォワードとリダイレクト
20050722 代表的なクラス図
20081220_doGet系のパラメタの渡し方

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マッピングに記述する内容は、コンテキストルートは含まない。


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/


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=たちつてと

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


戻る