2017年1月22日日曜日

Servlet / JSP 再入門とAWSやLinuxの雑記3

続き


メモ

Spring Tool SuitsにDB Viewerを入れる
パースペティクブ開こうとしたら入っていなかったです。
Eclipse MarketplaceからDLできました。
参考:Small Java World Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発行してみる

Mac OSXでPostgreSQL立ち上げるのにハマりググる。
クライアントはすぐ見つかるが、サーバ側がなかなか起動できなかった。
失敗した方法:
PostgreSQL 9.0.4文書 17.3. データベースサーバの起動
$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &
Mac OSXでbrewでpostgresqlをインストすると/usr/local/pgsql/dataにconfファイルがないみたいでした。

解決した方法:
Qiita Homebrewを使ったPostgreSQLのインストール(Mac OS Lion)
postgres -D /usr/local/var/postgres

JDBCのダウンロード
まぁ公式から。
Java SDKのバージョンにより、使用するJDBC Driverのバージョンが異なります。
  • 1.6 → JDBC4
  • 1.7 → JDBC4.1
  • 1.6 → JDBC4.2

JDBC API
(Class)java.sql.Drivermanager
: static Connection : getConnection(String url)

(interface)java.sql.Connetion
: static PreparedStatement prepareStatement(String sql)
: void close()

(interface)java.sql.PreparedStatement
: void close()
: ResultSet executeQuery()
: int executeUpdate()
: boolean execute()
: void setString(int parameterIndex, String x)
: void setInt(int parameterIndex, int x)
: void setDouble(int parameterIndex, double x)
: void setDate(int parameterIndex, Date x)

executeQuery(), execute(), executeUpdate()
  • executeQuery() = SQLを実行してResultset型の戻り値を返す
  • execute() = SQLを実行し、完了したかどうかのboolean値を返す
  • executeUpdate() = SQLを実行し、影響があった行数を返す

INパラメータ
PreparedStatmentに埋め込む"?"のこと。
インデックスは1始まり。まぁSQL絡みだから間違えないかな。

ResultSet
(interface)java.sql.ResultSet
: void close()
: boolean next()
: String getString(String columnName)
: int getInt(String columnName)
: double getDouble(String columnName)
: java.sql.Date getDate(string columnName)

JDBCの書き方
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection
("jdbc:postgresql://localhost:5432/test?user=test&password=test");

PostgreSQLのserialがずれる
独自idカラムをserialかつPrimary Keyにしていたら、Webアプリでレコード追加した際に
idカラムが重複してエラーを起こしていた。シーケンスが、すでにテーブルにある値とずれることがあるらしい。
参考:ぺけみさお PostgreSQLでINSERT時に自動採番の主キーが重複してエラーが出る場合の対処法

JSP / Javaコードに変換されたソースのありか
Eclipseで確認しているのは、
[project root] / work / org.apache.jsp / [jsp file name]_jsp.java

jspファイルへのリクエストへの度に_jspServiceメソッドを実行
javax.servlet.jsp.JspWriter型のout変数にjspファイルの内容を書き込む
結果として、整形されたHTMLコードがレスポンスで渡される。

JSP / ディレクティブ
  • page:ページ設定
  • taglib:タグライブラリ
  • include:外部ファイルの読み込み

JSP / pageディレクティブ
<%@ attribute1="value1" attribute2="value2" ... %>
import属性は複数使用可能で、その他は一度しか使用できない。
pageディレクティブの設定は、そのページのみで有効
  • language:javaを指定
  • contentType:MIMEタイプと文字エンコード("text/html; charset=UTF-8")
  • pageEncoding:JSPファイルをサーブレットクラスに変換するときの文字コード("UTF-8")
  • import:一度の指定でカンマ区切りで複数のクラスをインポート可能
    e.g. import="java.util.*, java.sql.*"
  • extends:JSPから変換する際のサーブレットクラスのスーパークラス
  • info:JSPページの情報。javax.servlet.ServletインターフェースのgetServletInfo()で取得することができる
  • session:セッション有効化フラグで、デフォルトはtrue(有効)です

スクリプティング要素
  • スクリプトレット:Javaプログラムブロック <% xxx; %>
  • 式:値を出力する式 <%= xxx %>
  • 宣言:変数宣言とメソッド定義のブロック <%! xxx %>
  • JSPコメント:HTMLコメントと違い、レスポンスで返されるHTMLには含まれない <%-- xxx --%>
式は文末に;がいらないけど、スクリプトレットと宣言は;が必要
式は変数やメソッドを1回呼び出すだけだからだろうか。

暗黙オブジェクト
オブジェクトを明示的に生成しなくても使用できるオブジェクト
  • out
  • request
  • response
  • session
  • application
  • config
  • pageContext
  • page
  • exception

JSP / 他のファイルの入れ込み
  • includeディレクティブ:<%@ include file="xxxx" %>
    include元と先どちらも合わせてコンパイルするので、元で先のJSPタグを使用できる
  • includeアクション:<jsp include page="xxxx" />
    include元を先にコンパイルし、その後にinclude先のファイルの呼び出す(実行する)

JSP / forwardアクションタグ
<jsp:forward page="xxx" />
前項includeディレクティブとアクションは、あくまで呼び出し元がHTTPレスポンスを返す。
一方、forwardアクションは、呼び出し先がHTTPレスポンスを返す。

0 件のコメント:

コメントを投稿