Last Up Date 2008/12/21 02:42
Techscore http://www.techscore.com/tech/Java/main.html#J2SE
次の二つは全くの等価である。
<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
JSPの中で、日本語リテラルを含むソースをコンパイルすると「エクケープ文字が不正です」が出るときがあるらしい。
"削除可能"などがでる。
JSPからユニコードに変換する時の諸問題で発生するらしい。詳細は未調査。
回避方法は、
"削除可能\"
とすると良い。
上の例では、[能]の字がエラーをおこしているようだ。
2002/03/26
http://www.ingrid.org/java/jserv/i18n/corruptedchar.html にわかりやすい記述があった
2002/07/19
@IT
Webブラウザが文字コードを判定する基準は?
http://www.atmarkit.co.jp/fjava/rensai3/mojibake01/mojibake01.html
サーブレットは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 {
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() %>
ポイントは、JNDIツリーから、データソースを取得する事。
//データソースをJNDIから取得する InitialContext initialContext = new InitialContext(); DataSource dataSource = (DataSource) initialContext.lookup("jdbc_test_pool");
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
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
サーブレットや、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
web.xml の URLマッピングに記述する内容は、コンテキストルートは含まない。
<jsp:forward page="/response.jsp" />
http://msugai.fc2web.com/java/servlet/dispatcher.html
K氏の実験によれば、ディスパッチする時、HTMLとJSPでは、切り方に相違があるとの事
JSPにディスパッチする時
/ 始まりの場合は、コンテキストルートからの絶対指定になる。
/ 以外の始まりは、JSPからJSP呼び出しの場合は、JSPどおしの相対パスになる。
HTMLにディスパッチするとき
/ 始まりの場合は、webRootからの絶対指定になる。
/ 以外の始まりは、呼び出しもとのフォルダからの相対パスになる。
複数のアプリケーションで共有する 部品 を 配置する方法は、いくつかの方法があるようだ
1 APサーバーの起動スクリプトのクラスパスに登録をする方法。
jarもclassファイルもシステムクラスパスに宣言して使用できる。
2 ear形式の配置を行う。
APP-INF/LIB にjarをおいたり、APP-INF/classes に classファイルを置いたりする事ができる。
3 それぞれのWEB-INF/LIB に配置を行う。
JARファイルを配置する。
異なるフォルダに同じJARファイルが存在する事になる。
本来の形は、2 の方式なのだろう。
リソースの入替・追加が発生した時に、
・アプリケーションの停止を避けたい
・入替するモジュールを最小限にしたい
の念頭にするならば、2はEAR全体の再デブロイが発生してしまうので、
1で クラスパス指定により、CLASSファイルを裸で置く案が有望になる。
しかし、1 だと、ファイルを更新した場合は、APサーバーの再起動が必要になる。
それは、クラスローダーで、そのクラスがメモリにローディングされている可能性があるからである。
http://muimi.com/j/apsrv/weblogic/dirdep/
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 という方向へは利用可能である。
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パース例外が発生する。
HttpServletRequest::getRemoteAddr()
要求を送信したクライアントのインターネットプロトコル (IP) アドレスを返します。HTTP サーブレットの場合、返される値は CGI 変数 REMOTE_ADDR の値と同じです。
HttpServletRequest::getRemoteHost()
要求を送信したクライアントの完全指定のドメイン名を返します。Web コンテナがホスト名を解決できなかったり、パフォーマンス向上のためにホスト名を解決しないことを選択した場合は、ドットで区切られた書式の IP アドレスを返します。HTTP サーブレットの場合、返される値は CGI 変数 REMOTE_HOST の値と同じです。
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
//JSPに処理を委譲する ServletContext sc = super.getServletContext(); RequestDispatcher disp = sc.getRequestDispatcher("/test.jsp"); disp.forward(request,response);
test.jsp は、コンテキストルート直下にいます。
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(); }
<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" が取得できます
JakartaProjectにて、便利なクラスが存在するようです
JakartaProject
http://www.javaroad.jp/servletjsp/sj_servlet12.htm
Struts
http://www.javaroad.jp/opensource/js_struts20.htm
JSPでは、session オブジェクトは予め定義されているオブジェクト変数として使用できる。
使用したく無い場合は、以下のように宣言する必要がある。さもなくば、<%@ page session= "true" %> となり
既存のセッションの取得、もしくは、新たに生成したセッションが設定される。
<%@ page session= "false" %>
フォワードは、Servlet/JSPコンテナ内で処理の委譲
リダイレクトは、一度クライアントブラウザへ返した後、httpリクエストの再発行である
JSPフォワードの例
<jsp:forward page="menu.html"/>
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=たちつてと
パラメタータ は ? につづき 変数名=値&変数名=値&変数名=値 …という書式である