Servlet&JSPでFormデータ
今回はFormデータのやり取りをJavaServeletとJSPで交互に行う練習をVsCodeで行いましょう
JSP->ServletのFormデータ
では、まず 自由にアクセスできるindex.jspを作って、そこで入力されたデータをservletに渡すまでの実験をしてみましょう。
JSPからServletを呼び出す
前回行ったようにVsCodeでmavenを作っていきます。一度、CTLR+SHIFT+Pでcreate maven projectがしてあれば、左下のMAVENの表示のところにある+アイコンをクリックして、先ほどと同じようにVsJToSというプロジェクトを作れます。やってなければcreate maven projectしてください。
WEB-INFにあるindex.jspを最初に起動して、そこで入力したdataをServLetで受けるものを作ります
JSPにformを作る
最初に作られたファイルの中身は次の様なものです。
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
これにformを入れていきます。まじめに全部入れてもいいのですが、せっかくVsCodeで
zencodingが使えるのですから、一旦全ソースを消して、先頭で !またはhtml:5と入力してTABキーを押してください。html5のひな形が作成されます。そしてコードを修正します。
これでdata:の後ろにテキストボックスができて、そこに入れたdataがabcという名前が付いてServLetに渡っていきます。
渡されたデータを受け取って出力する
Javaのソースは以前やったようにドメイン名の逆の階層を作ってその中に作成します
+---VsJToS
\---vsjtos
| pom.xml
|
+---.vscode
| settings.json
|
+---src
\---main
+---java
| \---jp
| \---co
| \---etlab
| GetData.java
|
\---webapp
| index.jsp
|
\---WEB-INF
web.xml
階層の下に作るのでpackage名もそれに対応させます。そして以下のように入力してください。出力は簡単のため画面ではなく、ログとして出力します。
以前やったように、javaxがエラーになりますので、pom.xmlにjavax.servlet-apiを追加して保存して、nowで設定してください
MAVENでコンパイルしてTOMCATで実行
以前やったように、MAVENの自分のプロジェクトを右クリックして,
install,compile,packageを行います。
warファイルができたら、右クリックして Run on Serverを実行します。
すると、Tomcatのメッセージに配置したメッセージが出て、tomcatの下に今入れたプログラムが入ります。
ブラウザを開いて、localhost:8080/vsjtos と入力して、入力フォームが表示されたら適当な文字を入力して、送信をクリックします。
送信してたら画面は真っ白になりますが、出力コンソールに受け取ったデータが出力されています。
今回のサンプルは自由にアクセスができる webappのindex.jspに直接アクセスして、入力されたデータをPOSTで送り、ServLetでdoPOSTで受信して、表示するものでした。
Servlet->JSPのFormデータ
次は逆に先にServletをGETで呼び出して、なにか値をJSPに渡すようにしましょう。
ServletからJSPを呼び出す
今度は先にServletを作りましょう。mainの下にjava\jp\co\etlbaと作り、SJServlet.javaを作成します。
今回もjavaxでエラーになるので、pom.xmlのdependenciesにjavaxのlibを追加
先にSJServletが起動されます。この時ServletにはGETでやってきますのでdoGETで受けます。そこからJSPをパラメータ付きでリダイレクトするものです。
リダイレクトはwebappにあるJSPに使えます。今回はIPアドレスをurlに付けてGETで渡しています。
つづいて、JSP側を記述します。index.jspを修正します。
DOCTYPEの前にServletから送られてきたGETデータを受信しておきます。そしてJSPの中で表示します。
MAVENでコンパイルしてTOMCATで実行
以前やったように、MAVENの自分のプロジェクトを右クリックして,
install,compile,packageを行います。
warファイルができたら、右クリックして Run on Tomcat Serverして、tomcatを展開してそのプロジェクトをOpen in Browserで実行します。
あとは前回と同じです。実行すると
最初の起動はindex.jspをいきなり起動したものになっているので、アドレスはNullで表示されます。これではServletから呼び出していません。そこでurlの後ろに /SJServlet を付けてServletを呼び出します。
今度は一度Servletに渡ってから、またindex.jspに返ってきているのでアドレスが渡ってきています。つまりServletからJSPを呼び出していることになります。
Servelet->WEB-INFのJSPのFormデータ
次は、ServletからWEB-INF内にあるリダイレクトできない場所のJspをフォーワードしてみましょう。その中でセッションデータを使ってみましょう。
図にするとこのようになります。jspとservletがバトンパスしてますね。
ServletからWEB-INF内のJspをforwardする
先にJspファイルを作っていきます。最初に作るindex.jspは外部に開放された場所なので、誰でも来ることができます。なのでログイン前の画面などに使います。
Mavenを使ってひな形を作りましょう。以前のものと同じ流れです。今回はVsForwardというプロジェクトで作成します。
つづいて受信側のjavaをsrc\main\java\jp\co\etlabにLogin.javaとして作ります。
このソースはindex.jspから送られてきたnameとpassを受け取り、passが12345の時はsessionスコープにnameを保存して、main.jspにフォワードします。passがなくてもforwardしますが、その時はsessionがないのでログイン失敗と表示してLoginに戻るようにします。
では、そのmain.jspを作っていきましょう。WEB-INFの下にjspフォルダーを作り、その中にmain.jspを作ります。
ソースの階層を出しておきます
+---VsForward
| \---vsforward
| | pom.xml
| |
| +---.vscode
| | settings.json
| |
| +---src
| | \---main
| | +---java
| | | \---jp
| | | \---co
| | | \---etlab
| | | Login.java
| | | Logout.java
| | | Main.java
| | |
| | \---webapp
| | | index.jsp
| | |
| | \---WEB-INF
| | | web.xml
| | |
| | \---jsp
| | logout.jsp
| | main.jsp
| | secret.jsp
以下のソースも階層を間違えないように入力してください
DOCTYPEを実行する前に、Login.javaでsessionスコープに保存したユーザー名を取得しています。取得できていればログイン成功ですが、だめなら失敗です。
Main.javaは本来ならばデータベースなどを読み込む場所ですが、今回は特になにもしていません。sessionスコープをチェックして次につないでいるだけです。
そして、secret.jspは本来なら読み込んだ物などを表示するところですが、なにも秘密はありませんので、sessionスコープを消してログアウトしておしまいです。
あとはログアウトするだけになります。Servletでsessionを消してログアウト終了画面を出します。
上のLogout.javaでセッションを削除してからlogout.jspに渡します。
WEB-INFにあるjspはリダイレクトできません。Servletからフォワードする必要があります。なのでServletからgetDispatcherでフォワードしています。またMain.javaはリクエストされても、セッションがなければLoginに押し戻されるようにコーディングしてあるので、Loginなしでは入れません。
Logoutでセッションを切らないとセッションが残ります。ただしブラウザを閉じてしまえば消えます。