[Java] 40. Web Spring frameworkでControllerを扱う方法
こんにちは。明月です。
この投稿はWeb Spring frameworkでControllerを扱う方法に関する説明です。
以前の投稿でウェブサービスをSpring frameworkを利用して構築する方法に関して説明しました。
link - [Java] 39. Spring Web Frameworkを利用してウェブサービスプロジェクトを作成する方法
Controllerとはクライアント(Browser)から要請があればホストを取り除いたアドレス値をパーシングして当該なメソッドを呼び出す機能です。
このアドレス値でパーシングしてメソッドを呼び出す時に一番やりやすい方法は各のページで呼び出す方法をあり、よく使いますが、その以外には複数ページや正規表現の方法で呼び出す方法もあります。または呼び出すヘッダーの情報やパラメータの値によって呼び出す方法もあります。
@RequestMapping
@RequestMappingとはウェブから要請されたらアドレス値によって探索が可能にするアトリビュートです。このアトリビュートはクラスとメソッドに使えます。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; // コントロールを設定するアトリビュート @Controller // クラスにはRequestMappingを省略が可能だ。省略すればアドレスからホスト名を取り除いたルートを指す。 @RequestMapping(value = "/home") public class Helloworld { // クラスから分けた下記のアドレスを探索する。 // この例には/home/index.htmlを指す。 @RequestMapping(value = "index.html") public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // viewに渡すデータ modelmap.addAttribute("Data", "Helloworld"); // viewファイル指定 return "index"; } }
上の例をみれば「/home/index.html」を呼び出したらindex関数が実行されたことを確認できます。
RequestMappingは一つのページをマッピングすることではなく、複数のアドレスを一つの関数に呼び出すことができます。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; // コントロールを設定するアトリビュート @Controller // クラスにはRequestMappingを省略が可能だ。省略すればアドレスからホスト名を取り除いたルートを指す。 @RequestMapping(value = "/home") public class Helloworld { // クラスから分けた下記のアドレスを探索する。 // この例には/home/index.htmlと/home/helloworld.htmlを指す。 @RequestMapping(value = {"index.html", "helloworld.html"}) public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // viewに渡すデータ modelmap.addAttribute("Data", "Helloworld"); // viewファイル指定 return "index"; } }
単純にアドレスを指定することより正規表現式によりマッピングすることも可能です。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; // コントロールを設定するアトリビュート @Controller // クラスにはRequestMappingを省略が可能だ。省略すればアドレスからホスト名を取り除いたルートを指す。 @RequestMapping(value = "/home") public class Helloworld { // クラスから分けた下記のアドレスを探索する。 // この例には/home/(iあるいはhに始まる単語).htmlを指す。 @RequestMapping(value = {"i*.html", "h*.html"}) public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // viewに渡すデータ modelmap.addAttribute("Data", "Helloworld"); // viewファイル指定 return "index"; } }
呼び出すメソッドタイプによりマッピングすることもできます。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; // コントロールを設定するアトリビュート @Controller // クラスにはRequestMappingを省略が可能だ。省略すればアドレスからホスト名を取り除いたルートを指す。 @RequestMapping(value = "/home") public class Helloworld { // クラスから分けた下記のアドレスを探索する。 // この例には/home/(iあるいはhに始まる単語).htmlを指す。 // メソッドタイプがGET方式だけ呼び出す。もしPOST方式なら他の関数を呼び出す。(指定されてない場合はマッピング関数がないというエラーが発生) @RequestMapping(value = {"i*.html", "h*.html"}, method = RequestMethod.GET) public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // viewに渡すデータ modelmap.addAttribute("Data", "Helloworld"); // viewファイル指定 return "index"; } }
その以外にもパラメータ、ヘッダーの値により関数探索が可能です。
仕様により区分して細かく使うことができますが、普通はそんなに細かく分けて設定しないです。細かく使くなったら逆に可読性が悪くなるし、プログラムだけ複雑になります。
私もvalueとmethodの以外は使ったことがありません。
ModelMap
Springでマッピング関数を作成する時にパラメータがなくても構いません。マッピングは@RequestMappingで区分されるからです。
でも、ブラウザにパラメータ値を受け取る時や様々なセッション情報、要請値(Request)、応答値(Response)を使う時があります。
そのため、基本的にModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse resを使います。
HttpSessionはセッション情報、HttpServletRequestは要請値、HttpServletResponseは応答値があります。この部分はServletと同じです。
ここでModelMapの場合はviewにデータを渡す時に使います。リターンのStringタイプのデータはviewのファイル名をマッピングするしreqやresの値では値を渡すことができないからです。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; // コントロールを設定するアトリビュート @Controller // クラスにはRequestMappingを省略が可能だ。省略すればアドレスからホスト名を取り除いたルートを指す。 @RequestMapping(value = "/home") public class Helloworld { // クラスから分けた下記のアドレスを探索する。 // この例には/home/index.htmlを指す。 @RequestMapping(value = "index.html") public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // viewに渡すデータ modelmap.addAttribute("Data", "Helloworld"); // viewファイル指定 return "index"; } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!-- ModelMapから受け取ったデータをJSTL言語で表示する。 --> ${Data} </body> </html>
上の例はindex関数でリターンの値をindexに設定したのでview/index.jspをマッピングします。
index.jspファイルの中でJSTL言語にData値を表示することになっています。index関数の中でModelMapを利用してData値を設定します。
@RequestParam
我々がクライアント(Browser)からデータを受け取る時があります。
GET方式ならurlアドレスから?マークに区分して設定するQueryString値により伝えるし、POST方式はform値をsubmitしてプロトコールヘッダーに値を渡す方法があります。
Springでデータを受け取る方法ではパラメータに@RequestParamを利用してパラメータを取得することができます。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; // コントロールを設定するアトリビュート @Controller public class Helloworld { // この例には/home/index.htmlを指す。 @RequestMapping(value = "index.html") // パラメータでdataの値を取得する。 public String index(@RequestParam String data, ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // パラメータより受け取ったデータをModelMapに設定する。 modelmap.addAttribute("Data", data); // viewファイル指定 return "index"; } }
でも、私はこの方法をお勧めしていません。なぜならdataの値がnullになるとエラーになるからです。
Servletに使うHttpServletRequest変数を通ってgetParameter関数を利用したらパラメータがnullでも関数が呼び出せます。その後で別に関数の中でnull処理したら良いです。
でも、クライアント(Browser)から渡すデータ値が多い場合、getParameter関数ですべて処理することはソースのステップが多くなると思います。
それで私の場合はModelAttributeのアトリビュートを利用してクラスタイプでデータを受け取ります。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; // コントロールを設定するアトリビュート @Controller public class Helloworld { // この例には/home/index.htmlを指す。 @RequestMapping(value = "index.html") // Nodeクラスにパラメータがdataの場合はdata変数に格納、data1の場合はdata1変数に格納する。 public String index(@ModelAttribute Node node, ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) { // パラメータより受け取ったデータをModelMapに設定する。 modelmap.addAttribute("Data", data); // viewファイル指定 return "index"; } } // パラメータを受け取るためのBeanクラス class Node { // パラメータのdataを受け取る。 private String data; // パラメータのdata1を受け取る。 private String data1; // data変数のgetter public String getData() { return data; } // data変数のsetter public void setData(String data) { this.data = data; } // data1変数のgetter public String getData1() { return data1; } // data1変数のsetter public void setData1(String data1) { this.data1 = data1; } }
上の処理はdataのパラメータの場合はデータ値があるのでそのまま表示されましたが、data1のパラメータの場合は設定してないのでnullが表示されますね。
ここまでクライアント(Browser)から呼び出したらControllerから処理してviewをパーシングして最終結果を応答します。
でも、ウェブサービスの中でウェブページを要請すると当然ページをリターンするが、ajaxの場合はどのように処理するでしょう?
ajaxはウェブページが必要なことではなく、Controllerで処理した値をjsonやデータ構造に変換しなければならないです。
次の投稿ではSpring frameworkでajaxを処理する方法に関して説明します。
ここまでWeb Spring frameworkでControllerを扱う方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [Java] 47. JPAのEntityクラスのリファレンス設定(cascade, fetch)2019/10/13 00:40:08
- [Java] 46. JPAのEntityクラスの基本設定(@GeneratedValue、 @ManyToMany)2019/10/11 07:30:14
- [Java] 45. JPAを設定する方法2019/10/10 07:29:43
- [Java] 44. Web Spring frameworkのviewで使うプログラム言語(JSTL) - XML2019/10/09 07:34:08
- [Java] 43. Web Spring frameworkのviewで使うプログラム言語(JSTL) - 関数、データベース2019/10/08 07:43:33
- [Java] 42. Web Spring frameworkのviewで使うプログラム言語(JSTL) - コア―、フォーマット2019/10/07 07:38:13
- [Java] 41. Web Spring webframeworkのControllerからajaxの要請する時、jsonタイプのデータを返却する方法2019/10/04 19:24:43
- [Java] 40. Web Spring frameworkでControllerを扱う方法2019/10/03 20:02:06
- [Java] 39. Spring Web Frameworkを利用してウェブサービスプロジェクトを作成する方法2019/10/02 21:00:22
- [Java] 38. Javaでウェブサービスプロジェクト(JSP Servlet)を作成する方法2019/10/01 21:48:08
- [Java] 37.イクリプス(eclipse)でトムキャット(tomcat)を設定する方法2019/09/30 22:19:34
- [Java] 36.コーディングする時、よく使うコーディングパターンとステップ数を減らす方法2019/09/27 20:39:09
- [Java] 35. コーディング規約設定(Google Standard coding style)2019/09/26 21:31:25
- [Java] 34. WindowでMariaDBをインストールする方法2019/09/25 19:58:30
- [Java] 33. オープンライブラリを参照する方法(eclipseからmavenを連結)2019/09/24 19:35:54
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07