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

スポンサーサイト

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

【Java】複数のサーブレットを組み合わせるための画面遷移の話

サーブレットから他のリソースへリクエストを転送することをディスパッチといいます。
英語の綴りはdispatchです。
リソースとは平たく言えば、他のサーブレット、JSP、HTMLなどのことです。
サーブレットではjavax.servlet.RequestDispatcherインタフェースによってディスパッチを行います。

ところでディスパッチにはフォワードインクルードの二つがあります。
フォワードの場合、転送先のリソースに出力を任せます。
インクルードの場合、転送先のリソースの出力をインクルードします。
それぞれforward/includeのメソッドで行い、request/responseを渡します。
ここではよく使うforwardの方を使ってみます。

サーブレット→サーブレット
hogeプロジェクト→Java Resources:src→hoge右クリック→ForwardServlet1.java
hogeプロジェクト→Java Resources:src→hoge右クリック→ForwardServlet2.java

ForwardServlet1の方には次のように書きます。
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
RequestDispatcher dis = request.getRequestDispatcher("/ForwardServlet2");
dis.forward(request, response);
}


ForwardServlet2の方には次のように書きます。
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/plain; charset=Windows-31J");
response.getWriter().println("Servlet2からの出力");
}


実行はForwardServlet1の方を実行します。右クリック→Run As→Run on Serverです。
すると次のように実行されます。

j2ee_08_01.jpg

このようにサーブレット2からの出力が表示されます。


ところで
サーブレット→JSPの場合、リンク(Stringで与えられている)をjspへのリンクに変えればいい。
またフォワードされる前のサーブレットからは出力処理をしません。
出力処理、つまりresponseへの処理はバッファに一度蓄えられているのですが
フォワードしたときにバッファがクリアされてしまって反映されません。
ですので出力処理はすべてフォワードされた後のサーブレットで行います。



category of Haskell:
Java】サーブレット/JSPを書く勉強をするための環境について知っていること(一回目)
Java】サーブレット/JSPを書く勉強をするための環境について知っていること(二回目)
Java】開発環境を活用してサーブレットを書く。
Java】サーブレットの基本的な話をする
【Java】JSPの話へと移る
【Java】JSPからサーブレットを呼び出す
【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/の部分を取り出せます。

【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という変数を使っていますが
これははじめから使えるように設定されているものです。
画面へ出力するときは、この変数を使えばいいです。

【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

【Java】開発環境を活用してサーブレットを書く。

前々回ダウンロードした環境を前回設定しました。
今回は実際にそれらを利用してサーブレット/JSPを書いていきます。
とりあえずEclipseを起動させ、通常の状態にしておきます。

File→New→Other→Web→Dynamic Web Projectと進みます。

j2ee_03_01.jpg


次に、ProjectNameを入力します。
ここではよく使われる適当な名前「hoge」とでも設定しておきます。好きなモノでいいです。
その他の項目はデフォルトのままでFinishです。

j2ee_03_02.jpg


さて、Eclipseの通常画面に戻りました。
左側に出ているProjectExplorerの中にhogeというプロジェクトが出来ていることを確認します。
ProjectExplorerが出ていない場合は、Serverの時と同様で、Window→Shor Viewから表示させてください。
(たいていのモノを消してしまった場合、Window→Show Viewからもう一度表示させられます。)

また右上の部分でJava EEが選ばれていることも確認しておいてください。
この場所でメニューやボタンなどの配置をそれぞれのモードに変えることが出来ます。
よく使うモノとしてはJava、JavaEE、デバッグなどです。

j2ee_03_03.jpg


さて、プロジェクトhogeを右クリック→New→Servletと選択します。

j2ee_03_04.jpg


出てくるダイアログで作成するサーブレットの名前等の設定をします。ここでは

Java Package:hoge
ClassName:HelloServlet


とします。

j2ee_03_05.jpg



その後Finishとすると、いわゆるサーブレットのひな形が作成されて表示されます。
見てみましょう。

j2ee_03_06.jpg


さて、その中にはdoGetというメソッドが自動的に作成されていると思います。
このdoGetというメソッドがサーブレットのもっとも基本的なメソッドとなります。
ここを次のように書き直していきましょう。ただし、ソースファイルの先頭に

import java.io.PrintWriter;


を追加するのを忘れずに。

    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("");
out.println(" ");
out.println("

Title

");
out.println("

");
out.println("Text output
");
out.println("日本語の例
");
out.println("

");
out.println("
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
");
out.println(" ");

}



Eclipseの場合、Ctrl-Sで上書き保存をするときに自動的にチェックされます。
特に赤色の×が周辺になければエラーがないコードということになります。
またCtrl+Shift+Fでコードを見やすいように整形することも出来ます。
(整形方法については自分で設定も出来ます。)

さて、このファイルはhogeプロジェクトのどこに保存されているのか言っていませんでした。
これはhoge→Java Resources: src→hoge→HelloServlet.javaというように見ることが出来ます。
HelloServletがファイル名、その前のhogeがダイアログで決めたパッケージ名です。


それではこのサーブレットを実行します。
上のようにして表示させたHelloServletを右クリック→Run As→Run on Serverを選びます。
初回実行時、どのサーバを用いるか聞かれるので、自分で用意したServerを選択します。
このダイアログ中、現在のプロジェクトは必ずこのServerを使うといったチェックボックスがありますから
チェックしておくと、毎回ダイアログが出なくなり便利です。


実行させると下の方にTomcatの起動メッセージが出ます。
すでにTomcatを起動していた場合、再起動するかどうかが問われますので
一応再起動しておくといろいろ安心です。

Tomcatが起動すると、内部ブラウザと呼ばれる確認用のブラウザが新しいタブで開かれます。
そこで実行結果を確認しましょう。

j2ee_03_07.jpg


おおおぉ。打ち込んだモノが出力されました。


ここまで非常に簡単ながら


  • 開発環境の用意

  • 開発環境の起動と準備

  • サーバの作り方

  • プロジェクトの作り方

  • サーブレットの作り方

  • サーブレットの実行



などを見てきました。
いかがでしたでしょうか。

次回はもう少し詳しく説明するか
もしくはせっかく準備しているので、データベース関連の話を絡めていきます。



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

【Haskell】コマンドライン引数の取得を活用する。

しばらく取り組んでいるブログに役立つプログラム作りのために、少し脇道にそれて頑張る。
普通にコマンドライン引数を取得して出力するだけなら

import System
main = do args <- getArgs
print args

こんな風に書ける。ちなみにこのプログラムは簡単に書くと

import System
main = getArgs >>= print

こんな風にも書ける。簡単バージョンだな。
またgetArgsの出力は文字列のリスト、[String]で得られる。

ところでGHCの吐き出すexeファイルにファイルを1つ、もしくは複数個D&Dすると
その絶対パスのリストが得られることが分かった。
これをうまく解析してやれば、Ver.1のプログラムをもう少し改善出来そうだ。
というわけでドラッグ&ドロップされたファイルのパスのリストの取得&出力をするプログラムを書く。

import System
main = do getArgs >>= printArgs
getChar >>= print

printArgs :: [String] -> IO ()
printArgs (f:l) = do putStrLn f
printArgs l
printArgs [] = putStr ""

このような関数定義はパターンマッチをうまく使うと綺麗に書ける。
(パターンマッチについてはまだ書いてないのでそのうち)

少し解説すると、一つ一つは簡略バージョンの描き方。
またgetCharとprintのコンビは、コマンドプロンプトがすぐに閉じないようにするために入れてある。


これをすると、1つまたは複数個のファイルをD&Dしたとき、そのパス名リストを出力してくれる。
また今回はgetArgsを使ったが、どうもgetContentsのままでもこれは出来るらしく
こういったのを組み合わせてブログの記事リスト作りプログラムを改良する。


category of Haskell:
Haskell】とても簡単なHaskellプログラムについて
Haskell】標準入力(stdin)を読み込むために
Haskell】結構頻繁に使う関数などの話
Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)

【Java】サーブレット/JSPを書く勉強をするための環境について知っていること(二回目)

さて、前回の記事で環境をダウンロードして、解凍するまできました。
今回はこれを使って開発のテストを行っていきます。

1.まずはじめに
まずはじめにEclipseを立ち上げる。
(次のようなスプラッシュウィンドウが出る。表示はEclipseのバージョンによって異なる)
j2ee_02_01.jpg

初回起動時、次のようにどこにファイルなどを保存するかの指定が出来る。
これをWorkspaceといいます。前回作ったフォルダjavasrcを指定する。
また左下のチェックボックスにチェックを付けておくと、この場所で固定されます。
二回目以降も聞かれるのは多少面倒なので、とりあえず固定しておくといいです。
j2ee_02_02.jpg

さて、次のような画面が初期画面です。昔と比べて少し変わりましたね。
この画面に来たら、とりあえず右上の矢印を選んでください。Workbenchへ飛びます。
ワークベンチというのは、いわゆるプログラムを開発する画面のことです。
j2ee_02_03.jpg

そして次のようになります。ここまで来ると最初の段階が終わりです。
j2ee_02_04.jpg


2.Tomcatの設定をする
次にEclipseからTomcatをうまく利用するために設定する。
まずFile→New→Otherと進む。
j2ee_02_05.jpg

するとダイアログが出てくるので、この中のServerを選んでNextへ。
j2ee_02_06.jpg

Next後、Serverの種類としてApacheからTomcatのv5.5を選びNextです。
j2ee_02_07.jpg

基本的に設定はデフォルトでいいのですが、Installed Directoryとして
Apache Tomcat v5.5をダウンロードして解凍した場所を指定しておく。
j2ee_02_08.jpg

こうすることで下のView内のServerに今のServerが出てきます。
出てきていない場合はWindows→Show Vier→Serverを選んで出しておきます。
j2ee_02_13.jpg

ここからサーバを右クリックし、Startを選択します。
初回起動時、次のようにFirewallに引っかかるというメッセージが出るので、ブロックを解除します。
j2ee_02_14.jpg

ブロックを解除した後、再び右クリック→Restartとします。
その後ブラウザにてhttp://localhost:8080/にアクセスすると次のような画面が出ます。
(もしかしたら真っ白ページかもしれません)
いずれにしてもTomcatが起動していることが分かります。
j2ee_02_15.jpg

以上で基本設定を終わります。
SqliteやJDBCドライバはすぐには利用しないのでとりあえず保留です。
次回は実際にサーブレットとJSPを書きます。



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

【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)

さて、前回の記事で作ったHaskellプログラム。いろいろと突っ込みどころがあります。
要するに「標準入力から読み込んで、HTMLソースを標準出力に出す」という制限の部分です。
だってあなた(自分)、ブログ書くときにコマンドプロンプト使うの?っていうことですよね。
確かにコマンドプロンプト自体はよく使うものですが、別にブログを書くときにまで使いたくはないですよね。
というわけでここを改善していきます。最低限利用できるプログラムにします。


どのように改良するのか。せっかくGHCはexeファイルを吐き出してくれる。
ですからファイルから読み込んでファイルから書き出すようないっぱしのプログラム形式にしてみたいわけです。
exeファイルとして使えるようになるので


  • exeファイルと同じところにあるsrc.txtというテキストファイルにリストを書いておく
  • このリストを読み出して、HTMLソースを作成する(前回のプログラム)
  • 最終的にexeファイルと同じところにあるhtmlsrc.txtに書き出す


このようにすればまだ使える感じがしてきますね、プログラムっぽいです。
というわけで前回のプログラムをうまく再利用しながらやっていきます。


前回のプログラムを再利用できるところ
getHtml :: String -> String
getHtml h = let wh = words h
number = head $ wh
title = head $ tail $ wh
in do "<a href=\""
++ hreftp
++ number
++ ".html\"><strong>" ++ title ++ "</strong></a>"

リストからHTMLソースにする部分。ここはそのまま使えます。
結局標準入力と標準出力を使う代わりにファイル入力とファイル出力を使えばいいのです。


ファイル入出力はIOパッケージで利用できるのですが、いわゆる例外が発生します。
こんなファイルありませんよ?とか、このファイルには書き込めませんよ?とかいうやつです。
こういった実行時例外などへの対処は、本当はちゃんと書かないといけないところだと思います。
がしかし、結局自分が使うプログラムであるから、手の抜けるところは手を抜くという方針です。
よってこういったところは少し目をつぶり、とにかく簡単なファイル入出力をします。
まず次のように宣言します。

import IO
infile = "src.txt"
output = "htmlsrc.txt"

IOを使えるように、また入力ファイル名と出力ファイル名を固定しておきましょう。
さて、次のようにファイル入出力を行うプログラムは書けます。

main = do cs <- readFile infile
outhandle <- openFile output AppendMode
hPutStrLn outhandle header
hPutStr outhandle $ unlines $ map getHtml $ lines cs
hClose outhandle

簡単ながら説明していきましょう。

1.もっとも簡単でシンプルなファイル入力
標準入力を取ってくるgetContentsというものがありました。
また実行時引数を取ってくるgetArgsというものもあります。
これと似たように、簡単なファイル入力にはreadFileという関数が利用できます。

cs <- readFile filename


このようにすることで、あたかもgetContentsしているようにファイルから入力できます。
前に言っているとおり、細かい例外の処理などはありません。
このようにして持ってきた入力csをver.0のように処理することでHTMLを生成できます。

2.簡単なファイル出力の準備
出力時、今回は現在存在しているファイルの末尾に書いていくという追加書き込みを利用します。
C言語風に言うと”a”というモードで、HaskellではAppendModeという表現がされます。
こういったものを扱うために、ハンドラと呼ばれるものを経由した書き込みを行います。
ハンドラの宣言は次のように行われています。

outhandle <- openFile output AppendMode


変数名outhandleで、openFileというのがデータコンストラクタです。
データコンストラクタについては【Haskell】C言語の構造体のようなものをHaskellで利用するで書きました。
このデータコンストラクタにファイル名とハンドラのモードを与えることでファイル書き込みのための準備をします。

3.実際にファイル出力をする場所
標準出力putStrLnとputStrに対応するファイル書き込みようの関数がhPutStrLn及びhPutStrです。

hPutStrLn handler STRING
hPutStr handerl STRING


のようにすることでSTRINGをhandlerで設定しているファイルに書き込むことが出来ます。


4.後片付け
書き込みを行った後、hCloseという関数でハンドラの後処理を行います。
これを行わないと書き込みがちゃんと完了しないといった現象が発生します。


実行
さて、このようにして作成したプログラムに、リスト

3 【Haskell】とても簡単なHaskellプログラムについて
8 【Haskell】標準入力(stdin)を読み込むために
36 【Haskell】結構頻繁に使う関数などの話
37 【Haskell】高階関数と型の定義について
489 【Haskell】リストの処理について
509 【Haskell】C言語の構造体のようなものをHaskellで利用する
511 【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)


をsrc.txtとして置いておき、プログラムを実行して生成されるファイルhtmlsrc.txtからのコピペを張って終わります。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)

Page Top

訪問者

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

プロフィール

parabola0

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

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

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

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