Novice Engineer BLOG

プログラミングやITニュースについて発信していきます。ときどき日常

JSP側でJavaのクラスを使いたい 2016/09/17

f:id:oooofara_prog:20160917164221j:plain こんにちは。
今回はJSPについてつらつらと書いていきます。
ブログ更新が月1回とか怠慢だな。。。もう少し更新頻度あげぽよ。

アジェンダ(目次)

  1. デモ
  2. JSPって何それ?DAI語?
  3. 質問

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);      //現在の日を取得
%>

※Calendarクラス
Javaで用意されてる標準API

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型なので、適切に型変換する必要があります。

TO BE CONTINUED