2012年3月22日木曜日

やり直し JAVAサーブレット(基礎からのサーブレット/JSP [改訂版] )その9


(p140) 入力チェックを行う

その8ではエラーチェックの無い干支計算プログラムを示したが、
全角で西暦を入力した場合などは、例外が発生してしまう。

テキストでは半角数値以外の文字列が入力された場合に、
エラー処理を行うプログラムが紹介されている。


eto2.jsp

<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<body>
<h2>干支計算
(入力チェック付)</h2>
生まれた年を入力してください。

<form action="../input/EtoServlet2">
    西暦<input type="text" name="year">年 
<%-- *1 --%>
    <input type="submit" value="計算"> <%-- *2 --%>
</form>
</body>
</html>


 <%-- *1 入力された文字列を、変数名 "year" で管理 --%>
 <%-- *2 value属性でボタンに表示する文字列を設定 --%>




EtoServlet2.java

package chapter10;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.*;
import javax.servlet.http.*;

public class EtoServlet2 extends HttpServlet {

    final static String[ ] ETOS = new String[ ]  {

       "子(ね)", "丑(うし)", "寅(とら)",
            "卯(う)", "辰(たつ)", "巳(み)", 

       "午(うま)", "未(ひつじ)", "申(さる)", 
     "酉(とり)", "戌(いぬ)", "亥(い)",    };

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        String yearStr = request.getParameter("year");

        String error = null;       // エラーメッセージを管理する参照変数(error)をnullで初期化
        String etoText = null;     //  計算結果(干支)を管理する参照変数(etoText)をnullで初期化

        if (yearStr == null || yearStr.length() == 0) {     //  文字列が入力されたかをチェック
            error = "何か入れてね";           
        }

        if (error == null) {   // 文字が入力された場合
            try {
                int year = Integer.parseInt(yearStr);   //  文字列を数値に変換
                if (year < 0) {                  //
                    error = "紀元前の人はサポート外です";
                } else {
                    int index = (year + 8) % 12;
                    etoText = ETOS[index];
                }
            } catch (NumberFormatException e) {
                error = "年を入れてください";
            }

            response.setContentType("text/plain; charset=Windows-31J");
            PrintWriter out = response.getWriter();

            if (error != null) {
                out.println(error);
            } else {
                out.println("あなたの干支:" + etoText);
            }
        }
    }
}





情報処理 再チャレンジ ブログ ホーム へ

2012年3月21日水曜日

やり直し JAVAサーブレット(基礎からのサーブレット/JSP [改訂版] )その8

(p136) 入力チェックと値の変換

サーブレットに渡される入力パラメータは文字列である。
それでサーブレットよっては数値・日付等への型変換が必要になる。
また、正しい値が送られてきているかチェックをする必要がある。

ブラウザ(.jsp)から西暦で4桁の年を入力すると、干支を返すサーブレット(.java)
が紹介されている。

まずは、入力チェックのないプログラム。


eto.jsp
<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<body>
<h2>干支計算</h2>
生まれた年を入力してください。

<form action="../input/EtoServlet">
    西暦<input type="text" name="year">年 
<%-- *1 --%>
    <input type="submit" value="計算"> <%-- *2 --%>
</form>
</body>
</html>


 <%-- *1 入力された文字列を、変数名 "year" で管理 --%>
 <%-- *2 value属性でボタンに表示する文字列を設定 --%>




EtoServlet.java

package chapter10;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.*;
import javax.servlet.http.*;

public class EtoServlet extends HttpServlet {



    final static String[] ETOS = new String[] { /* *1 */ 

        "子(ね)","丑(うし)","寅(とら)",
        "卯(う)","辰(たつ)","巳(み)",
        "午(うま)","未(ひつじ)","申(さる)",
        "酉(とり)","戌(いぬ)","亥(い)",
        };


    public void doGet(HttpServletRequest request,HttpServletResponse response)
        throws    IOException,ServletException {

        String yearStr = request.getParameter("year"); 
/* *2 */
        int year = Integer.parseInt(yearStr); /* *3 */

        int index = (year + 8) % 12; 
/* *4 */
        String etoText = ETOS[index];

        response.setContentType("text/plain; charset=Windows-31J");
        PrintWriter out = response.getWriter();

        out.println("あなたの干支:" + etoText);
    }
}



/* *1 String 型のオブジェクトの入れ物をメモリ上に確保し、そこに入る
オブジェクトを定数として管理する為の、ETOS[ ] 配列を宣言している。 */

/* *2  オブジェクト変数( request )が指し示すメモリ上のオブジェクトに格納
されている値を、オブジェクトが持つ getParameter()メソッドで取り出し、
それを String 型のオブジェクトとして改めてメモリ上に生成し、
  オブジェクト変数(yearStr) で記憶させている。  */


/* *3  なぜ8を足しているのかわからない。定石なのだろうか? */






情報処理 再チャレンジ ブログ ホーム へ

2012年3月20日火曜日

tomcat7 tomcat6 での文字化け対処

基礎からのサーブレット/JSP [改訂版] で
サーブレットの学習をしてきたが、
どうしても日本語の文字化けを解消できない。
いろいろ調べてみると、server . xml の 
<Connector> 内に


useBodyEncodingForURI="true" を
 
記述すると良いらしい。
 
 
 上の写真は tomcat6 の server.xml に追記ものです。 
 
記述後、tomcat を再起動したら、
 
日本語が文字化けせずに表示されました。 
で勉強させて頂きました。 
 
  


情報処理再チャレンジブログ ホーム





2012年3月18日日曜日

はじめてのJSP&サーブレットプログラミング[第5版] 覚書 その1

(p155) 
クラスメソッドという特殊なメソッドのみで作られるクラスは、オブジェクトを作らなくても利用できます。main()メソッドもクラスメソッドであり、JavaVMから呼び出されています。

(p158)
クラスの定義を行うと、同時にクラス名と同じ名前のデータ型が作られる。
boolean , char , int , double などのように、定義したクラス名 型  の変数(参照変数)を宣言できる。

(p158)
Car carObj = new Car() ; 
参照変数(carObj) と ”=” を組み合わせて場合、 ”=” は代入ではない。
オブジェクトを carObj に入れる事はできない。

new Car() で生成した、メモリー上に存在する オブジェクト を
参照変数(carObj)に 『参照させる』 = オブジェクトの場所を確認させている。そして、
その場所を覚えさせている。


オブジェクトの場所を覚えた ”carObj” を [ carObj . speed = 0 ; ] のように使うと、
carObj が覚えている オブジェクト が持つ、speed と言う変数に ”0” を設定できる。






情報処理 再チャレンジ ブログ ホーム へ


2012年3月11日日曜日

やり直し JAVAサーブレット(基礎からのサーブレット/JSP [改訂版] )その7

(p129) さまざまな入力フォーム

 HTML も JAVAコードも、なんだか難しくなってきています。
. jsp ファイルの ”<form action= ” の記述はこれまでと同じ要領で
修正しましたが、すべてテキスト通りの入力で問題なく動作しました。

サーブレットの出力結果は、順番がバラバラになります。

(p133) 練習問題

ブラウザのテキストボックスに入力した数値と、サーブレットが
ランダムに作り出した数値を比較して、一致した場合に ”当たり” と
表示させるプログラム。 一行一行じっくり解釈していく。

guess.jsp
<%@page contentType="text/html; charset=Windows-31J" %>
<html>
<body>
<h2>数当てゲーム</h2>

0~9の数字を入れてください。
<form action="../input/GuessServlet">    
<%-- *1 --%>
    <input type="text"; name="number">  <%-- *2 --%>
    <input type="submit" value="送信">
</form>
</body>
</html>


 <%-- *1 formの値をGuessServlet.javaに渡す --%>
 <%-- *2 入力された文字列を、変数名 "number" で管理 --%>



GuessServlet.java
package chapter10; /* *1 */

import java.io.*;

import java.util.Random;
import javax.servlet.*;

import.javax.servlet.http.*

public class GuessServlet extends HttpServlet {


    private int hit = new Random().nextInt(10); /* *2 */
 

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws
        IOException,ServletException {
 

        String numberStr = request.getParameter("number"); /* *3 */
        int number = Integer.parseInt(numberStr); /* *4 */
        response.setContentType("text/plain; charset=Windows-31J");
        PrintWriter out = response.getWriter();
        out.println("数字:" + number);

        if (hit == number) {
            out.println("当たり");
        }else{
            out.println("はずれ");
        }
    }
}

/* *1 小生の場合です。  */
/* *2  Random()クラスのオブジェクトを生成し、そのオブジェクトに乱数を作らせ、
int 型の変数 hit に保存。*/
/* *3  オブジェクト変数( request )が指し示すメモリ上のオブジェクトに格納されて
いる値を、オブジェクトが持つ getParameter()メソッドで取り出し、それを
String 型のオブジェクトとして改めてメモリ上に生成している。
getParameter() は String 型のオブジェクトを返すように作られている為。*/
/* *4  String 型のオブジェクトから int 型の数値を作り出している。これで Random()
で生成した数値とJSPから送られてきた値を比較できるようになった。*/




情報処理 再チャレンジ ブログ ホーム へ

2012年3月10日土曜日

やり直し JAVAサーブレット(基礎からのサーブレット/JSP [改訂版] )その6

(p122) GET と POST

Webブラウザ と Webサーバ間の情報伝送は、

Webブラウザ  Webサーバ … リクエスト
Webブラウザ  Webサーバ … レスポンス

で、リクエストには、

”指定したファイルを下さい! ”    … GET
”私の情報を受け取って下さい!”  … POST

があり、GETやPOSTの事をリクエストメソッドと言う。
リクエストメソッドには、以下のようなものがある。

リクエストメソッド  サーブレットのメソッド   説明
GET          doGet()           コンテンツを取得する。情報を送信する。
POST         doPost()          情報を送信する。
HEAD         doHead()          ヘッダ部分を取得する。
PUT          doPut()           コンテンツを作成、更新する。
DELETE        doDelete()         コンテンツを削除する。
OPTIONS       doOptions()         使用可能なオプションの一覧を返す。
TRACE        doTrace()          ループバックを起動する。

これらは、HTTP の リクエストメソッドの種類に応じてサーブレットが
適切に処理する為に HttpServlet . class に用意されている。
サーブレットを作成する際に、HttpServlet クラスを拡張して、必要に
応じて doGet()、doPost()をオーバーライド する。


(p124) GETとPOSTの両方を使ったサンプル。

テキストのJSPコード( . . /servlet/input . MethodServlet~)を修正し、
. JSPファイル、. javaファイルを所定のフォルダに配置し、. javaファイルの
コンパイル、web . xml への追記、tomcat の再起動。

ブラウザで期待通りの結果が得られる。

日本語入力は依然として文字化けする(悔)が、先へ進むことにする。

文字化け解消法はこちら


(p127) GETでもPOSTでもパラメータの取得方法は同じ

String msg = request . getParameter(message) を解析したいと思う。
①   ②      ③       ④

①msg は、サーブレット内で使われる String(文字列)型の変数名で、
メモリー上のアドレスが格納される。
ブラウザからのリクエストでサーバが受け取った文字列が、
最終的にこの変数名を使い out オブジェクトの持つ println()メソッド
によって文字列として吐き出される。
※PrintWriterクラスとかが絡み合っていてすっきりとしたイメージが
   もてない。詳しく解説して欲しい。
②request は、コンテナがブラウザからのリクエスト情報を元に、
HttpServletRequest クラスのインスタンスとして生成したもの。
③getParameter()メソッドは、①のインスタンスが持つメソッドで、
変数(パラメータ) に格納されている値を取り出すメソッド。
④message は、ブラウザのテキストボックスに入力された文字列
を、ブラウザが一時保存する入れ物(変数名)で テキストの
例では ” hello ” が格納される。
この ” message ” はHTTPの約束事に則り、
ブラウザからサーブレットに送られる。

GETとPOSTではURLの文字列が変わってくる。
GET  … URLに入力パラメータが表示される。
POST … URLには起動したいサーブレットが表示され、
入力パラメータはHTTPのボディ部に収めらる。
        



情報処理 再チャレンジ ブログ ホーム へ

2012年3月7日水曜日

やり直し JAVAサーブレット(基礎からのサーブレット/JSP [改訂版] )その5

(p112) はじめに


チャプター10以降の開発環境を選択させている。
・Eclipseを使った開発
・コマンドラインでの開発

前者の場合は、P442~P465を習得してからチャプター10を始める。
後者の場合は、これまでのentryフォルダ(Webアプリケーション)の箱に代わり、
basicフォルダを作成し、これまで通り、階層構造にする。




(p114) 入力パラメータの取得


ブラウザからサーブレットに渡される値を、入力パラメータと呼ぶ。
テキストでは、3つの『入力パラメータを扱う HttpServletRequest のメソッド 』
が紹介されている。
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
 これらは、 HTTPというネットワーク間での情報のやり取りに関する約束事に
準拠したデータから、コンテナ(tomcat)が生成したRequestインスタンスが持つ
いくつかのメソッドの内の、ブラウザからの入力パラメータを扱う3つのメソッド。
と言い換えられるかなぁと、理解を深めるためにイメージを膨らませてみた。


(p114) この章で作成するサンプル

作成したファイルを配備する階層が示されている。
basic
input     … JSPファイル(○○ . JSP)などを配備
WEB-INF
src
input … javaファイル(○○ . servlet) を配備
classes
input …  クラスファイル(○○ . class)を配備(コンパイルすると自動配備)


<p116> 作成するファイル

List10-1 echo.jsp とList10-2 EchoServlet.javaを作成し、
所定のフォルダに保存。
EchoServlet.javaをコンパイルし、. classファイルも所定の場所に生成された事を確認。
web.xml を作成して、WEB-INFフォルダに配置。

ブラウザから echo . jsp 呼び出す(自動的に”○○ . java ” , ” . class ”が生成される)。

その後、ブラウザの textbox に文字を入力し送信ボタンを押下すると、
エラーメッセージが表示される。
どうやら、
” <FORM ACTION=" . . /servlet/input . EchoServlet"> ” の記述が良くないようだ。

EchoServlet . class を起動させたい場合は、” /EchoServlet ” とブラウザに入力する。
※web.xml に マッピングした通り
JSPファイルから EchoServlet を起動させたい時は、


”<FORM ACTION ”タグ内に、”  . . /EchoServlet ” を指定する。

テキストで、” . . /servlet/input . EchoServlet ”と記述してあるのは、
invoker サーブレット の関係(小生はtomcat7 の為有効にしていない)なのだろう。
この辺の事でも初心者には原因を突き止めるのが難しい。
もう少し説明が欲しいところだ。

適切に修正し,、
ブラウザのテキストボックスに ” ai ” と入力し、送信ボタンを押下すると、
ブラウザはHTMLに記載されている(<form action=”~”>)通り、
EchoServlet を呼び出し(ブラウザのアドレス欄が自動的に…)、
” ai ” というデータを渡す。

ブラウザのアドレスランには ”EchoServlet”(サーブレット名)と
”message=ai”(入力パラメータとデータ)を ” ? ” で結合しているのが
見て取れる。



テキストボックスに入力された文字列 ” ai ” は html(JSP)ファイルで用意
された ” message ”という入れ物に格納され、EchoServletに渡された。

【クライントは、http に準拠した形式でWebサーバを指定し、データを送る 】

Webサーバ(コンテナ)はそのデータを元にリクエストインスタンスを生成し、
サーブレット(EchoServlet)に渡す(同時にレスポンスインスタンスを渡す)。

EchoServlet の doGet() メソッドは2つのインスタンスを元に処理を実行する。
ここでは、リクエストインスタンスが持つ getParameter()メソッドで、
ブラウザが message という変数に格納した文字列を msgと いう変数に
入れている。

レスポンスインスタンスが持つ、setContentType()メソッドで文字タイプなどを
設定し、

レスポンスインスタンスが持つ、getWriter()メソッドで out と言う変数に
PrintWriterクラスのインスタンスを生成した後、アドレスを格納している。

out が示す インスタンスの println() メソッドで、ブラウザへ返す文字列を出力
している。


(p119) 日本語を入力する

URLエンコードとは、WebブラウザとWebサーバ間でのデータ伝送を行う際に、
入力パラメータに収まったデータ(日本語)は、16進数2桁の文字コードに変換
される等の約束事がありますが、 サーバに送るデータ部を明瞭に示す為と
言う事ですね。 indexさんのページで勉強させてもらいました。

「xyz=x=a」と記述された場合は、データ部を解釈できないからです。
この問題を解決するためにURLエンコードという手法を使い、データ部を特殊文字に置き換える
事によって解決します。「xyz=%82%A1%AB%62」 。

テキスト通り ” EchoServlet2 ” を入力し日本語を表示させたいと思ったのですが、
期待した結果が得られず、先へ進むことにしたが(残念)、


文字化け解消法はこちら
要は、サーブレットの doGet() メソッド内で、まず先にエンコーディングを指定する
事が重要と言う事ですね。


(p121) TomcatのGETパラメータのデコード

小生が現在使っている tomcat は 7 なので、テキストで示している
” useBodyEncodingForURI ” は無い。 



情報処理 再チャレンジ ブログ ホーム へ