忍者ブログ
[1]  [2
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Struts1.3でJNDI接続 PostgreSQL
【環境】
Eclipse3.4.1
JDK1.6
TOMCAT5.5
Struts1.3
PostgreSQL8.2.1

環境がおかしくなったのでプロジェクト作り直し。
1.動的Webプロジェクトを作成

2.struts-blank-1.3.9.warのJarファイルをWEB-INF\libに展開する。
antlr-2.7.2.jar
commons-beanutils-1.7.0.jar
commons-chain-1.1.jar
commons-digester-1.8.jar
commons-logging-1.0.4.jar
commons-validator-1.3.1.jar
oro-2.0.8.jar
struts-core-1.3.9.jar
struts-taglib-1.3.9.jar
struts-tiles-1.3.9.jar

3.DBCP(コネクションプール)を使う為、下記の3つのコンポーネントを取得。
Jakarta-Commons DBCP
Jakarta-Commons Collections
Jakarta-Commons Pool
%TOMCAT_HOME%\common\libに配置する。

4.設定ファイル等々
・%TOMCAT_HOME%\conf\context.xml
 <Context>の後に↓の記述があるはずなのに
==============================================
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>META-INF/context.xml</WatchedResource>
==============================================
  ※2行目の記述がなかったので追記

・WebContent/META-INFにcontext.xmlを新規作成。
==============================================
 <Context path="/testap" docBase="testap"
                         debug="5" reloadable="true" crossContext="true">
         <Logger className="org.apache.catalina.logger.FileLogger"
                 prefix="localhost_testap_log." suffix=".txt"
                 timestamp="true"/>

         <Resource name="jdbc/postgres" auth="Container"  //Resource nameでアクセスされる。
         type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
         url="jdbc:postgresql://127.0.0.1:5432/sbt"
         username="postgres" password="admin" maxActive="20" maxIdle="10" maxWait="-1"/>
 </Context>
==============================================
上記設定内容
Path:testap
postgreSQLのポート:5432
データベース名:sbt
ユーザー:postgres
パスワード:admin

・web.xmlの編集 //welcomeファイルの次
==============================================
 <resource-ref>
     <description>postgreSQL Datasource example</description>
     <res-ref-name>jdbc/postgres</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
 </resource-ref>
==============================================
5.実装(サンプルソース)
==============================================
import javax.servlet.ServletException;
import javax.sql.DataSource;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class DbUtil {
 private static DataSource ds; //DataSourceはスレッドセーフ
 /**
  * DataSourceを必要に応じてJNDI経由で取得する。
  */

 public static DataSource getDataSource() throws ServletException{
  if (ds == null){
   //JNDI経由でDataSourceを取得する
   try {
    InitialContext context = new InitialContext();
    ds = (DataSource)context.lookup("java:comp/env/jdbc/postgres");
   } catch (NamingException e) {
    throw new ServletException(e);
   }
  }
  return ds;
 }
}
==============================================
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;

public class loginAction extends Action {
 Connection con = null;
 PreparedStatement ps = null;
 ResultSet rs = null;
 
 DataSource ds = DbUtil.getDataSource();
 con = ds.getConnection();
 DatabaseMetaData md = con.getMetaData();
 ps = con.prepareStatement("select xxxxxx");
 
 rs = ps.executeQuery();
 …
}
============================================== 

PR

validation.xml(抜粋)
□骨格になる部分
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE form-validation PUBLIC
  "-//Apache Software Foundation//
DTD Commons Validator Rules Configuration 1.0//EN"
 "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
  <formset>
    <form name="アクションフォームBeansの論理名">
      <!--検証内容の定義-->
    </form>
    <!--<form>要素を繰り返し記述-->
  </formset>
</form-validation>
□個々のフィールドに対する記述
<field property="title" depends="required,maxlength">
  <arg0 key="タイトル" resource="false" /> <!--keyはエラー時に表示される文字列-->
  <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
  <var>
    <var-name>maxlength</var-name>
    <var-value>100</var-value>
  </var>
</field>
※key属性には「パラメータ値そのもの」か「プロパティファイルのキー名」を指定する。
 ただし、プロパティファイルを引用する場合は、resource属性値を"true"に設定する。
 また、${var:XXXX}のようにすると、var要素で指定した編数値を引用することも出来る。
例)
 <arg0 name="maxlength" key="100" resource="false" />
 <arg1 name="maxlength" key="maxlength.max" resource="true" />
 <arg2 name="maxlength" key="${var:maxlength}" resource="false" />
  <var-name>maxlength</var-name>
  <var-value>20</var-value>
  
 

■Validatorを利用する場合の基本的な設定
1.継承をValidatorFormに変更する。

2.Validatorルールをvalidation.xmlに記述する。Validator自体の動作はvalidator-rules.xmlに定義されている。

3.メッセージ・リソースファイルに表示するエラーメッセージを記述する。

4.struts-config.xmlにValidator関連の設定をする。

■WEBアプリの課題
・URL直接入力
・戻るボタン
・2度押し
・マルチウィンドウ
の抑止(よくし)

1.リダイレクト
[リダイレクトとフォワードの違いを知る]
・リダイレクト
  response.sendRedirect("遷移先のページ");
 *リダイレクトはサーバがクライアントにリダイレクトの指示を出し、クライアントが
  自動的に要求をする。

・フォワード
  application.getRequestDispatcher("転送先のページ").forward(request, response);
 *クライアントからの要求に対し、サーバ内でページへ処理が移送され、クライアントに返す。

★パフォーマンスは フォワード>リダイレクト
★フォワードは同一サーバ内ページ(クラス)間でしか利用出来ない。
★リクエスト情報を引き継げるのはフォワードのみ。

2.ポストバック×
3.可変個数のパラメータをPOSTで送信する。

[参考サイト]
http://forza.cocolog-nifty.com/blog/2008/02/index.html

■HTTPの仕組み
・HTTPはリクエストから始まる
  GET /test.html?param1=value1&param2=value2 HTTP/1.1
  Accept: image/gif, image/......
  Accept-Lenguage: ja
    ....

 1行目は、リクエストライン(Request-Line)と呼ばれる。↓書式
 「メソッド リクエストURI HTTPバージョン」
 ・メソッド…GETやPOST
 ・リクエストURI…URL中の絶対パス以降の部分
 2行目以降は、リクエストヘッダと呼ばれる。↓書式
 「ヘッダ名: ヘッダ値」
 ★GETメソッドの場合、最後に改行のみの行を送ることでHTTPリクエストが終了する。

・POSTの場合―GETとどう違うか?
 例)↓のようなformが記述されている場合
 <form action="test.html?get1=value1&get2=value2" method="POST">
  <input type="text" name="post1" value="value1">
  <input type="password" name="post2" value="value2">
  <input type="hidden" name="post3" value="value3">
  <input type="checkbox" name="post4" value="value4" checked>
  <input type="submit" value="送信">
 </form>

  ↓のようなHTTPリクエストが送信される。

  POST /test.html?get1=value1&get2=value2 HTTP/1.1
  Accept: image/gif, image/......
  Accept-Lenguage: ja
    ....
  ....
  
  post1=value1&post2=value2&post3=value3.....

 HTTPヘッダより下の部分に、↑のような形でinputタグで指定した値が挿入される。
 ★注文すべきはinputタグのtype属性がHTTPリクエスト内では違いがなくなっている。

■HTTPリクエストの変数
Acceptヘッダ] javax.servlet.http.HttpServletRequest#getHeader("Accept")
Refererヘッダ] javax.servlet.http.HttpServletRequest#getHeader("Referer")
Accept-Languageヘッダ] javax.servlet.http.HttpServletRequest#getHeader("Accept-Language")
Content-Typeヘッダ] javax.servlet.ServletRequest#getContentType()
User-Agentヘッダ] javax.servlet.http.HttpServletRequest#getHeader("User-Agent")
Hostヘッダ] javax.servlet.ServletRequest#getServerName()
Cookieヘッダ] javax.servlet.http.HttpServletRequest#getCookies()
Hostヘッダ内ポート番号] javax.servlet.ServletRequest#getServerPort()
 ※Hostヘッダは「Host: サーバ名:ポート番号」と記述出来る

★メモです。すいません。。。

Eclipseにプロジェクト追加
・Tomcatプロジェクト
・Strutsサポート追加
 ・Strutsのライブラリ追加
 ・カスタムタグのTLDファイルを追加
 ・struts-config.xmlを生成
 ・MessageResources.propertiesを生成
 ・web.xmlを生成
[次へ]
・Validatorプラグインを使用
・Tilesプラグインを使用(再利用可能な部品を組み合わせたようなHTMLの作成を支援する機能)

=================================~
package=グループにまとめる
・Javaが提供しているクラスと簡単に区別がつく。
・クラスの分類が出来る。
?利用スコープを制御するもの

☆分類方法(下記2パターンが主)
1.機能ごとに分類する ○
 機能ごとのパッケージ化は再利用するのに有利になる。
 ※ただし、パッケージへのインターフェイスをしっかり設計する必要がある
2.利用する技術によって分類する △
 EJBをすべて1つのパッケージに入れたり、JSPから利用するクラスを1つにまとめたり…
※また、パッケージは階層化することが出来る。

・まずutilを設置 …全てPublicで定義
・actionとformは1箇所にあるほうが理解しやすい
 →actionを設置

3.開発チームの体制とリンクしてパッケージを作成するのも効率的
 パッケージごとに責任範囲を明確にすることが可能。
 ※パッケージ間の依存関係をできるだけシンプルにしておく。
 ※パッケージが相互利用されないように設計する。

JSP&サーブレットでは、複数のページ間で情報を維持するために、2つの方法を提供している。
■Cookie情報を取得する。
==============================================
【サンプル】リスト1で入力したメールアドレスをリスト2でCookieとして保存する。

[リスト1]cookie.jsp
<form method="POST" action="cookie_rec.jsp">
 E-Mailアドレス:
  <input type="text" name="email" size="40" maxlength="100"
   value="${cookie['email'].value}" /> -(3)
  <input type="submit" value="送信" />
</form>

[リスト2]cookie_rec.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="res" uri="http://jakarta.apache.org/taglibs/response-1.0" %>
<res:addCookie name="email"> -(1)
 <res:value>${param['email']}</res:value>
 <res:maxAge>15552000</res:maxAge>
</res:addCookie>
<c:redirect url="cookie.jsp" /> -(2)
 *2度目にcookie.jspにアクセスすると、1度目に入力したアドレスが表示される。
==============================================
Cookieを保存するには、Responseタグライブラリに含まれる<res:addCookie>タグを
利用する。(リスト2の(1)) …ResponseタグライブラリはJakarta Taglibsによるもの

<res:addCookie>要素は、name属性(Cookie名)と<res:value>要素(Cookie値)、<res:maxAge>
要素(有効期限)(秒単位)といった設定に基づいて、クライアントにCookieを送信する。

■Cookieの値を出力する。
クライアントに保存されたCookieの値にアクセスするには、暗黙オブジェクトCookieの役割。(リスト1の(3))
ただし、&{cookie['クッキー名']}で返されるのはCookieオブジェクトな為、Cookie値にアクセスする
には${cookie['email'].value}のように、valueプロパティを介する必要がある。

■セッションによる情報の引き継ぎ
==============================================
【サンプル】リスト1で保存されたセッション情報をリスト2から参照する。

[リスト1]session1.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
…中略…
<c:set var="sample" value="セッション情報" scope="session" /> -(1)
セッション情報を記録しました。
</body>

[リスト2]session2.jsp
<body>
セッション"sample" => ${sessionScope['sample']} -(2)
</body>

[リスト3]web.xml
<session-config>
 <session-timeout>10</session-timeout>
</session-config>
==============================================
セッション情報をセットするのは<c:set>要素の役割(リスト1の(1))
セッション情報を設定するにはscope属性を明示する必要がある。
※セッション有効期限はweb.xmlの要素で指定する。(リスト3)
※セッション情報を破棄したい場合はJakartaTaglibsのSession
 タグライブラリを使用する。
 

===================================
■セッションの開始・継続・終了
・実際の実装方法
サーブレットにおけるセッション管理を実現するにはHttpSessionを使用する。
セッションの開始・継続にはHttpServletRequestのgetSessionメソッドを実行する。
 ※開始時は引数にtrueを指定する。継続時はfalseを指定する。
セッションを終了する場合はHttpSessionのinvalidateメソッドを実行する。

セッションに値を格納する場合はHttpSessionのsetAttributeメソッドを実行する。
  UserInfo userInfo = new UserInfo(...);
  session.setAttribute("USER_INFO", userInfo);
セッションに格納された値を取得する場合はgetAttributeメソッドを実行する。
  UserInfo userInfo = (UserInfo) session.getAttribute("USER_INFO");
セッションに格納された値を削除する場合はremoveAttributeメソッドを実行する。
  session.removeAttribute("USER_INFO");
※getSessionメソッドの戻り値はHttpSessionになる。このメソッドは引数に関わらず
 セッション情報が存在するかチェックする。存在している場合は、そのセッションを返す。
 ただし、存在しない場合は引数により異なる
 trueの場合→セッションを新規に作成して返す。
 falseの場合→nullを返す。

 
参考サイト
http://www.atmarkit.co.jp/fjava/javafaq/session/session04.html

カレンダー
04 2025/05 06
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
フリーエリア
最新コメント
最新トラックバック
プロフィール
HN:
学kun
性別:
男性
バーコード
ブログ内検索
P R
Copyright © 毎日勉強頑張ってます! All Rights Reserved.
Powered by NinjaBlog
Graphics by 写真素材Kun * Material by Gingham * Template by Kaie
忍者ブログ [PR]