見出し画像

職業訓練でJavaを学ぶ!48日目(2/2)「Javaプログラミング実習(フレームワーク実習編)」

職業訓練で、Javaを使ったWebシステム開発・Androidアプリ開発を学ぶことになりました。復習かねて情報発信をします!

これから職業訓練に通うことを検討している方の参考になれば嬉しいです。↓↓職業訓練に通うことになった経緯はこちら
https://note.mu/yukoro/n/ned8d43b0110d

本日の授業内容

<Spring Frameworkのタグライブラリ>
・formタグライブラリ
springタグライブラリ ←この記事


springタグライブラリ

URLを出力する際に使われるタグライブラリについて紹介します。

Controllerに2つの異なる階層のURLに対応する1つのJSP(ビュー)があるとき、JSPに相対パスを設定しても階層の異なる両方のURLに対応することができません。

例)Controller
--------
@Controller
public class TestController {
     //1つのJSPを起動する2つのURL
     @RequestMapping("/test")
     public String test() {
           return "test";
     }
     @RequestMapping("/test/{id}")
     public String testPath(
     @PathVariable("id") Integer id) {
           return "test";
     }
     //リンク用
     @RequestMapping("/page1")
     public String page1() {
           return "page1";
     }
     @RequestMapping("/page2")
     public String page2() {
           return "page2";
     }
}
----------

例)JSP
----------
<%@ page pageEncoding="UTF-8" %>
....
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
     <h1>Test</h1>
     <p><a href="page1">Page 1</a></p>
     <p><a href="page2">Page 2</a></p>
</body>
</html>
----------

Controller側の設定が上の例のようになっている時、共通で起動するJSPに同じ相対パスのリンクを貼って、test/ と test/{id} のURLにアクセスしてみます。

/test のURLにアクセスするとtest.jspが起動。

スクリーンショット 2019-09-27 20.30.58

Page 1へのリンクをクリックすると、問題なくページが表示されます。

スクリーンショット 2019-09-27 20.31.34

今度は /test/2 のURLにアクセスするとtest.jspが起動。ここまでは問題ありません。

スクリーンショット 2019-09-27 20.32.04

するとエラーになってしまいました。

スクリーンショット 2019-09-27 20.33.15


これはアクセスしたページのURLに問題があるからです。

ここで注目したいのが、test/ と test/{id} のURLで表示されるJSPは同じですが、その中に貼られているリンクをクリックした時の、遷移先URLが異なっている点です。


" /test " のページからリンクをクリックすると
URLは " /page1 " になるのに対して、
/test/2 のページからリンクをクリックすると
URLは " /test/page1 " となっています。

Controller側の設定では " /page1 " にアクセスがあった場合に page1.jsp を起動する記述になっているため、" /test/page1 "というURLに対応するJSPファイルはありませんよ、となってしまうのです。

これを解決するには、リンクのURLをコンテキストルートから始めます。

例)JSP
----------
<%@ page pageEncoding="UTF-8" %>
....
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
     <h1>Test</h1>
     <p><a href="/mvctag/page1">Page 1</a></p>
     <p><a href="/mvctag/page2">Page 2</a></p>
</body>
</html>
----------

" test/2 "のURLからリンクをクリックしても、ページが表示されるようになりました。

スクリーンショット 2019-09-27 20.34.10

しかしコンテキストルート名は後から変更になる可能性があり、運用・保守においては、都合の悪い場合もあります。

そこでSpringタグライブラリを使用することで、URLにコンテキストルートの情報を自動で吐き出してくれるようになります。

例)Springタグライブラリ
---------
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
--------

2つの異なる階層のURLに対応する1つのJSPに対して、この利用宣言を追加してあげます。


例)JSP
----------
<%@ page pageEncoding="UTF-8" %>
....
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
     <h1>Test</h1>
     <p><a href="<spring:url value="/page1" />">Page 1</a></p>
     <p><a href="<spring:url value="/page2" />">Page 2</a></p>
</body>
</html>
----------

こうすることで変化に強いリンクをつけることができます。



「springタグライブラリ」については以上です。最後までお読みいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?