イントラマートでPOSTやJSONを任意のJavaクラスに自動代入!StrutsのActionForm実装でJSPリクエストをサーブレット処理!アノテーション機能の使い方と意味は?
イントラマートのJava開発で特に必要なものはアクションクラスと呼ばれる基幹クラスと
ページの構造を構築するJSPファイルの2つになります。
Java EEとSAStrutsをベースに設計されているので、
イントラマートではこの2つの手法を利用しコーディングを行ないます。
アクションクラスについてはページコンテンツを開いた時に、
最初にコンパイルされ処理が実行されるクラスで原則作成するページの分だけ必要になります。
今回の記事では、イントラマート上でウェブコンテンツを作成する基礎をご紹介したいと思います。
Javaクラスの変数をJSPにデータとして受け渡す仕組みを見ていきます。
Actionクラスの仕組みを理解する
開発ソフトのe-Builderでプロジェクトを作成します。
パッケージ名は任意で構いませんが、Webサーバのdiconファイルで
起動プログラムのパスの設定が必要となります。
一番初めに作成するものはActionクラスです。
e-Builder上では以下のようなディレクトリに配置します。
diconファイルで設定した起動プログラムのパスをルートディレクトリとして、
その直下に存在するactionディレクトリがイントラマートのURLで言うと、
相対パスの開始ディレクトリになります。
なので例の通り、actionディレクトリにSapleAction.javaというクラスを配置すれば、
イントラマート側ではimart/sample/というURLに変換されて表示処理されます。
javaでJSPを読み込むまでの処理の流れ
アクションクラスで定義したpublic修飾子のフィールド変数はJSP上で、呼び出しを行なうことが可能です。
通常、アクションクラスの各メソッドで、戻り値として設定したJSPのパスを元にページ構成が行われます。
JSP内ではこの時return処理したアクションクラス内のフィールド変数の値しか呼び出せません。
なので、Javaの変数データをJSPで出力したいなら、フィールド変数を用意する必要がありますね。
ただし、あくまで変数データを受信する際は問題ありませんが、
例えばJavaとJSP間によるデータの登録処理などを実装する際、データ送信の仕組みを押さえておかなければなりません。
というのも、ページの表示処理が完了するとサーバサイドのJavaは、
一旦、待機状態になります。(実装によっては動的通信。)
あくまでユーザがページを表示する際にアクション処理として動作するので、
それ以外の操作では細かいロジックを実装しない限りは、その間はJavaが動作することはありません。
つまりページの表示処理が完了したら、ユーザが操作するページのベースはHTMLにすぎません。
javaのサーブレットHttpServletRequesクラスの仕組み
HTMLではFormタグなどによって、Inputタグなどの入力情報を、遷移先ページに送信することができますね。
主にJavaベースで設計されたウェブシステムでは、
データの登録処理をする際に、FormタグによってPOSTやJSON形式などで、送信処理を実装します。
送信時に遷移先のページが表示され、その際にサーバにFormタグ内の入力情報を送信することができます。
尚、送信される入力情報は各セレクタにname属性を指定したものに限ります。
POSTやJSONで送信されたデータを取得する
遷移先ページに対応するアクションクラスのメソッドの引数に、HttpServletRequest型の引数を用意します。
POSTやGET形式などデータを取得し格納することが可能です。
1 2 3 4 5 6 7 8 | public HttpServletRequest requst; @Execute(validator = false) public String index() { String userCd = request.getParameter("userCd"); return "JSPのパス"; } |
getParameter(“JSPから送信されたデータのname値”);を利用することで、
JSPのnameプロパティに格納されたvalueのデータを取得できます。
交換言語として使われるJSONの場合は、以下のような処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public HttpServletRequest requst; public HttpServletResponse response; @Execute(validator = false) public String index() { request.setCharacterEncoding("utf-8"); response.setContentType("application/json; charset=utf-8"); // JSONデータの取得 String jsonData = request.getParameter("json"); // JSON文字列を変数ごとに分割 JSONObject jsonObject = JSONObject.fromObject(jsonData); String userCd = jsonObject.get("userCd"); return "JSPのパス"; } |
ただ、この機能だけを用いる場合、毎回、送信されたデータを取得する処理を実装しなくてはなりません。
さらにPOSTやGET、JSONなどデータ送信タイプも考慮して
コーディングするのは非常に面倒ですし、何よりもコーディングが美しくありません。
そこでActionFormアノテーションという機能を実装するとかなり便利です。
ActionクラスにActionFormアノテーションを実装する
そもそもアノテーションとはなんだろうか?
意味合いとしては「注釈」を表しており、Javaでは変数やメソッド、クラスなどの要素に
決められた属性を付加させるようなイメージになります。
アノテーションにも様々な種類があり、ユーザ定義できるものもあるのですが、
今回は「ActionForm」というアノテーションをご紹介します。
前述通り、POSTやJSONデータを遷移先ページのアクション処理で、
変数データとして取得する際はHttpServletRequestクラスを利用します。
ただ、毎回これを実装するのは少々面倒ですし、
その後のデータ処理をするには、自動的に一括で変数データを取得できた方が楽ですよね?
その時に便利なのが「ActionForm」アノテーションです。
ActionFormアノテーションはリクエストデータを対象クラスに自動代入できる!
アクションクラス内で「ActionForm」というアノテーションを実装することで、
効率よくJSPのデータをJava側に送信することが可能です。
仕組みとしてはPOSTやJSON形式による送信処理でページ遷移する際に、
@ActionFormのアノテーションを実装したフィールド変数のクラスに、そのまま自動的に代入することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class SampleAction { //リクエストデータを自動的にsampleFormクラスのフィールド変数に代入 @Resource @ActionForm SampleForm sampleForm; @Execute(validator = false) public String index() { return null; } } |
実際にはActionFormとは送信処理時のrequestをサーブレットを通して、
JSP内のname属性名と遷移作アクションクラスのActionFormに設定したクラスの変数名が一致する場合、
JSPで送信したデータをそのまま自動的に代入処理を行なうことができます。
データ送信タイプを意識することなく、自動代入処理を共通化してくれるので、すごく楽です。
ActioFormアノテーションを実装する時は、「Resource」アノテーションもセットで実装して下さい。
一応このResourceアノテーションは、コンポーネントという自動起動設定ができます。
細かい説明をすると難しいので、 今はstaticというどのクラスから呼び出しても値が保持される静的データとしてイメージした方がわかりやすいでしょう。
ちなみに@resourceを付加した場合は、必ず変数の型名と変数名の名前を合わせておきましょう。
名前が一致しないと、Java実行時に対象の変数のクラス型の自動起動に失敗してエラーになります。
一応diconファイルにクラスパスとコンポーネント名を指定すれば、別名も使えますが、面倒なので合わせます。
最新記事 by よっき (全て見る)
- 「圧着」と「圧接」の違い!コネクタを使った効率的な配線作業! - 2019年10月26日
- 夏の暑さ対策は大丈夫?冷却性能抜群のおすすめCPUクーラー!メモリに干渉しない最強の商品を紹介! - 2018年5月1日
- 自作PC弐号機のケースを換装!SilverStone製のミニタワーで冷却性とかっこよさを追求! - 2018年3月11日
スポンサードリンク