JSP側でJavaのクラスを使いたい 2016/09/17
こんにちは。
今回はJSPについてつらつらと書いていきます。
ブログ更新が月1回とか怠慢だな。。。もう少し更新頻度あげぽよ。
アジェンダ(目次)
- デモ
- JSPって何それ?DAI語?
- 質問
1.デモ
まずJSPってなんだよって感じだと思うけど、実際見た方が早いので、早速試してみる。マジ簡単マン。
今回は画面に日付を表示してみる。
(JSPについては後述)
①使いたいJavaクラスをimport
構文はこちら
<% page import="パッケージ名.クラス名" %>
この構文を実際に使うとこうなる
<% page import="java.util.Calendar"%>
この場合パッケージ名が「java.util」、クラス名が「Calendar」となる。
これでCalendarクラスをJSPで使う準備が完了。
※<% page %>
これは構文。
偉い人たちがこういう書き方しようって決めたから覚えるだけ。
1 + 1 = 2の「=」もただただ覚えたでしょ?それと一緒。
※import
Javaクラスを使うためのもの
import以外にも「language」、「session」とかいろいろある。
興味あれば、「page ディレクティブ」とかでググれば秒で出てきますよ〜。
②Calendarクラスを使う
<% Calendar cal = Calendar.getInstance();
//カレンダーオブジェクトを取得
int year = cal.get(Calendar.YEAR);
//現在の年を取得
int month = cal.get(Calendar.MONTH) + 1;
//現在の月を取得
int day = cal.get(Calendar.DATE);
//現在の日を取得
%>
※API
簡単に言うと、クラス(クラスの中で定義されているフィールドやメソッドも含む)
※現在の月だけなんで「+ 1」してるの?
Calendarクラスでは内部的に月を0~11で表してるから、
1をプラスしないとえらいことになるんで、す、YO(この人どこで何してるんだろ)
例えば、今月は9月なので「int month = get(Calendar.MONTH)」をすると、
変数「month」には「8」が格納される。
よってそのままの変数を使って日付表示させると、
「今月は9月なのに8月って表示される〜」ってなる。はい。バグですね。
対応関係は以下のとおり。
0:1月
1:2月
2:3月
・
・
・
③画面に表示する
現在の日付は<%=year%>年<%=month%>月<%=day%>です。
※<%=%>
変数に格納した値を使うときの書き方。これも偉い人たちが決めた。
②の「int yaer = cal.get(Calendar.YEAR);」の「year」が変数。(month、dayも同様)
2.JSPって何それ?DAI語?
まずJSPって何それ?DAI語?。ってところから始まる。
「JSPって何それ?DAI語?」ってググると出るわ出るわJSP関連の検索結果!
(※「DAI語」の本発売の記事が先頭に出てくるので、適切に検索しましょう。笑)
話を本題に戻してJSPとは何か。
JSPとはJavaServer Pageの略。
WEBサイトの画面をサーブレットより簡単に作れる技術ってイメージで問題ないと思う。
JSPの技術が登場するまではサーブレットで画面を作成してたけど、
Javaベースだから、なんせめんどくさい。
そこでJSPの出番。
JSPはHTMLベースで画面を作成できるので簡単にできちゃう。
サーブレット:JavaプログラムにHTMLを埋め込む感じ
JSP:HTMLにJavaプログラムを埋め込む感じ
じゃあ全てをJSPで作成したら良いかって言われるとそうでもないらしい。
ここらへんの理由はあまり理解できてないから調べないと。。。
3.質問
JSTLの「c:set」で変数に格納して、
その変数を、読み込んだJavaクラスのメソッドの引数として渡す方法が分かりません。。。
(例)
<% page import="オリジナルのクラス(testクラスを読み込んだとする)" %>
<c:set var="test" value="テスト" />
<% test.testMethod(${test}) %>
こんな感じで渡そうとすると「${test}」のとこでエラーになる。
ちなみにtestMethodの仮引数はString。
そもそもこんなことはできないのかな。。。ん〜解せない。
2016/09/19 追記
上記について解決方法を提案していただいたので、記載します。
[修正前]
${test}
[修正後]
pageContext.getAttribute("test")
※pageContext.getAttribute()で取得した値はObject型なので、適切に型変換する必要があります。