こんにちは。
現在、「Servlet⇔DBのデータ受け渡し」をテーマにした模擬プロジェクトでちょっとしたノベルゲームを作っています。開発環境はEclipseです。問題は以下の通りです。
分からないこと
Servlet→jspへ拡張for文で回してforwardしたArrayListをjsp側で画面クリック毎に一行ずつ出力する方法
実際のコード
今回焦点となるServletとjspのコードは以下の通りです。jsp,Servletの他にもDAO,dto用のファイルもありますが、今回の質問とは関係なさそうなので記載は割愛します。
DAOでDBとデータのやり取りをしたのち、ArrayListにデータを格納しております。その処理を以下のServletで呼び出している、という流れです。
java
1 2//CharChoiceServlet.java 3 4//省略 5 6try(app_novelGameDAO dao = new app_novelGameDAO()) 7 8List<App_novelGame> settingList = dao.selectSettings(dto); 9 10for (App_novalGame ap : settingList) { 11 12 String currentid = ap.getCurrentId(); 13 String background = ap.getBackground(); 14 String dialogue = ap.getDialogue(); 15 String chartype = ap.getCharType(); 16 String charid = ap.getCharId(); 17} 18 19RequestDispatcher disp = request.getRequestDispatcher("jsp/screen.jsp"); 20disp.forward(request, response); 21 22} catch (Exception e) { 23 throw new ServletException(e); 24} 25 26//省略 27
html
1//screen.jsp 2 3<head> 4 5<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> 6 7</head> 8<body> 9<script type = "text/javascript"> 10 11 12document.body.onclick = function () { 13 14//ここにどう記述すればいいかが分かりません 15 16} 17 18</script> 19 20<%-- 省略 --%> 21 22<div class = "background"> 23 <input type = "image" name = "background" src = "/App_novelGame/img/${ background }.jpg"/> 24</div> 25 26<div class = "chartype"> 27 <input type = "image" name = "chartype" src = "/App_novelGame/img/${ chartype }.png"/> 28</div> 29 30<div class = "dialogue-frame"> 31 <input type = "image" name = "background" src = "/App_novelGame/img/frame.png"/> 32 <span><c:out value = "${ dialogue }"/></span> 33</div> 34 35<%-- 省略 --%> 36 37</body> 38 39
※currentid = キャラ毎のルートのid(例 A1→A2a→A3a..セーブデータ用に必要)
chartype = キャラの表情差分別の画像(画像のパスがそのまま動的に入る)
background = 背景の画像(同じく)
dialogue = セリフ(DBに直接入力されたもの)
charid = キャラのid(これをキーにAキャラが選ばれたらキャラID:AのストーリーをDBから取ってくる!という風にしている)
現段階では、リストの中身が一気に順序良く出力され、リストの最後の行の要素(AのストーリーであればAの最後のシーン)が画面上で目視できる状態です。
今のところ、screen.jsp側でjavascriptを使って画面クリック時に何らかの処理をしてタイトルの機能を実装しようと考えております。がしかし、皆目見当もつかず、です。
最終的には、紙芝居のようにscreen.jspでクライアント側が画面クリックする毎にリストの中の次のシーンに切り替わるようにしたいです。
他に足りない情報などございましたらお申しつけください。
力を貸していただける方、お待ちしております。
宜しくお願い致します。
追記(euledgeさんのご回答へのレスポンス)
html
1//screen.jsp 2 3<div id = "settings"> 4 5 <div class="screen" id="1"> 6 7 8 <div class="background"> 9 <input type="image" name="background" 10 src="/App_novelGame/img/${background}.jpg" /> 11 </div> 12 13 14 <div class="charimage"> 15 <input type="image" name="charimg" 16 src="/App_novelGame/img/${chartype}.png" /> 17 </div> 18 19 <div class="dialogue-frame"> 20 <input type="image" src="/App_novelGame/img/frame.png" /> <span><c:out 21 value="${dialogue}" /></span> 22 </div> 23 24 </div> 25 26 <div class="screen" id="2"> 27 28 29 <div class="background"> 30 <input type="image" name="background" 31 src="/App_novelGame/img/${background}.jpg" /> 32 </div> 33 34 35 <div class="charimage"> 36 <input type="image" name="charimg" 37 src="/App_novelGame/img/${chartype}.png" /> 38 </div> 39 40 <div class="dialogue-frame"> 41 <input type="image" src="/App_novelGame/img/frame.png" /> <span><c:out 42 value="${dialogue}" /></span> 43 </div> 44 45 </div> 46 47 <div class="screen" id="3"> 48 49 50 <div class="background"> 51 <input type="image" name="background" 52 src="/App_novelGame/img/${background}.jpg" /> 53 </div> 54 55 56 <div class="charimage"> 57 <input type="image" name="charimg" 58 src="/App_novelGame/img/${chartype}.png" /> 59 </div> 60 61 <div class="dialogue-frame"> 62 <input type="image" src="/App_novelGame/img/frame.png" /> <span><c:out 63 value="${dialogue}" /></span> 64 </div> 65 66 </div> 67<%-- 以下省略 --%> 68 69</div> 70 71 72 73コード
javascript
1 2let current_screen_no = 1; 3 let screens = document.getElementsByClassName("screen"); 4 let screen_num = screens.length; 5 display_screen(1); 6 7 // スクリーン切り替えの処理 8 function display_screen(screen_no) { 9 Array.prototype.forEach.call(screens, function(screen) { 10 if (Number(screen.id) === screen_no) { 11 screen.style.display = "block"; 12 } else { 13 screen.style.display = "none"; 14 } 15 }); 16 current_screen_no = current_screen_no + 1; 17 } 18 19 document.body.addEventListener('click', function(mEvent) { 20 if (current_screen_no <= screen_num) { 21 display_screen(current_screen_no); 22 } 23 }, true); 24 25 26 27コード
回答2件
あなたの回答
tips
プレビュー