ラベル JAVA の投稿を表示しています。 すべての投稿を表示
ラベル JAVA の投稿を表示しています。 すべての投稿を表示

2012年4月20日金曜日

インポートされた javax.servlet.http は見つかりません

以前作成したWebアプリを修正しようとして、久しぶりに
Eclipseに読み込んだ。

すると Eclipse がエラーを訴えている。


インポートされた javax.servlet.http は見つかりません

javax.servlet.http の 外部JARファイルの追加は
何をどうしたらよいのか さっぱりわからない。 



ビルドパスの構成



【ビルドパスの構成】 画面をよ~っく見ると、TOMCAT_HOME
の記述がおかしい(Eclipseのバージョンが違っている!)。

これは、小生がEclipseを再インストールしているが、その名残
のようだ。

TOMECAT_HOMEの設定を現在のものに書き換えたら、
エラーが解消された。





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

2012年3月23日金曜日

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

(p148) サーブレットフィルタとは

サーブレットやJSP、また、同一Webアプリケーション内で
あればHTML等に共通の前後処理を記述できる仕組み。
たとえば、入力文字エンコーディング。

テキストで javaクラスの配置場所を示している。
これはちと解かりづらいが、Eclipseで開発を行う場合任意の
プロジェクト内にfilterパッケージを作成しその中に記述する
と言うことだろうか。

1.javax.servlet.Filter インターフェイス を実装したフィルタクラスを作成する。
2. web.xmlにフィルタを登録する。



















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

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 ” は無い。 



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

2012年3月3日土曜日

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

(p86) はじめてのJSP

JSPは コンパイルが不要で、web . xml への登録も不要。
作成した . JSP ファイルはコンテキスト名直下(entryフォルダ内)に置く。
tomcat は起動している必要がある。
htmlファイルと同じような特徴です。
JSPのコードもHTMLの中に埋め込むような格好になっている。

コンテキストとは? コンテキスト名とは?(復習) 
http  :  //    localhost   :   8080   /    entry   /   hello.txt
プロトコル      サーバ名     ポート番号   コンテキスト名 ファイルのパス

JSPの式(Expression)とは、
” <%= ”、” %>” で囲む。 


(p88) JSPはサーブレット

この章の始め(p86)に、『JSPはサーブレットと違って…』という記述があったの
だけれど、JSPはサーブレットらしい。クライアントからリクエストが発生した際
コンテナは、

①” . jsp ” ファイルを ”. java”ファイルに変換し、
②その” . java ” ファイルがコンパイルされ、
③”. class”ファイルが生成され、
④”サーブレットのインスタンスが生成される。
という4段階の過程を踏むらしい。
よって、最初にアクセスがあった場合のみ、変換やコンパイルで時間が長くかかるらしい。

これまで、サーブレット(”○○servlet . java” ) を記述した場合、
意識して WEB-INF フォルダ内の src フォルダ を探し、そこに保存してから、
コンパイルするという(class フォルダへ class ファイルの保存は自動的だが)。
少々面倒なことを意識し、  さらには、web . xml に登録しなければならなかったが、
JSP はそれらが不要と言うことですね。
ちなみにコンテナが①~④を実行してくれますが、
” . java ” ファイルや、”. class ” ファイルは、

使用中の tomca tフォルダ > work フォルダ >Catalina フォルダ >localhost フォ
ルダ >entry フォルダ >org フォルダ >apache フォルダ >jsp フォルダ 内に保存
されています。


(p89) JSPを変更した場合

サーブレットを変更した場合は tomcat を再起動(Webアプリケーションをリロード)
する必要がありましたが、JSPの場合は不必要。 なぜ?
それは、JSPにアクセスした時に、再び ①JSPの変換、②javaコードのコンパイル、
③classファイルの生成、④サーブレットインスタンスの生成が行われるから。


(p90) スクリプトレットを使ってみよう

スクリプトレットとは、見た感じ ”JSPの式” に似ている。
<%= ○○○ %>  …  JSPの式
<%   ○○○  %>  …  スクリプトレット

スクリプトレットにはjavaのコードを記述できる。


(p91)  出力用の変数out

out はオブジェクト? 変数? 混乱してきた。
ググッたら、 わかりやすいブログを見つけたので勉強させてもらいました。
稲員勇輝さんありがとうございました。

コンテナは、
" . jsp ファイル” をサーブレットに変換する際に、予めよく使うであろう変数
( out を含む) を宣言してくれているらしい。 よって、JSPコード内でいちいち
out を宣言しなくてもすぐ使えるようになっている。
これも JSP が楽チンであると言う要素ですね。

この out 変数 には、
JspWriter . class 型のインスタンス(インスタンスのアドレス)が入るようになっている。
JspWriter . class 型を詳しく調べたわけではありませんが、どうやらブラウザへの
レスポンスインスタンス(response)に出力する機能を持っているようですね。 

” out ” はオブジェクトと短絡的にイメージしていたが、厳密には
” out ” は インスタンスが存在するメモリー上のアドレスが入るわけで、
変数ですね。

たぶん小生の認識で間違いないと思うのですが、いろいろ確認してみてください。


(p94) JSPのコメント

<%-- JSP Comment --%>  これがJSPのコメント
<!-- JSP Comment -->    これはHTMLのコメント

JSPをサーブレット(javaコード)に変換すると、 javaコードの中にHTMLを生成するが、

そのHTMLの中に <%-- JSP Comment --%>は存在しない。
 
<!-- JSP Comment --> はブラウザでは表示されないが、HTML には存在する。

(p95)コンテンツタイプの指定

JSPでコンテンツタイプを指定するには、” page ディレクティブ ” を使用する。
<%@page contentType="text/html ;  charset=Windows-31J" %>

ディレクティブとは?
<%@ ○○○ %>で記述するタグを言う。
これに、page が付く ( <%page ○○○ %> )と、
ページディレクティブとなる。


(p97) import宣言

外部クラスをインポートする場合は、page ディレクティブの import 属性を使う。
ここでは、現在時刻を表示する訳だが、”java.util.Date”クラスが必要となり、
JSPコードの最初の段階で、
<%@page import= "java.util.Date" %> でDateクラスをインポートしている。

このおかげで、<%= new Date() %> の記述で、日付が求められる。

このインポートの記述は、複数行に分けて、複数インポートすることもできる。
また、ワイルドカード(*)により1行で複数インポートすることもできる。

javax.servlet、javax.servlet.http、javax.servlet.jsp パッケージについては、
デフォルトでインポートされるので記述はいらない。


(p102) コンテキストパスを理解する

”コンテキスト” とは、個々のWebアプリケーション(これまでの内容では ”entry”)

|←      リソースのURL                                  →| 
|←      WebアプリケーションのURL               →|
|←      サーバのURL          →|

 http : // localhost : 8080  /   entry     /   hello.txt
                ↑        ↑         ↑         ↑     ↑
             サーバ名  ポート番号  コンテキスト名     ファイルのパス
                                   
※コンテキストルート         コンテキストパス = コンテキストルートまでの道のり


コンテキストルートには index.html ファイルなどが配備してありますね。

よって、context.jspでは、
サーバのルート("/" = http://localhost:8080)では、
TOMCATのページが表示され、
リクエストインスタンスの getContextPath() メソッドが返す文字列(”/entry” ※)
では、index . html が表示される。
※ 絶対URLに直すと ”http://localhost:8080/entry” と言うことだが、
少々もやもやしている。 


(p105) JSPからサーブレットを呼び出す

テキスト通りコードを入力するも、期待通りの結果は得られない。
”サーバルート”からのパス” は ”servlet”を削除(小生のtomcat7では
invoker を利用できない)することで、表示されるようになったが、
”カレントからのパス” は どのように修正してもエラーとなる。 
そもそも、ここで言う ”カレント(. jspファイルから?)からの” の意味が良く
わからない。理解していないのか?!

いろいろ試した結果、


<p><a href="../../../entry/HelloServlet">HelloServlet</a>
(カレントからのパス)

と変更することで期待通りの結果が表示された。

JSPコードからjavaコードに変換されて、コンパイルで生成されたクラスファイルは

 tomcat7\work\Catalina\localhost\entry\org\apache\jsp 

ここに保存されているということですかね。

まだ、知識が浅いようだ。

取り敢えず先へ進むこととする。



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




2012年3月2日金曜日

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

(p56) 練習問題

現在時刻を返してくるサーブレットを作成させる問題。
なにやら ”java . util . Date()” なるクラスを使うようだ。
いきなり ”PrintWriter out = response . getWriter()” など
を使えば実現できるとの ヒント が出てくるが、
PrintWriter とか もやもやした状態で なんだか気持ちが悪い。
ここまでいつもそんな心境でホントに技術を習得できるのか心配だった。

とりあえず、
①エディターに HelloServlet を読み込み、それを編集後、
名前をつけて classes フォルダ 内 foo フォルダ に保存。
②ディレクトリ WEB-INF へ移動して、 >compile foo/NowServlet . java
エラーが1件( ”;”のつけ忘れ)でたが、難なく
classes フォルダ 内 foo フォルダ に NowServlet . class が生成された。
③web.xml にコードを追加し、
④( Tomcat を再起動することなく )ブラウザに  ~/NowServlet と入力
⑤無事、ブラウザに現在時刻が表示された。

今回の練習問題では、
コンパイルの際に1件のエラーは出たものの、エラーメッセージが理解できた。
また、 ほとんど直感で回答できた。
もやもやしっぱなしではあったが、それなりに実力はついているようで、
ちょっぴり安心した。


(p59) HTMLを出力するサーブレット

ブラウザに ”こんにちは” と表示するだけのサーブレット。
ポイントは、日本語を表示させる為の約束事を確認すること。
doGet()メソッド内、最初の段階で response インスタンスが持つ
setContentType()メソッドで response インスタンス自身に
情報をセットしている。 

詳細はまだもやもやしているが、先へ進むことにしよう。

※一般的な Web アプリケーションでは ” text/html ” とセットするのとの事。
※tomcatでは デフォルト文字エンコーディングが ISO-8859-1 に設定されて
いる為 setContentType()で 日本語の文字円コーディングを設定しなけ
ればブラウザに日本語が表示されない。
※setContentType()で指定した文字円コーディングは PrintWriter からの
出力に利用される。
※PrintWriter オブジェクトを取得する前に、setContentType() を実行しなけ
ればならない。 


(p65) プレーンテキストを表示するサーブレット

”(text/plain; charset=Windows-31J”) と
”(text/html; charset="indows-31J”)  の違いを確認する。

html は<br>が改行を意味するので、ここでは文字列が連続されて表示する。


(p69) 練習問題

P51で出てきた OracleServlet とほぼ同じ技術。違いは日本語を出力するかどうか。
※ setContentType() メソッドを使用する。



(p73) web.xmlの基本

XML(eXtensible Markup Language) とは、文書やデータの構造をあらわす為の
マークアップ言語。 これは HTML のようなタグで 文字を埋め込んでいく方式の
言語を言うらしい。また、eXtesible(拡張)が示すとおりユーザーが自由にタグを
拡張することができるらしい。タグを拡張とは? ???

教訓1 もやもやしてても取り敢えず先へ進む!


XMLの宣言
先頭の1行は <? ~ ?> で括る。これを宣言と言い、省略できるが書いたほうが良い。
ヴァージョンやエンコーディング、スタンドアロン文書(?)かどうかを記述できる。



ルート要素
単一のルート要素(?) さっぱりわからない。


要素と属性
XMLの基本単位は要素。
”文字列” の”文字列”は テキスト要素となる。


要素に付加する付属的な情報を属性と言う。 属性はタグの中に
< ○○ key=value > の形式で記述する。


大文字・小文字
区別される。


開始タグと閉じタグ
HTMLと同じ。<book> ~  </book> とする。
ちなみにテキストに出てる <book/> は誤植であろう。


XMLのコメント
コメントを記述したいときは ”<!--” 、 ”-->” で括る。
< ! -- コメント --> とする。

< ! --
コメント
コメント
コメント
--> 

と言う書き方でも良い。


スキーマ
XMLは複数のプログラムの間でやり取りされるデータである為、
文法チェックを行う仕組みを取り入れている。※省略可
XMLの構造を定義したものをスキーマと言い、これを用いて
文法チェックを行う。
最も基本的なスキーマをDTD(Document Type Definition) と言い、
さらに複雑な定義を行うため、XMLスキーマ、RELAX NG などが利用
できるらしい。API2.4以降XMLスキーマが利用されているらしい。

スキーマの定義(dtd)は下記のようなもの。
<!ELEMENT books (book *)>
(!ELEMENT book (title)>
<!ATTLIST book
isbn CDATA #REQUIRED
>

整形式(Well-Formed)と妥当(Valid)
XMLの基本的な文法(開始タグに対する閉じタグがある)を満たしたXMLは
”整形式のXML” と言い、スキーマが用意されている場合でそのスキーマ(文法)
を満たしているXMLを ”妥当なXML” という。

web . xml では、先頭に宣言があり、次にXMLスキーマを記述し、
その後に<servlet>、<servlet-name>、<servlet-mapping>、<url-pattern>などが
続く。
ここまで何度となく記述していた web.xml は宣言、XMLスキーマなどを省略していた。

<web-app> ~ </web-app> の中に記述していましたね。

HTMLでも、しっかり宣言を入れておいたほうが良いとの話を耳にした事があるが、
※省略可  XMLが少し見えてきた感じがする!!


(p82) invokerサーブレットの設定
今回小生が使用している Tomcat は tomcat7 である。
conf フォルダの中に web . xml はあるのだが、” invoker ” の記述がない。
ググッてみたら、tomcat7 からは invoker サーブレットはなくなっているらしい。
人類みんなごくつぶし さんのブログに詳しく載ってました。

ここの記述は少々複雑でいまいち整理できていないが、
invoker と言う名前で servlet-name を定義して、
servlet-class としては、 何かの サーブレット . class
定義 (コンテナ内にあるの?) し、
pattern/servlet/* として、
ブラウザからフルパスでクラスを指定できるようにしている。

この結果、いちいち作成したサーブレットを web . xml に登録しなくても
良いようになる。

基本、サーブレットは web . xml に登録しないと実行できない。
invoker サーブレットは Tomcat 独自の機能。
invoker サーブレットは セキュリティ上の問題がある。




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

2012年3月1日木曜日

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

(p46) オートリロードの設定
サーブレットの Javaコード( . javaファイル )は
コンテナ上の src フォルダに格納する。そのJavaコードを
コンパイルし生成した . classファイルは WEB-INF フォルダに
配備する。これは基本事項ですね。

これまでの過程で、src フォルダに置いた . java ファイル は
compile . bat  で コンパイルすると、自動的に WEB-INF フォルダ
. class ファイルが生成される。

先ほどの HelloServlet.java ファイルを一部訂正し、再コンパイルすると、
すでに存在している Hello.Servlet.class の内容は更新されている。

結果を確認すべく、
ブラウザ で サーブレット(.class)ファイルが更新されたか確認すべく、
更新ボタンを押すも、画面はまったく変わらない。

コンパイルにより コンテナ内の WEB-INF フォルダに.class ファイルは配備されて

いるはずだが、ブラウザ(クライアント)にはなぜ反映されないのか?
メカニズムははっきり見えないが、コンテナ(Tomcat)を再起動
しなければならないらしい。クライアントは WEB-INF を見に行くと思っていたが、
もう少し複雑なのですね。

前置きが長くなりましたが、ここでは  Tomcat を再起動せずとも、再コンパイルのみで
済ませる技術(Tomcat独自の仕組み)が紹介されている。

コンテキストルート内(entryフォルダ内)に META-INF フォルダを作り、その中に
context.xml を作成する。
内容は <Context reloadable="true"/> だけでよい。
これをコンテナに置きっぱなしにしていると、運用時にパフォーマンスが落ちる。
手動のリロード なるものがあるらしい。
eclipse では、再起動ボタンを押せばすむので、オートリロードは、さほど
重要ではないと思った。


(p48) パッケージ付のサーブレット
パッケージについてはその概念の必要性がはっきりしないが、開発上有効な
ものなのだろう。p49で web.xml に追加しているが、コンテナが持つ サーブレットの
数だけ、<servlet-name>、<servlet-class>、<servlet-pattern>の定義が必要である
ことが見て取れる。
p50では src フォルダ内 に fooフォルダを作成し、その中にBarServlet . java を
作成して、コンパイルするコマンドが乗っている。
> compile foo/BarServlet.java
であるが、p44 で説明があった、”%1にはバッチファイルに渡される引数~” の
意味が理解できた。改めて javac コマンドを ググッてみたが、奥が深いね。



(p54) Oracle . java も自動的にコンパイルされる。
小生は、Oracle . java と OracleServlet . java をそれぞれコンパイルしたが、
ここでは OracleServlet . java のみコンパイルすれば自動的にOracle . java も
コンパイルしてくれる。メカニズムは後から理解できるだろうと思い、深く追求せずに
次に進む事とする。





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

2012年2月28日火曜日

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

(p22) Webアプリケーションのディレクトリ構造
JSP、HTML、画像、TEXTファイルなどはコンテキスト名(entry)の直下に
配置するとの事で、

①”hello.txt” をテキストどおりに作成して配置する。
②tomcat7/bi/Tomcat7w を右クリックで管理者として実行(A)...
③ブラウザのアドレスに ”http://localhost:8080/entry/hello.txt と入力

するも期待通りに表示されない。
”わかりやすい!” と薦められて買ったテキストの、出だしの一番簡単な
箇所で つまづいていては、”サーブレットを諦めろと” 言われているような
もので、一気にテンションが下がってしまった。

これって、よくあるミスなのではないかと思うが、
 webappsフォルダ内に右クリックで entryフォルダを作成し、
entry フォルダ内でまた右クリックして、”hello.txt” を作成していたのである。
その後にメモ帳で hello.txt を編集して上書き保存し、”hello.txt” が完成
したものと思い込んでいた。
このやり方では、”hello.txt.txt” が作成されてしまうのである。

ファイルの拡張子を最初から表示させておけば陥らないミスであった。


(p37) JAVAファイルの作成
ここでサーブレットコードが出ていて、問題なく動作はしたが、
doGet()メソッド のメカニズムがわからず、先へ進めなくなった。
細かい概念はもう少し慣れてきてからとの考えだったのでしょうが、
サーブレットコンテナについてもう少し情報が欲しかった。
doGet()メソッドは2つの引数を持っています。
1つ目の request インスタンスは、なんとなく クライアントからの
リクエストを元に、この第1引数に収まるのはイメージできるが、
2つ目の response インスタンスの response は、
『サーブレットが処理をした後にクライアントに返すもの』 という
イメージから、
・メソッドは引数にインスタンスが入らないと起動しない。
・第2引数はメソッドが処理をした後に出来上がる。
これまでの学習から、どちらも正しいと思うが、そうだとしたら
矛盾が生じる。

を解消する情報が見つけられなくて、実は3ヶ月くらい学習が停止した。

乱暴なイメージだが、
①クライアント → httpサーバ → コンテナ → doGet()メソッド等


②doGet()メソッド等 → コンテナ → httpサーバ → クライアント

で、データが流れるが、①でコンテナが、リクエスト情報を元に doGet()に
渡す2つのインスタンスを生成し doGet()に渡している。
この際、response インスタンスに関しては、せいぜいクライアントが指定して
いるサーブレットが存在するか?しないか?で、200 とか 404 とか の情報を
持つ、その他は空のインスタンスが生成され doGet()メソッドに渡す。



(p44) コンパイル用バッチファイルの作成
JAVAの開発は eclipse を基本とするため、あまり重要ではないとも思ったが、
基本を確実にしたくてテキスト通り compaile.bat を作成する事にした。

@set CLASSPATH=C:\servletbook\apache-tomcat\common\lib\servlet-api.jar
javac -sourcepath src -d classes src/%1

上記2行をバッチファイルとして WEB-INF フォルダーに配置することで、

javac コマンド発行時に 楽してコンパイルできるというもの、

テキストを読んでいて、そう難しくはない記述なのだったが、実行結果が期待通りにならない。
だいぶ悩んだ挙句、”CLASSPATH"を小文字にしていた事が良くなかったようだ。

表記の通り大文字で書き換えたら解決した。


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

2011年4月20日水曜日

Java プログラム 基本情報技術者 午後 過去問

 内部整列

 回答と解説を掲載します。

  JAVA の勉強を始めてから今日で きっかり3カ月だ。
下記の過去問を完璧に理解するまでには、それはもう
かなり苦労しました。 この記事に目をとめてくださった
方々も、中途半端なインチキ教本には振り回されない様
ご注意下さい。
 ※やさしいJ○○


































(プログラム1)



















01 public class PriceSort {















02
public static void main(String[ ] args) {









03

Computer[ ] computers = { 












04



new Server("Sv1", 800, 256, 300000),






05



new PersonalComputer("Pc1", 450, 128, 180000),

06



new Server("Sv2", 800, 512, 500000),






07



new PersonalComputer("Pc2", 450, 256, 200000) };

08

for (int i = 0; i < computers.length; i++) {







09


System.out.println(computers[i]);









10

}






















11

System.out.println("\n<sorted by price>");






12

PriceUtility.ComputeDiscountPrice(computers);




13

PriceUtility.sort(computers);











14

for (int i = 0; i < computers.length; i++) {







15


System.out.println(computers[i]);









16

}






















17
}























18 }















































































(プログラム2)



















01 public interface IComp {















02
int compareWith(IComp a);













03 }















































































(プログラム3)



















01 public class Computer implements IComp {








02
String name;


















03
int frequency;


















04
int memory;



















05
int price;




















06
public Computer(String name, int frequency, int memory, int price) {
07

this.name = name;















08

this.frequency = frequency;












09

this.memory = memory;













10

this.price = price;
















11
}























12
public int getPrice() {















13

return price;

















14
}























15
public void setPrice(int price) {











16

this.price = price;
















17
}























18
public String toString() {














19

return name + ", frequency:" + frequency + ",memory:" + memory
20



+ ",price:" + price;













21
}























22
public double getDiscountRate() {










23

return 0.0;


















24
}























25
public int compareWith(IComp a) {










26

Computer computer = (Computer) a;








27

return computer.price - this.price;









28
}























29 }















































































(プログラム4)



















01 public class Server extends Computer {









02
public Server(String name, int frequency, int memory, int price) {
03

super(name, frequency, memory, price);







04
}























05
public double getDiscountRate() {










06

return 0.1;


















07
}























08 }















































































(プログラム5)



















01 public class PersonalComputer extends Computer {




02
public PersonalComputer(String name, int frequency, int memory, int price) {
03

super(name, frequency, memory, price);







04
}























05
public double getDiscountRate() {










06

return 0.2;


















07
}























08 }















































































(プログラム6)



















01 public class PriceUtility {















02
public static void ComputeDiscountPrice(Computer[ ] a) {

03

int newPrice;

















04

for (int i = 0; i < a.length; i++) {











05


newPrice = (int) (a[i].getPrice() * (1 - a[i].getDiscountRate()));
06


a[i].setPrice(newPrice);












07

}






















08
}























09

























10
public static void sort(IComp[ ] a) {










11

int j;





















12

for (int i = 1; i < a.length; i++) {











13


IComp temp = a[i];














14


for (j = i - 1; j >= 0 && temp.compareWith(a[j]) < 0; j--) {
15



a[j + 1] = a[j];















16


}





















17


a[j + 1] = temp;















18

}






















19
}























20 }






















































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