スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

基礎からのサーブレット/JSP(10日目)

基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)
(2007/03/01)
宮本 信二

商品詳細を見る


CHAPTER10 入力パラメータの取得(その1)

入力パラメータを扱うHttpServletRequestのメソッドは以下のものがある


String getParameter(String name)
 →指定した名前のパラメータのVALUEを取得。無い場合はnullが返る
String[] getParameterValues(String name)
 →チェックボックスのような同じ名前の入力パラメータの取得に使用無い場合はnullが返る
Enumeration getParameterNames()
 →パラメータの名前の一覧を返す

フォームデータを受け取る簡単なサンプルを作ってみる
echo.jsp

<%@page contentType="text/html; charset=UTF-8" %>
<HTML>
<BODY>
<H2>EchoServletの入力</H2>
<FORM ACTION="../servlet/input.EchoServlet">
  <INPUT TYPE="TEXT" NAME="message">
  <INPUT TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>


EchoServlet.java

package input;

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 EchoServlet extends HttpServlet {

  /**
   *
   */
  private static final long serialVersionUID = 5666736375421424696L;

  
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException , IOException{
    String msg = request.getParameter("message");
    response.setContentType("text/plain; charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("message="+msg);
  }
}


リクエストパラメータの説明については
CGIあたりから散々やってきているので理解しているっていうのと
この勉強で実につけたい事とは違っているため、割愛。

まだまだついていける。メソッドはコアなものだけを抽出しているせいか
思ったよりも数が無かった。これなら覚えちゃえそう。
スポンサーサイト

基礎からのサーブレット/JSP(9日目)

基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)
(2007/03/01)
宮本 信二

商品詳細を見る


CHAPTER9 コンテキストパスを理解する
呼び方の問題だけど話が通じる通じないにかかわってくるので覚えておく

Webアプリケーションサーバはアプリケーションをコンテキストという単位で管理する。
そして、Webアプリケーションの最上位パスはコンテキストルートと呼ばれる


実際にはこんな感じ

http://localhost:8080/entry/index.html
緑の位置がコンテキストパス
赤の位置がコンテキストルート
index.htmlまでがリソースのURL


JSPでは以下のような記述でコンテキストパスを取得できる。

<%=request.getContextPath()%>


requestは暗黙オブジェクトらしい。詳しくはまた後でやるだろう。

絶対パス、相対パスに関してはいまさらと言う感じなのでパス。
さすがにこのあたりは理解している。

基礎からのサーブレット/JSP(8日目)

基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)
(2007/03/01)
宮本 信二

商品詳細を見る


CHAPTER8 初めてのJSP

何だか突然CHAPTERのページ数が増えたので覚えておくべきだろうなと思うところだけ
まとめて書くことにする。

JSPの式

<%= 1 + 1 %>

この部分には「2」が表示される。Javaの文の末尾の「;」がつかないことに注意。

JSPは実はサーブレット
JSPは最初にアクセスがあった際に、
サーブレットのjavaファイルへ変換

サーブレットのjavaファイルをコンパイル。classファイルを作成

classファイルへアクセス
という処理が行われる。2回目以降は直接classファイルへアクセスするようで
javaファイルへの変換、コンパイルは行われない。

中間ファイルの場所
JSPのソースファイルから変換されたjavaファイル、classファイル(中間ファイル)は
Tomcatのデフォルトで{コンテキストのディレクトリ}/work/Catalina/localhost/entryに保存される。
JSPの挙動がおかしくなったらworkよりしたのファイル、フォルダをすべて削除してみるといいかも。

JSPを変更した場合
サーブレットを変更した場合はコンテキストをリロードする必要があったが、JSPに関しては
その必要はない。ソースを書き換えたら、Tomcat側がjspファイルと変換後のファイルのタイムスタンプを
比較し、JSPのソースが新しい場合、再び変換→コンパイルという作業を行ってくれる。


スクリプトレット
以下の<% ~ %>で括られている部分をスクリプトレットと呼ぶ

<HTML>
<HEAD>
<TITLE>Scriptlet</TITLE>
</HEAD>
<BODY>
<H2>JSP Scriptlet</H2>
<%
int count = 0;
for( int i=0;i<10;i++){
  count+=1;
}
%>

count = <%=count%>
</BODY>
</HTML>



出力用の変数out
JSPでは何も宣言せず、いきなり使用できるoutという暗黙のオブジェクトがある
利用できるメソッドはprintln(...)とprint(...)標準出力ではなく、
ブラウザのレスポンスへ出力を行ってくれる。

<HTML>
<HEAD>
<TITLE>Scriptlet</TITLE>
</HEAD>
<BODY>
<H2>JSP Scriptlet</H2>
<%
int count = 0;
for( int i=0;i<10;i++){
  count+=1;
}
out.println("count=" + count);
%>
</BODY>
</HTML>

out変数は・・・
・JspWriterというクラスのインスタンス。
・print系メソッドの引数にはString,Object,intなどの各プリミティブが指定可能。

JSPのコメント
こんな感じで書きます。

<%-- JSP Comment --%>



コンテンツタイプの指定
こんな感じで行います。

<%@page contentType="text/html; charset=UTF-8" %>
<HTML>
<HEAD>
<TITLE>contentTypeの指定</TITLE>
</HEAD>
<BODY>
<H2>コンテンツタイプの指定</H2>
1たす1は
<%= 1 + 1 %>
</BODY>
</HTML>

<%@ ~ %>で記述されているタグはディレクティブと呼ばれ、JSPの各種設定を行う。
基本的な書式は以下。

<%@<ディレクティブ名> <属性>=<値> %>


import宣言
以下のように記述を行い、外部のクラスを呼び出すことができる。

<%@page contentType="text/html; charset=UTF-8" %>
<%@page import="java.util.Date" %>
<HTML>
<HEAD>
<TITLE>now</TITLE>
</HEAD>
<BODY>
現在時間は <BR>
<%= new Date() %>
</BODY>
</HTML>



複数クラスをimportするときは以下のように指定できる

<%@page import="java.util.Date" %>
<%@page import="java.io.PrintWriter" %>

または
<%@page import="java.util.Date,java.io.PrintWriter" %>



練習問題
こんな感じでいけたけど

<%@page contentType="text/html; charset=UTF-8" %>
<%@page import="foo.Menjan" %>
<% Menjan menjan = new Menjan(); %>
<HTML>
<HEAD>
<TITLE>AI面雀</TITLE>
</HEAD>
<BODY>
<H2><%=menjan.getWord()%></H2>
</BODY>
</HTML>

解答例はimportも代入もいらなかった。importの行を消して
H2タグの中身を以下に書き換えることでも問題ないらしい。なるほどねー。

<%=new foo.Menjan().getWord()%>



チャプターのページ数とかが跳ね上がったので
いよいよ本格的になってきたんだろうか。
いずれにしてもここからが知りたい事山盛りのはずなので
気合を入れて行きたい。

基礎からのサーブレット/JSP(7日目)

基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)
(2007/03/01)
宮本 信二

商品詳細を見る


CHAPTER7 サーブレットを簡単に作る

invokerサーブレットの設定

invokerサーブレットを使うとweb.xmlの記述を省略し、サーブレット名の指定のみで
サーブレットを呼び出すことが出来るようになる。

${CATALINA_HOME}/conf/web.xmlの121行目付近の記述を有効にする(Tomcat6.0.24)
※invokerサーブレットのservlet要素を有効にする。

  <servlet>
    <servlet-name>invoker</servlet-name>
    <servlet-class>
     org.apache.catalina.servlets.InvokerServlet
    </servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>



${CATALINA_HOME}/conf/web.xmlの121行目付近の記述を有効にする(Tomcat6.0.24)
※invokerサーブレットのservlet-mapping要素を有効にする。

  <servlet-mapping>
    <servlet-name>invoker</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
  </servlet-mapping>



web.xmlを変更したらTomcatを再起動。
すると、以下のようなエラーが出てTomcatが起動できなかった。

java.lang.SecurityException: クラス org.apache.catalina.servlets.InvokerServlet のサーブレットは特権を与えられているので、このWebアプリケーションによってロードできません


調べてみるとどうやらTomcat6でinvokerサーブレットを利用するには
${CATALINA_HOME}/conf/context.xmlのContextタグに以下の記述が必要らしい

<Context privileged="true">



この本の発売日はどうやら2007年。まぁその頃はTomcat5とか出たばっかだし
しゃーないっちゃしゃーないね。

これで以下のURL指定でweb.xmlに追記なしでサーブレットを呼び出すことが可能になる。

http://localhost:8080/{コンテキスト名}/servlet/{完全クラス名}
つまり、
http://localhost:8080/entry/servlet/foo.NowServlet
↑こんな感じで呼び出すことが可能になる。


今なら問題なく理解できるけど、コンテキストの中のクラスってのはTomcat3だか4だかの時代に
コンテキストの記述をカッ飛ばしてできないできない唸ってた気がする。覚えておこう。

あと、忘れないでおきたいのが以下の3点
・invokerサーブレットはセキュリティ面で不安があるらしく開発環境にしか使えない。
・Tomcat独自の機能である
・基本的にはweb.xmlに登録するのが正しい

特にinvokerはイレギュラーな対応だということを忘れないようにしたい。

URLの記述については数年来の悩みが解決して超スッキリ。
さぁ、次はJSPだ。

基礎からのサーブレット/JSP(6日目)

基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)基礎からのサーブレット/JSP 改訂版 (プログラマの種シリーズ)
(2007/03/01)
宮本 信二

商品詳細を見る


CHAPTER6 web.xmlの基本

XML入門
XML文書の構造
XML宣言の指定には以下の属性が指定できる

version:XMLのバージョン、現状1.0固定。
encoding:ファイルのエンコーディングを指定。
standalone:今は覚える必要はない。
実際の記述は
<?xml version="1.0" endocing="UTF-8"?>
などなど



覚えておきたい情報としてルート要素はひとつのみ。
以下のようなXMLは文法的に誤り。

<?xml version="1.0"?>
<books>
・・・
</books>
<books>
・・・
</books>



スキーマ
XMLの構造を定義したものはスキーマと呼ばれる。
そのスキーマを使って文法チェックができる。

スキーマにはいくつか種類がある。
・もっとも簡単なDTD(Document Type Definition)
・XMLスキーマ
・RELAX NG

web.xmlでもサーブレットAPIの2.3まではDTDが使用されていた。
2.4以降はXMLスキーマが利用されている。
web.xmlの構造

web-appsの子要素
ここは覚えておきたい。ここにはかけないけど何かしらの形で残しておきたい。
ここで記述ミスするとエラーの特定がとても面倒なので。

バージョン2.3と2.4の違い
web-appの子要素の順番が決まっているらしく、順番を変えてしまうとエラーになってしまうらしい。
チェックが厳格なんだね。

Servlet2.3だとエラーになるweb.xml

<web-app . . . >
 <servlet>
  <servlet-name>ServletA</servlet-name>
  <servlet-class>ServletA</servlet-name>
 </servlet>
 <servlet-mapping>
  <servlet-name>ServletA</servlet-name>
  <url-pattern>/ServletA</url-pattern>
 </servlet-mapping>
 <servlet>
  <servlet-name>ServletB</servlet-name>
  <servlet-class>ServletB</servlet-name>
 </servlet>
 <servlet-mapping>
  <servlet-name>ServletB</servlet-name>
  <url-pattern>/ServletB</url-pattern>
 </servlet-mapping>
</web-app>


web.xmlにスキーマ定義を付ける

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">
・・・
</web-app>


特に問題なく起動。
まだまだイントロダクションと言った感じが続く。
明日はinvokerサーブレット。
プロフィール

ラム君(モヒカンVer)

Author:ラム君(モヒカンVer)
都内でプログラマのようなものをやっています。
まだまだ初心者ですがよろしくお願いします。

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。