1. Top » 
  2. プログラミング全般

スポンサーサイト

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

【Java】オブジェクトのスコープとリクエストの属性の話

サーブレットを組み合わせたりすると、そのオブジェクトがどこで使えるのか?を意識しないといけないです。
つまり変数のスコープがあるように、オブジェクトのスコープを考える必要があります。

スコープの種類

リクエスト → サーブレットの処理をJSPで利用する、など一つのリクエスト単位
セッション → ショッピングカートのような同じクライアントに対して処理をする単位
アプリケーション → 同じWebアプリケーションの単位でクライアントは異なってもいい単位

それぞれを扱うためにJavaのクラスが用意されています。

リクエスト → javax.servlet.http.HttpServletRequestインタフェイス
セッション → javax.servlet.http.HttpSessionインタフェイス
アプリケーション → javax.servlet.ServletContextインタフェイス

この三つを利用するためには、次のメソッドを使います。

Object getAttribute(String name)
引数nameで登録されたオブジェクトを取得する
void setAttribute(String name, Object value)
引数valueで指定したオブジェクトをnameという名前で登録する
void removeAttribute(String name)
引数nameで指定したオブジェクトを削除する
Enumeration getAttributeNames()
登録されている名前の一覧を返す

いずれのスコープを使うにしても、このxxxAttributeというメソッドが重要になります。
それでは実際にリクエストのスコープでオブジェクトを保存し
サーブレット→サーブレットの値受け渡しをしてみます。

hogeプロジェクト→Java Resources:src→hogeパッケージ右クリック→ServletA/ServletBを新規作成
ServletA→ServletBと移り、データを渡します。

ServletAに書く

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub
    request.setAttribute("message", "メッセージ");
    RequestDispatcher d = request.getRequestDispatcher("/ServletB");
    d.forward(request, response);
}

ServletBに書く

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String message = (String)request.getAttribute("message");
    response.setContentType("text/plain; charset=Windows-31J");
    response.getWriter().println("message = " + message);}


実行はServletA右クリック→Run As→Run on serverでした。

 

実行結果は次のようになります。

j2ee_09_01 



このように、ちゃんとデータをattributeを使って登録して呼び出せました。


category of Java:
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(一回目)
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(二回目)
【Java】開発環境を活用してサーブレットを書く。
【Java】サーブレットの基本的な話をする
【Java】JSPの話へと移る
【Java】JSPからサーブレットを呼び出す
【Java】パラメータを渡す
【Java】複数のサーブレットを組み合わせるための画面遷移の話
スポンサーサイト

【Java】パラメータを渡す

JSPサーブレットの連携が出来ることは分かりました。
これを利用して、HTML上のフォームなどを入れたJSPサーブレットの連携によって
そのパラメータを取得できます。

hogeプロジェクト→Java Resources:src→hoge右クリック→ParamServletの新規作成
hogeプロジェクト→Web Content右クリック→ParamJSP.jspの新規作成


それぞれ次のように書きます。

JSP
<body>
<h2>パラメータを引き渡す</h2>
<form action="/hoge/ParamServlet">
<input type="TEXT" width="180" name="text"></input>
<input type="submit"></input>
</form>
</body>


formというHTMLの構文はよく使うものです。
たとえばテキスト、テキストエリア、ラジオボタン、チェックボックスなどがあります。
そのACTIONという属性にサーブレットへのリンクを設定します。
これによってサーブレットを呼び出します。

サーブレット
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String msg = request.getParameter("text");
response.setContentType("text/plain; charset=Windows-31J");
response.getWriter().println("text: " + msg);
}


今までrequest、つまりブラウザ→プログラムという方向は利用していませんでした。
パラメータを引き渡すような処理ではこの部分を利用します。
requestからJSPのフォームのうち、nameという属性で指定した名前を用いることで
パラメータの取得を行うことが出来ます。

request.getParameter(名前)


これを実行すると次のようになります。

j2ee_07_01.jpg

入力すると

j2ee_07_02.jpg

渡される。

このようにJSPサーブレットという方向でパラメータを渡せるようになりました。
ただし日本語を入れると文字化けするので

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


という設定が必要です。
※実際にはこれだけでは文字化けするかもしれません
※設定で直るはずなのですが、少し再現出来なくて対策なし

【Java】JSPからサーブレットを呼び出す

JSPはHTMLの中にいろいろとコードを埋め込むのに対して
サーブレットは普通のJavaプログラムの形です。
よってJSP側にはHTMLで用いているような物、たとえばリンクなどが使えます。
これを利用してJSP側からサーブレットを呼び出すことが可能です。

ところで今まで作ってみたサーブレットJSP

http://localhost:8080/hoge/HelloServlet
http://localhost:8080/HelloJSP.jsp


といった形で呼び出すことが出来ました。
これを参考にしてJSPからサーブレットを呼び出してみましょう。

hogeプロジェクト→Java Resources:src→hoge右クリック→JumpServletの新規作成
hogeプロジェクト→Web Content右クリック→JumpJSP.jspの新規作成


として新しいJSPとサーブレットを作成し、次のように書きます。

JSP
<body>

<a href="<%=request.getContextPath()%>/JumpServlet">Go To Servlet</a>

</body>


サーブレット
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/plain; charset=Windows-31J");
response.getOutputStream().println("Jump From JSP.");
}


さて、実行はJSP側から行います。
Web Content→JumpJSP.jsp右クリック→Run As→Run on Serverです。
すると次のようになります。

j2ee_06_01.jpg

このようなリンクをクリックすると

j2ee_06_02.jpg

サーブレット側へ飛べます。
このようにHTMLやCSSが使いやすいJSP側と、処理を行いやすいサーブレット側を
うまく連携させて処理を行うということがよく行われます。
DBと合わせてJSP・サーブレット・DBの3つからなるシステムを作ることが多いです。



ここでアプリケーションへのパスを取得するためにrequestという暗黙オブジェクトを使ってます
これはoutなどと同じくJSPにてはじめから使える物です。
ここからgetContextPathというメソッドによってhttp://localhost:8080/hoge/の部分を取り出せます。

【Haskell】関数の定義とパターンマッチについて語る(一度目)

Haskellというのはいわゆる関数型言語と呼ばれるモノで、ひたすら関数が大事。
まぁ自分も詳しく分かっている訳ではないけれども

関数を中心に考えて関数を大事にする言語=関数型言語


という認識でとりあえずは大丈夫だと思う。
またHaskellには代入がない。
ついでに言えばfor文もwhile文もswitch文もない。
変数はちゃんと使えるのだけれども、代入するという概念がない。
一般的な手続き型言語のCなどでは代入文を

int x = 10


のように書くのだけれども、代入がないため、このような文は出てこない。
よってHaskellで=が出てきたらそれは関数であることがほとんどということになる。


それではパターンマッチと関数宣言の話をする。
ある関数 function の定義は次のように書く。

function :: 第一引数の型 -> 第二引数の型 -> ・・・ -> 第n引数の型 -> 返り値の型
function args1 args2 ・・・ argsn = 本体


ただ例示は理解への試金石、あまり一般的な話でも分からないので具体的な例を書く。
まずはじめに、ある値の絶対値を返す関数getAbsとする。

test = -10
main = print $ getAbs test
getAbs :: Int -> Int
getAbs n = if n < 0 then -n
else n

いわゆる普通の書き方であり、10が出力される。

さて、ここからHaskell話に入る。
今、式としてgetAbs n = ...というような関数定義をしている。
今引数を1つだけなので、この場合、引数一つ分という意味でnと書いてある。
その引数として与えられた値をnとして利用できる。

このように値のパターンによる場合分けのことをパターンマッチと呼ぶ。
これだけでは意味がまだ分からないので次の例を見る。自分で割り算を作ろう。
ちなみにHaskellで割り算をするとき、x / y は div x y と書く。

mdiv :: Int -> Int -> Int
mdiv x y = div x y

このように通常のdivをただ置き換えただけの関数では、たとえばyに0が入るとエラーが起きる。
(ゼロ割ができないため)
ここでこれを省くには次のようにする方法がまず考えられる。

mdiv :: Int -> Int -> Int
mdiv x y = if y /= 0 then div x y else x

通常の考え方でif文を使って0割を省く。
この書き方で問題ないのだけれども、パターンマッチを使うと次のように書ける。

mdiv :: Int -> Int -> Int
mdiv x 0 = x
mdiv x y = div x y

パターンマッチは上から順番にチェックされ、この書き方の時

引数が ある値xと0で渡ってくる場合 → 0 を返す
引数が ある値xとyで渡ってくる場合 → div x yを返す


と書いていることになる。

今、xと書いたとき、引数をxに束縛して利用するため、これを変数パターンと呼ぶことがある。
今、0と書くと、引数として0が渡された場合にマッチする。これをリテラルパターンと呼ぶことがある。
(たぶんリテラルパターンと呼んでもいい。)
また数値0のようなものだけではなく、文字列""や文字''もリテラルパターンとして利用できる。

あれ、結局パターンマッチというのはif文とかswitch文の代わりに入っているようなものなのだろうか。
また次回、語ります。
また、次回は他のパターンも使ってプログラムを書いてみます。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)
【Haskell】コマンドライン引数の取得を活用する。
【Haskell】絶対パスからファイル名だけを取り出す
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.2)
【Haskell】ディレクトリ内を表示するlsをHaskellで書く

【C】コマンドラインオプションが引数を取る場合

コマンドラインオプションには引数を取るモノがある。
それもちゃっかりgetoptで扱うことが出来る。
今回は次のようなプログラムを考える。


  • オプション -n の後に引数があればそれを出力


#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv){
int opt;
while((opt = getopt(argc, argv, "n:")) != -1){
switch(opt){
case 'n':
printf("option n args:%s\n", optarg);
break;
case '?':
printf("option error \n");
break;
}
}
printf("main program output\n");
}


実はオプションに引数をもらいたい場合、その文字"n"と書いていたのを"n:"とする。
このオプション文字の後ろのコロン:が引数の要求という意味になる。

bash-3.2$ gcc -o optest2 optest2.c
※ 引数を与える場合
bash-3.2$ ./optest2.exe -n 10
option n args:10
main program output
※ 引数を与えない場合
bash-3.2$ ./optest2.exe -n
optest2: option requires an argument -- n ※エラーメッセージが出る。
option error
main program output




category of C:
【C】コマンドライン引数の取り方
【C】コマンドラインオプションの解析をしたい

【Java】JSPの話へと移る

それでは次に、サーブレットからJSPへと移っていきます。
サーブレットは、それこそ普通のJavaと同様でコテコテのプログラムの形でした。
それに対してJSPHTMLの中にJavaのコードを埋め込むような感じで書きます。

それでは、サーブレットと同じく、テンプレートに登場してもらいます。
hogeプロジェクト→Web contents右クリック→New→JSPへと進みます。

j2ee_05_01.jpg

ダイアログが開くので設定します。
ファイルの場所がhoge/WebContentsになっていることを確認しておいて名前を入力します。
名前はHelloJsp.jspとします。

j2ee_05_02.jpg

さて、ここまでくると、次のようなテンプレートが登場します。
サーブレットと同様に、結構はじめから書いてあります。

j2ee_05_03.jpg

さて、中身を見ると普通のHTMLに結構近いことが分かります。
HTMLとの違いはJSPファイルの先頭に命令文が埋めてあることです。
サーブレットでの設定のように、JSPでもこの先頭の命令文によって設定を行います。
この命令文は

@page


という形で書かれます。
@pageと書かれていたら、それはJSPの設定を行う命令文だと考えてください。
さて、bodyタグないに次のように書きます。
※この文をpageディレクティブといいます。
※一般的に@で始まる文をディレクティブといいます。

<body>

<%
int sum = 0;
for(int i=0; i<10; i++){
sum += i;
}
%>

0から10までを足すと <%= sum %> になります。

</body>


これを実行してみましょう。
サーブレットと同じく、WebContents→HelloJsp.jsp右クリック→Run As→Run on Serverとします。
Tomcatが立ち上がり、または再起動した後に、内部ブラウザが起動します。

j2ee_05_04.jpg

このように出力されました。
※日本語と値が合っていないのはコードを読めば分かると思います。私のミスです。
さて、このようにできました。説明します。


JSPに埋め込まれたコード
JSPファイルにコードを埋め込むには次のようにします。

<%
 コード1
 コード2
%>


Eclipseを使う場合、<%まで打つと自動的にこの形になります。

また式の途中で変数の値だけを取り出したいような場合は次のように書けます。
上の例でもこれを使っています。

<%= 変数名 %>


この形の場合、式のセミコロンはいりません。


また画面へ出力するとき、サーブレットのようにoutという変数を使っていますが
これははじめから使えるように設定されているものです。
画面へ出力するときは、この変数を使えばいいです。

【Java】サーブレットの基本的な話をする

前回作ったサーブレット、書いたのはいいが、何も話していないので簡単に解説をしよう。
とりあえず前回のソースで処理をしている部分を引っ張ってくる。

    protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=Windows-31J");
PrintWriter out = response.getWriter();

out.println("<HTML>");
out.println("<BODY>");
out.println("<H2>Title</H2>");
out.println("<p>");
out.println("Text output<br>");
out.println("日本語の例<br>");
out.println("</p>");
out.println("</BODY>");
out.println("</HTML>");

}

もともとサーブレットはサーバ上であれこれ処理をして結果を返してくれるものでした。
今回はサーバというよりも、Tomcatというプログラムの上で処理を行っているのでした。
つまり通常のコンテンツは、サーバがWeb上にあるファイルをそのまま取ってきてくれるのですが
サーブレットの場合、そこにTomcatが絡んできているということです。

j2ee_04_01.jpg

このとき、ブラウザからサーバへ送られる赤矢印の流れを「リクエスト」と呼び
逆にサーバ側からブラウザへ送られる青矢印の流れを「レスポンス」と呼びます。
さて、今回の処理を行っているdoGetというメソッドの引数を見てみましょう。

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

これを見ても分かるとおり、このリクエストとレスポンスという名前は
テンプレートにも使われるぐらい代表的な呼称ということになります。

JavaではリクエストをHttpServletRequestというクラスのインスタンスとして扱い
レスポンスをHttpServletResponseというクラスのインスタンスとして扱うということです。
つまりまわりくどく言っていますが

ブラウザへ送る側の処理は、response、に対して行う
ブラウザから来る情報への処理は、request、に対して行う


ということです。
ところで、結局この適当なサーブレットは次の二つのことしかしていません。

1.responseに対してコンテンツの種類を設定する
2.responseに対して出力を行う


これについて見てみましょう。
今回のプログラムはただブラウザ上に文字列を出しているだけなので
来る側のrequestには特に何もする必要がないのですね。


1.コンテンツの種類の設定について
コンテンツの種類というのは、つまりブラウザから返ってくる情報が

1.どのような種類の情報なのか(HTMLか、txtか、PDFか、jpegか、docファイルか・・・)
2.どのような文字コードで渡されてくるのか


といったことです。これを設定するためにsetContentTypeというメソッドを使います。
詳しくはまた別の場所で出てくるかもしれませんが、日本語を扱う場合は基本的に今回の書き方です。
(OSの環境によってはcharsetの方をWindows-31Jから変える必要があるかもしれません。)
(ただのテキストファイルとして出力するにはtext/htmlをtext/plainとします。などなど)


2.出力
サーバ側からブラウザ側へつながっている流れはresponseでした。
よってこのresponseからPrintwriterのインスタンスを取り出してきて出力すればいい。

たとえばJavaでファイルを読むとき、FilreReaderやBufferedReaderなどを使います。
これは実際にどのようにファイルへアクセスするかというのをとりあえず無視して
そういったことをうまく覆い隠したストリームという概念を用いることでファイルにアクセスしています。

j2ee_04_02.jpg

またPrintWriterというのは身近なところではSystem.out.printlnにも現れます。
System.outというのは標準出力=黒い画面を指しますが、これの型はPrintWriterです。
このときも、実際にSystem.outがどこにつながっているのか意識することなく
そのストリームに文字列をぽいぽい載せてやれば、あとは実行側が処理をしてくれるという特徴があります。
ストリームというのはデータの流れのことですね。


というわけで、今回も次のように考えられます。
responseというのはサーバからブラウザへつながっていると考えていいです。
ここからgetWriterというメソッドを用いると、この流れのPrintWriterが得られます。
System.outで画面につながったストリームが得られるのと同じです。

ですので、こうして得られたoutにおなじみのprintln関数を使って
文字列をぽいぽい投げてやればブラウザに返ってくる。
そういうことになるのです。

j2ee_04_03.jpg

それでは次回、サーブレットとは違ったもう一つの形態であるJSPというものを経由した後
おそらくJSPとサーブレットの連携をした後にDBの話へ行こうと思います。



category of Haskell:
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(一回目)
【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(二回目)
【Java】開発環境を活用してサーブレットを書く。

【C】コマンドライン引数の取り方

オプション解析の話のつまみとして、C言語でコマンドライン引数を取る方法の復習。

#include <stdio.h>

int main(int argc, char** argv){
int i;
printf("numbers of command line argument:%d\n", argc);
for(i=0; i<argc; i++)
printf("No.%d = %s\n", i, argv[i]);
return 0;
}

arg、文字列の配列の中には実行プログラム名も入ってしまうから注意が必要。

bash-3.2$ gcc -o argc argc.c
bash-3.2$ ./argc.exe a i u e o
numbers of command line argument:6
No.0 = ./argc
No.1 = a
No.2 = i
No.3 = u
No.4 = e
No.5 = o

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。