JSPとは

JSP(JavaServer pages)とは
サーブレットよりも効率的にWebアプリケーションを開発するために作られた言語で、HTMLコードの中にJSPで決められたタグを埋め込みHTMLを出力するプログラムを書くことが出来ます。拡張子は「.JSP」として、Tomcatのwebappsの下に任意のフォルダ(コンテキストルート)を作り、その中に格納します。配備記述子は不要でクライアントからは直接コンテキストルート/xxxx.jspでアクセスします。

JSPのタグ

宣言			Javaクラスのメンバ(フィールド、メソッド)定義を行う。宣言に定義した変数は異なるリクエスト間で共有される。
	<%! … %>		<%! static String name = "java user"; %>

ディレクティブ		JSPコンテンツ全体に関する基本的な設定をWebコンテナに伝える
	<%@ include … %>	<%@ include file="/XXXX.jsp" %>
	<%@ page … %>		<%@ page language="java" contentType="text/html; charset=Windows-31J" 
						pageEncoding="Windows-31J" errorPage"/error.jsp" %>
	<%-- errorPage属性は独自のエラー頁へのURLを指定 --%>
	<%@ page import="java.util.*" %>
	<%@ taglib… %>

スクリプトレット	Javaコードを埋め込むための要素。ここで定義された変数はローカル変数となり、異なるリクエスト間では共有されません。
	<% javaのコード %>	<% int answer=20*3 + 1; %>
				スクリプトレットではifやfor、whileなどの制御構造を使ってHTMLコードを出力することも出来ます。
	<% if(age>=20) { %>
		<p>大人です</P>
	<% } else { %>
		<p>子供です</p>
	<% } %>

式				何らかの値を持つ単一の式を指定。式の値はStringとして評価されます。式の末尾に「;」は不要です。
	<%= 式 %>		<%= answer %>

コメント		JSP内に各コメント。スクリプトレット内の各コメントは通常のJavaコメント。
	<%-- 任意の文字列 --%>
標準アクション		XML要素として記述するオブジェクトの生成、更新、ページ構成、画面遷移などの機能を提供する要素
	<jsp: アクション名 属性 />

暗黙オブジェクト
HttpServletRequestなどJSPの記述の前提になるオブジェクトは自動的に生成され、変数に割り当てられ、宣言なしに利用することが出来ます。このため同じ名前の変数をプログラマが宣言することはできません。
<% String str = request.getParameter("XXXX"); %>

主な暗黙オブジェクトが割り当てられた変数
request、response、pageContext、session、application、Out、config、exception

JSPの配置
サーブレットは配備記述子を使ってJavaコードを隠蔽しますが、JSPはHTMLと同じですから配備記述子を使いません。この事からコンテキストルート以下のどの実パスに置くことが出来、その実パスでアクセスすることが出来ます。

カテゴリー: JSP_Servlet | タグ: | JSPとは はコメントを受け付けていません

サーブレットとは

サーブレットとは
動的なWebページを作る、サーバー側に配置されるJavaアプリケーションの一つです。

サーブレットの開始点
スタンドアローンのJavaアプリケーションはmainメソッドが処理開始点ですが、WebアプリケーションではWebクライアント(ブラウザ)からのリクエストはWebサーバーに導入されたWebコンテナが受けてJSPやサーブレットを実行します。従ってユーザアプリケーションの開始点はmainメソッドの代わりのdoGetメソッド、またはdoPostメソッドになります。

サーブレットとWebクライアントはどのように繋がるのか
doGetメソッドもdoPostメソッドもWebクライアントからのリクエストをHttpServletRequestオブジェクトで受け取り、レスポンスをHttpServletResponseオブジェクトを使って返します。これらのオブジェクトはdoGetメソッド(doPostメソッド)の引数としてWebコンテナとの間で受け渡されます。

サーブレットのテンプレート

package com.example;

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 XXXXXXXXXX extends HttpServlet {
	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		
		req.setCharacterEncoding("Windows-31J");
		String message = req.getParameter("xxxx");
		
		resp.setContentType("text/html; charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.println("<html><head><title>〇〇〇〇</title></head><body>");
		out.println("<p>" + (出力情報) + "</p>");
		out.println("</body></html>");
	}
}

サーブレットの中はどうなっている
doGetメソッドの中では、まずsetContentTypeメソッドを使ってレスポンスとして返すコンテンツのメディアタイプ(text/html)と文字コード(charset)を設定します。
次にgetWriterメソッドを使ってPrintWriterオブジェクトを取得し、レスポンスとなるhtmlコードを書き込みます。

サーブレットはどこに置く
サーブレットの実行はWebコンテナが行うので、完成したサーブレットはWebコンテナが指定する場所に置く必要があります。Tomcatの場合はWebappsフォルダーの下に任意のフォルダーを作ると、それがWebアップリケ―ションのルートディレクトリ(コンテキストルート)となり、localhost:8080/XXXXのXXXXとして指定流ることが出来ます。
そして、コンテキストルートにはWEB=INFフォルダー及びその直下にclassesフォルダーを作る決まりになっていて、そのclassesフォルダーの中にサーブレットを配置します。ここでサーブレットのクラスファイルがpackageに組み込まれて入れば(例えばcom.svlet)、classesホルダーの下にcomフォルダー、その下にsvletホルダーを作って、その中にサーブレットのクラスファイルを配置します。

サーブレットをどう呼ぶのか
サーブレットが実際に配置されているフォルダーを、クライアントが直接アクセスできるとサーバーにとっては無防備すぎます。
そこでWebコンテナはクライアントにはコンテキストルートまでを公開し、それ以下のパスにアクセス出来ないようにしています。実際のパスを公開する代わりに、コンテキストルートに続けて疑似的なパスを設定し、そのパスと実際のサーブレットの配置場所をマッピングする配備記述子(ディプロイメントディスクリプタ)と呼ばれるXML形式のファイルを介して、クライアントには疑似的なパスを公開しています。

配備記述子(ディプロイメントディスクリプタ)とは
コンテキストルート以下のWEB-INF/classesを省きサーブレットの(packageを含んだ)クラスファイル名とサーブレットの実際の配置パス名をマッピング(紐付け)するxml形式のファイル。このファイルは名前をweb.xmlとして、WEB-INFフォルダーに配置します。

「wheb.xmlの型式」
<?xml version="1.0" encoding="Windows-31J"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	version="3.0"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
				http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
				
		<description>					<!-- 省略可 -->
			Servlet Examples.
		</description>
		<display-name>				<!-- 省略可 -->
			My First Servlet
		</display-name>

		<!-- servletのクラスに名前を設定する -->
		<servlet>
			<servlet-name>HelloServlet</servlet-name>
			<servlet-class>com.getParam.MyFirstServlet</servlet-class>
		</servlet>
		<!-- servletとURLパターンを関連付ける -->
		<servlet-mapping>
			<servlet-name>HelloServlet</servlet-name>
			<url-pattern>/hello</url-pattern>
		</servlet-mapping>

		<!-- 以下同じclassesフォルダーに配置するサーブレットごとにマッピング情報を書く -->

</web-app>

必要な記述は<servlet>と<servlet-mapping>
<servlet>では<servlet-class>でサーブレットのクラス名、パケージに属する場合はパケージ名も含めて記述する。
<servlet-mapping>では<url-pattern>でサーブレットをWebクライアントから呼ぶ(action=”xxxx”)疑似URLを「/」付きで記述する。
両者を紐付ける名前を<servlet-name>に記述する。

※配備記述子はコンテキストルート毎に在っても良いが、servlet-nameはwebapps以下でユニークでなければいけない。
※サーブレットをコンパイルしなおしたら、Tomcatは一旦停止し、再起動する。起動のタイミングでサーブレットのclassファイルがキャッシュされるため。

カテゴリー: JSP_Servlet | コメントする

Windows10でPostgresをJavacから使う。

データーペースを使う開発ではeclipseを使うこともありますが、素のままでデータベースを扱う経験もJavaとJDBCドライバーの関係を理解する上では必要でしょう。
また、その方が開発スピードが早い場合もあります。

そこで。Eclipse抜きでPostgres用JDBCをコンパイル、リンクする場合の手順は
1)PostgresのサイトからJDBCをダウンロードする。
https://jdbc.postgresql.org/download.html
ダウンロードしたjarファイルにJDBCドライバー類が入っている。

2)ダウンロードしたjarファイルを動作中のJREの下記パスにコピーする。
C:\Program Files\Java\jre1.8.0_121\lib\ext

3)ユーザ名、パスワード、コネクトするテーブル名を確認したJavaソースファイルをコンパイルし実行します。

カテゴリー: PostgreSQL | Windows10でPostgresをJavacから使う。 はコメントを受け付けていません

Windows10でPostgresにログインできない場合の解決策

psql コマンドでPostgresにログインする際、
>psql
とユーザ名を省略するとOSのログインユーザ名が使われます。
このため、OSのログインユーザ名は通常Postgresのインストール時にはrootユーザとして登録されないのでログインに失敗します。
または、根本的にPostgresのインストール時に指定したrootユーザのパスワードを忘れてしまった場合には当然ログインできません。

解決のためには、Postgresのログイン情報を書き換える必要があります。まず、
1)Postgresにログイン設定を変更し強制的にログインしてから、
2)ログイン情報を書き換え、
3)ログイン設定を正常に戻します。
これには次の二つのファイルが関係しています。括弧内はそれぞれのパスを示します。
1)pg_hba.conf (C:\Program Files\PostgreSQL\<バージョン番号>\data)
2)pgpass.conf (C:\Users\\AppData\Roaming\postgresql)

修正手順は、
1)pg_hba.confを下記のように変更し、パスワードなしで強制的にログインできるようにする。
ファイル末尾付近の「# IPv4 local connections:」を探し、文末のMETHODをmd5からtrustに変える。
これにより、ユーザ名を省略した場合pgpass.confを見に行くようになります。

[pg_hba.confの内容]
# If you want to allow non-local connections, you need to add more
# "host" records.  In that case you will also need to make PostgreSQL
# listen on a non-local interface via the listen_addresses
# configuration parameter, or via the -i or -h command line switches.

       (途中省略)

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
#host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

2)pgpass.conf内の末尾に何か書かれていると、それがルートユーザのパスワードになります。
指定が無ければ、psqlでPostgresの起動時にパスワードを聞いてきます。

[pgpass.confの内容]
localhost:5432:*:postgres:(デフォルトのパスワード文字列)

起動時パスワードを聞いてこない設定
localhost:5432:*:postgres:root  (rootユーザpostgres、パスワードroot)
起動時パスワードを聞いてくる設定
localhost:5432:*:postgres:  

Postgresにログインしたら、alterコマンドを使ってユーザーに希望のパスワード文字列を与えます。
alter role postgres with password ‘パスワード文字列’;

3)pg_hba.confの変更箇所を元のmd5に戻します。

カテゴリー: PostgreSQL | Windows10でPostgresにログインできない場合の解決策 はコメントを受け付けていません

program filesとprogram files(x86)の違い

program filesフォルダ
64bit版対応ソフトのインストール先。

program files(X86)フォルダ
32bit版ソフトのインストール先。X86は64bitCPUで32bitソフト動かす互換技術。(WOW64)

カテゴリー: MS Office | program filesとprogram files(x86)の違い はコメントを受け付けていません

サーブレットでの日本語表示・入力

サーブレットとブラウザ間の文字の入出力にはdoGetメソッド、doPostメソッドを使いますが、どのようにこれらを使うか、については多くの情報が検索できますし、書物でも解説されています。
しかし、入出力時の文字コードを適切に設定しないと日本語を扱う場合に文字化けが起こり、情報も少ないため、この解消には苦労をします。
そこで、なぜ文字化けが起こるのかを推測を含め整理します。

まず、HTMLの文字コードは以下の順で処理されます。
1. HTTPヘッダのContent‒Typeのcharsetの値
2. HTML内のMETAタグのContent‒Typeのcharsetの値
しかし、サーブレットコンテナは指定がない限りContent‒Typeのcharsetをデフォルトの文字コードに設定するのでサーブレットの中のmetaタグ指定は無視されます。tomcatの場合デフォルトの文字コードはISO-8859-1(アルファベット)なので日本語は文字が化けることになります。
そこで、文字コードをHTTPヘッダのContent‒Typeで指定する必要があります。

日本語の表示の場合は、データがブラウザに返される前にHttpServletResponseインタフェースのsetContentTypeメソッドで日本語の文字コードを設定します。

public class MySecondServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html; charset=Windows-31J");
(以下省略)

つぎに日本語の入力の場合は、これとは別にHttpServletRequestインタフェースのsetCharacterEncodingメソッドで指定します。

		req.setCharacterEncoding("Windows-31J");

これで入力も正しく処理されるはずなのですが、doPostメソッドは良いのですが、doGetメソッドの場合は文字化けが治りません。
調べたところ、「Tomcat5.xよりFORMのGETメソッドでパラメータを送信した場合、setCharacterEncodingメソッドを無視するようになった。」という情報があり、その解消のためには「(tomcatのconfフォルダー内の)server.xmlファイルのタグのuseBodyEncodingForURI属性をtrueに指定する」必要があるとの事で、タグを以下のように修正しました。。

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true" />

ところが、これだけではdoGetメソッドの文字化けは解消ぜず、文字コードの指定をUTF-8に変更して日本語を正しく入力できるようになりました。

public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
//	req.setCharacterEncoding("Windows-31J");
//	resp.setContentType("text/html; charset=Windows-31J");
	req.setCharacterEncoding("UTF-8");
	resp.setContentType("text/html; charset=UTF-8");

この原因はdoGetメソッドがURLパラメータで情報を受取るため、内部処理が全てUTF-8のサーブレットが情報をWindows-31Jで受取り文字化けを起こしている、のではないかと推測されます。
一方、doPostメソッドの場合には情報はフォームを使って送られるのでメソッドの中でWindows-31JをUTF-8に変換しているため、指定する文字コードがWindows-31Jでないと文字化けを起こす、と推定されます。

public void doPost(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
	req.setCharacterEncoding("Windows-31J");
	resp.setContentType("text/html; charset=Windows-31J");
//	req.setCharacterEncoding("UTF-8");
//	resp.setContentType("text/html; charset=UTF-8");
カテゴリー: JSP_Servlet | サーブレットでの日本語表示・入力 はコメントを受け付けていません

サーブレットの隠蔽(web.xmlの構造)

サーブレットの隠蔽はWeb.xmlファイルの<servlet>と<servlet-mapping>により行われます。
servletタグでは<servlet-class>によって起動するサーブレットのクラスファイルをpackage情報付きで定義し、<servlet-name>で紐づけのための名前を与えます。
一方servlet-mappingタグの中で、この名前を使い<url-pattern>で実際には存在しない疑似パス名を定義し、起動するサーブレットとの紐付けを行います。

		<!-- servletのクラスに名前を設定する -->
<servlet>
	<servlet-name>ParamServletJP</servlet-name>
	<servlet-class>com.getParamJP.MySecondServletJP</servlet-class>
</servlet>
		<!-- servletとURLパターンを関連付ける -->
<servlet-mapping>
	<servlet-name>ParamServletJP</servlet-name>
	<url-pattern>/helloJP</url-pattern>
</servlet-mapping>

このWeb.xmlはtomcat起動時に読み込まれるので、ファイルを変更したら必ずtomcatをstopし、再度startします。またこの時プロキシ―が設定されていたり、tomcatに誤った設定をしていたりするとstartに失敗することもあるのでService Statusが必ずStartedになったことを確認してください。
tomcatのサービスステータスはstarted

カテゴリー: JSP_Servlet | コメントする

サーブレットの配置

サーブレットを呼び出しは以下の様に行います。
http://<ホスト名>:<ポート番号>/<コンテキストルート名>[/<疑似パス名>]

その為には、サーブレットを次のように切に配置するとともに付随した情報を適切に配置しなければいけません。
なお、コンテキストルート名とは、tomcatがインストールされたホルダーのwebappsの下に置かれるフォルダー名の事であり、疑似パスとは起動したいサーブレット名を外部に隠蔽するための疑似的なパス名の事です。

コンテキストルートの直下にはサーブレットのパケージ群ごとのフォルダーを置き、その下に各パケージ毎に下図のフォルダー構成で必要なHTMLファイルやXMLファイル、classファイルを置きます。
下記の図ではiLXXというフォルダーがサーブレットのパケージ群ごとに与えられたフォルダーです。このフォルダーにはコンテキストルート名だけが呼ばれた時にtomcatが自動的にブラウザに送るページであるindex.html()が置かれます。

また、このフォルダーにはWEB-INFフォルダーを配置し、このホルダー内の起動したいサーブレット名と疑似パス名を紐づけるweb.xmlファイルとclassesフォルダーを作ります。さらにclassesフォルダー以下にはclassファイルのpackage情報に対応したフォルダー構造を作り、サーブレットのソースファイル(ソースファイルは別の場所でも可)およびクラスファイルを置きます。
サーブレットコンテナのファイル構造

サーブレット名を外部に隠蔽するためのweb.xmlの記述については別項目を参照ください。

カテゴリー: JSP_Servlet | コメントする

マルチバイト文字列を扱う場合の注意 文字コード

Rubyでマルチバイト文字(日本語等)を扱う場合には文字コードを文字列の前で宣言する必要がある。

文字コード	宣言文
Shift_JIS	# coding: shift_jis
Windows-31J	# coding: windows-31j(またはsjisやcp932も可)
EUC-JP		# coding: euc-jp
UTF-8		# coding: utf-8(文字列がutf-8で書かれていれば不要)
例
# coding: sjis
print "Rubyのコメント
#		#以降行末までがコメント
""=begin""、""=end""の対
		それぞれ行頭に置いて、二対間をコメントとして扱う"
カテゴリー: Ruby | コメントする

文字列 ”と’の使い分け

文字列の記述は文字列を”または’で囲う。但し、それぞれが対でなければいけない。
文字列の中で”または’を使いたい場合は、使いたい文字記号とは違う文字記号で文字列を囲う。
または文字記号を二つつづけてエスケープする。

カテゴリー: Ruby | コメントする