やりたいこと
jspファイルで、<body>から上をtemplate_top.jspファイルに、
</body>から下をtemplate_bottom.jspに分けると、
本体側のjspファイルはページごとの記述+上のふたつのファイルをincludeする2行が追加になるだけで済むので見やすくて良き。
けれども、<head>内って<title>タグふくめ、ページごとに記述を変えたい箇所ってけっこうある。phpだとこういうときいいやり方があったけど、jspだとそういうのできるのかな?と思って、調べながら、作ってみました。
できあがったもの
エンコーディングの記述入れてるのにタイトルが日本語のとき文字化けしちゃうの、まだ解決できてないけど、自分のメモ兼ねてともかく載せておきます。
主体となるjspファイル
htmlファイル冒頭から。
<%@include file="template_top.jsp"%>は不要です。
<jsp:include page="template_top.jsp">がこの役割をしているので、挿入したい場所に書きます。
練習用なので細かく書いてないけど本来はdescriptionとかページごとに変えたい要素ってもっとあるので、それは<jsp:param name="title" value="Input" />を複数つくります。カンマで区切ってどうのこうのとかじゃなく単純に、<jsp:param name="変数名" value="変数にいれる値" />このひとそろいを並べます。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:include page="template_top.jsp">
<jsp:param name="title" value="Input" />
</jsp:include><p>ページの中身</p>
includeされる側のjspファイル(template_top.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String title = request.getParameter("title");
%>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title><%=title%></title>
<link rel="stylesheet" href="style.css">
<link rel="icon" href="https://picsum.photos/32">
<meta name="format-detection" content="email=no,telephone=no,address=no" />
<meta name="theme-color" content="#4285f4">
</head>
<body>
<header><h1><%=title%></h1></header>
<main>
ブラウザに出力されたhtmlのソース
ちゃんと入ってる~
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Input</title>
<link rel="stylesheet" href="style.css">
<link rel="icon" href="https://picsum.photos/32">
<meta name="format-detection" content="email=no,telephone=no,address=no" />
<meta name="theme-color" content="#4285f4">
</head>
<body>
<header><h1>Input</h1></header>
<main><p>ページの中身</p>
参考にしたサイト
<jsp:param> 他のページへパラメータを渡すJSPタグの使い方
失敗したパターン
主体となるjspファイルに変数を宣言して、
<%@include file="template_top.jsp"%>
<%!String title = "Input";>
includeされる側のファイルで
<%=title%>
で使うと、includeされる側のファイルでエラー表示が出てしまってた。ちゃんと表示はされて日本語までもちゃんと表示されてたけど、エラーが気になる。このやり方はたぶんダメなのよね。