今回は、Spring Bootのウィンドウを開くタイミングでエラーが発生した場合に、開く予定だったウィンドウを閉じ、その親画面にエラーメッセージを表示してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。
初期表示画面のHTMLは以下の通りで、エラーメッセージを表示する領域と、「新規ウィンドウをオープン時にエラー(POST)」ボタンを追加している。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<link th:href="@{/demo.css}" rel="stylesheet" type="text/css" />
<script type="text/javascript" th:src="@{/demo.js}"></script>
<title>index page</title>
</head>
<body>
<div id="errList">
<ul>
<li th:each="err : ${errList}" th:text="${err}" class="errorMessage"></li>
</ul>
</div>
<form th:action="@{/openWinByGet}" method="GET" name="formGet">
<input type="button" value="新規ウィンドウをオープン(GET)"
onclick="openWin('formGet');" />
</form>
<br/><br/>
<form th:action="@{/openWinByPost}" method="POST" name="formPost">
<input type="button" value="新規ウィンドウをオープン(POST)"
onclick="openWin('formPost');" />
</form>
<br/><br/>
<form th:action="@{/openWinByPostErr}" method="POST" name="formPostErr">
<input type="button" value="新規ウィンドウをオープン時にエラー(POST)"
onclick="openWin('formPostErr');" />
</form>
</body>
</html>「新規ウィンドウをオープン時にエラー(POST)」ボタンを押下したタイミングで開く画面のHTMLは以下の通りで、この画面をロードしたタイミングで、printOpenErrMsg関数を呼ぶようにしている。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<link th:href="@{/demo.css}" rel="stylesheet" type="text/css" />
<script type="text/javascript" th:src="@{/demo.js}"></script>
<script type="text/javascript">
//本画面ロード時に、エラーメッセージがあればエラーメッセージを親画面に転記し、
//本画面を閉じる
window.onload = function(){
printOpenErrMsg();
}
</script>
<title>index page</title>
</head>
<body>
<div id="errList">
<ul>
<li th:each="err : ${errList}" th:text="${err}" class="errorMessage"></li>
</ul>
</div>
POSTリクエストで新規ウィンドウをオープンしました。(エラー時)
</body>
</html>
JavaScriptの内容は以下の通りで、printOpenErrMsgメソッドで、ウィンドウを開くタイミングでエラーが発生した場合に、開く予定だったウィンドウを閉じ、DOM操作によってその親画面にエラーメッセージを表示する処理を行っている。
'use strict';
//フォーム名を指定して新しいウィンドウを開く
function openWin(formName){
let form = document.forms[formName];
if(!form){
alert('指定したフォームが取得できませんでした');
return;
}
let win = window.open('about:blank', formName);
form.target = formName;
form.submit();
win.focus();
}
//子画面のエラーメッセージを親画面に転記
function printOpenErrMsg(){
let errList = document.getElementById('errList');
if(errList){
let errMessages = errList.getElementsByTagName('li');
//子画面にエラーメッセージがある場合
if(errMessages && errMessages.length > 0){
//親画面のエラーメッセージリストを取得し初期化後、メッセージを追加
let errListP = window.opener.document.getElementById('errList');
if(errListP){
errListP.innerHTML = "";
let errListUlP = document.createElement("ul");
errListP.appendChild(errListUlP)
for(let i = 0; i < errMessages.length; i++){
let msg = errMessages[i].textContent;
let errListLiP = document.createElement("li");
errListLiP.innerHTML = msg;
errListLiP.classList.add('errorMessage');
errListUlP.appendChild(errListLiP);
}
}
//子画面を閉じる
window.close();
}
}
}CSSファイルの内容は以下の通りで、エラーメッセージを赤字で表示するようにしている。
.errorMessage{
color: #FF0000;
}
その他、コントローラクラスの内容は以下の通りで、「新規ウィンドウをオープン時にエラー(POST)」ボタン押下時に、エラーメッセージを設定するようにしている。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.ArrayList;
import java.util.List;
@Controller
public class DemoController {
/**
* 初期表示画面を開く
* @return 初期表示画面へのパス
*/
@GetMapping("/")
public String index(){
return "index";
}
/**
* 新規画面(GETリクエスト用)を開く
* @return 新規画面(GETリクエスト用)
*/
@GetMapping("/openWinByGet")
public String openWinByGet(){
return "new_window1";
}
/**
* 新規画面(POSTリクエスト用)を開く
* @return 新規画面(POSTリクエスト用)
*/
@PostMapping("/openWinByPost")
public String openWinByPost(){
return "new_window2";
}
/**
* 新規画面(POSTリクエスト用)を開く際にエラー
* @return 新規画面(POSTリクエスト用_エラー)
*/
@PostMapping("/openWinByPostErr")
public String openWinByPostErr(Model model){
List<String> errList = new ArrayList<>();
errList.add("新規ウィンドウオープン時のエラーメッセージ1");
errList.add("新規ウィンドウオープン時のエラーメッセージ2");
errList.add("新規ウィンドウオープン時のエラーメッセージ3");
model.addAttribute("errList", errList);
return "new_window3";
}
}その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-js-openwindow-err/demo
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/」とアクセスすると、以下の画面が表示される。

2) 「新規ウィンドウをオープン時にエラー(POST)」ボタンを押下すると、開く予定だったウィンドウを閉じ、初期表示画面にエラーメッセージが表示されることが確認できる。


要点まとめ
- ウィンドウを開くタイミングでエラーが発生した場合に、開く予定だったウィンドウを閉じ、その親画面にDOM操作によってエラーメッセージを表示する処理を実装することができる。





