質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2254閲覧

Spring Bootでページ分けした内容が表示されない

kazumi_7

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/10/21 05:53

編集2021/10/21 06:42

実現したいこと

掌田津耶乃「Spring Bootプログラミング入門」の本に沿ってSpring Bootを勉強中です。
ページ分けの機能を実装したところ、エラーで内容が表示されません。

前章のコードに追記していく形式の本のため、不要なコードが大量にあるかと思います。

発生している問題・エラーメッセージ

http://localhost:8080/page/1にアクセスすると、ページ分けした1ページ目(3人分のデータ)が表示されるはずが、以下の404エラーが発生します。

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Oct 21 14:36:08 JST 2021 There was an unexpected error (type=Not Found, status=404).

該当のソースコード

MyDataService.java

Java

1package com.tuyano.springboot; 2 3import java.util.List; 4import javax.persistence.EntityManager; 5import javax.persistence.PersistenceContext; 6import javax.persistence.criteria.CriteriaBuilder; 7import javax.persistence.criteria.CriteriaQuery; 8import javax.persistence.criteria.Root; 9import org.springframework.data.domain.Page; 10import org.springframework.data.domain.PageRequest; 11import org.springframework.stereotype.Service; 12import com.tuyano.springboot.repositories.MyDataRepository; 13 14@Service 15public class MyDataService { 16 @PersistenceContext 17 private EntityManager entityManager; 18 public List<MyData> getAll() { 19 return (List<MyData>) entityManager.createQuery("from MyData") 20 .getResultList(); 21 } 22 public MyData get(int num) { 23 return (MyData) entityManager.createQuery("from MyData where id=" + num) 24 .getSingleResult(); 25 } 26 public List<MyData> find(String fstr) { 27 CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 28 CriteriaQuery<MyData> query = builder.createQuery(MyData.class); 29 Root<MyData> root = query.from(MyData.class); 30 query.select(root) 31 .where(builder.like(root.get("name"), "%" + fstr + "%")); 32 List<MyData> list = null; 33 list = (List<MyData>) entityManager.createQuery(query).getResultList(); 34 return list; 35 } 36 // P345リスト7-14 37 private MyDataRepository repository; // 書いていないけど多分いる。 38 39 public MyDataService(MyDataRepository repository) { 40 this.repository = repository; 41 } // 必要かも 42 private static final int PAGE_SIZE = 3; // 1ページの表示件数 43 public Page<MyData> getMyDataInPage(Integer pageNumber) { 44 PageRequest pageRequest = PageRequest.of(pageNumber - 1, PAGE_SIZE); 45 return repository.findAll(pageRequest); 46 } 47}

MyDataRepository.java

Java

1package com.tuyano.springboot.repositories; 2import java.util.List; 3import java.util.Optional; 4import org.springframework.data.jpa.repository.JpaRepository; 5import org.springframework.data.jpa.repository.Query; 6import org.springframework.stereotype.Repository; 7import com.tuyano.springboot.MyData; 8 9@Repository 10public interface MyDataRepository extends JpaRepository<MyData, Long> { 11 public Optional<MyData> findById(Long name); 12 @Query("SELECT d FROM MyData d ORDER BY d.name") 13 List<MyData> findAllOrderByName(); 14 public List<MyData> findByNameLike(String name); 15 public List<MyData> findByIdIsNotNullOrderByIdDesc(); 16 public List<MyData> findByAgeGreaterThan(Integer age); 17 public List<MyData> findByAgeBetween(Integer age1, Integer age2); 18}

HeloController.java

Java

1package com.tuyano.springboot; 2 3import java.util.List; 4import javax.annotation.PostConstruct; 5import javax.servlet.http.HttpServletRequest; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.stereotype.Controller; 8import org.springframework.transaction.annotation.Transactional; 9import org.springframework.validation.BindingResult; 10import org.springframework.validation.annotation.Validated; 11import org.springframework.web.bind.annotation.ModelAttribute; 12import org.springframework.web.bind.annotation.PathVariable; 13import org.springframework.web.bind.annotation.RequestMapping; 14import org.springframework.web.bind.annotation.RequestMethod; 15import org.springframework.web.bind.annotation.RequestParam; 16import org.springframework.web.servlet.ModelAndView; 17import com.tuyano.springboot.repositories.MyDataRepository; 18 19@Controller 20public class HeloController { 21 @Autowired 22 MyDataRepository repository; 23 @Autowired 24 private MyDataService service; 25 // index 26 @RequestMapping(value = "/", method = RequestMethod.GET) 27 public ModelAndView index(ModelAndView mav) { 28 mav.setViewName("index"); 29 mav.addObject("title", "Find Page"); 30 mav.addObject("msg", "MyDataのサンプルです。"); 31 List<MyData> list = service.getAll(); 32 mav.addObject("datalist", list); 33 return mav; 34 } 35 // 36 // index※追記 37 // 38 @RequestMapping(value = "/page/{num}", method = RequestMethod.GET) 39 public ModelAndView page(@PathVariable Integer num, 40 ModelAndView mav) { 41 Page<MyData> page = service.getMyDataInPage(num); 42 mav.setViewName("index"); 43 mav.addObject("title", "Find Page"); 44 mav.addObject("msg", "MyDataのサンプル。"); 45 mav.addObject("pagenumber", num); 46 mav.addObject("datalist", page); 47 return mav; 48 } 49 50 // find 51 @RequestMapping(value = "/find", method = RequestMethod.GET) 52 public ModelAndView find(ModelAndView mav) { 53 mav.setViewName("find"); 54 mav.addObject("title", "Find Page"); 55 mav.addObject("msg", "MyDataのサンプルです"); 56 mav.addObject("value", ""); 57 List<MyData> list = service.getAll(); 58 mav.addObject("datalist", list); 59 return mav; 60 } 61 @RequestMapping(value = "/find", method = RequestMethod.POST) 62 public ModelAndView search(HttpServletRequest request, ModelAndView mav) { 63 mav.setViewName("find"); 64 String param = request.getParameter("fstr"); 65 if (param == "") { 66 mav = new ModelAndView("redirect:/find"); 67 } else { 68 mav.addObject("title", "Find result"); 69 mav.addObject("msg", "ID 「" + param + "」の検索結果"); 70 mav.addObject("value", param); 71 List<MyData> list = service.find(param); 72 mav.addObject("datalist", list); 73 } 74 return mav; 75 } 76 // P342リスト7-12 77 @Autowired 78 MyDataBean myDataBean; 79 @RequestMapping(value = "/{id}", method = RequestMethod.GET) 80 public ModelAndView indexById(@PathVariable long id, ModelAndView mav) { 81 mav.setViewName("pickup"); 82 mav.addObject("title", "Pickup Page"); 83 String table = "<table>" + myDataBean.getTableTagById(id) + "</table>"; // getTableTagByIdを呼んで結果をdataに設定 84 mav.addObject("msg", "pickup data id=" + id); 85 mav.addObject("data", table); 86 return mav; 87 } 88 // ダミーデータ 89 @PostConstruct 90 public void init() { 91 // dao = new MyDataDaoImpl(entityManager); // P325リスト7-2では不要 92 MyData d1 = new MyData(); 93 d1.setName("寺本 和香"); 94 d1.setAge(49); 95 d1.setMail("teramoto_waka@example.com"); 96 d1.setMemo("090-733-7001"); 97 repository.saveAndFlush(d1); 98 99 MyData d2 = new MyData(); 100 d2.setName("矢野 瞬"); 101 d2.setAge(12); 102 d2.setMail("yano_shun@example.com"); 103 d2.setMemo("080-8954-9502"); 104 repository.saveAndFlush(d2); 105 106 MyData d3 = new MyData(); 107 d3.setName("篠崎 有起哉"); 108 d3.setAge(60); 109 d3.setMail("shinozaki_yukiya@example.com"); 110 d3.setMemo("090-5822-6387"); 111 repository.saveAndFlush(d3); 112 113 MyData d4 = new MyData(); 114 d4.setName("宍戸 美咲"); 115 d4.setAge(43); 116 d4.setMail("shishido_misaki@example.com"); 117 d4.setMemo("090-6709-6949"); 118 repository.saveAndFlush(d4); 119 } 120 @RequestMapping(value = "/other") 121 public String other() { 122 return "redirect:/"; 123 } 124 @RequestMapping("/home") 125 public String home() { 126 return "forward:/"; 127 } 128 class DataObject { 129 private int id; 130 private String name; 131 private String value; 132 public DataObject(int id, String name, String value) { 133 super(); 134 this.id = id; 135 this.name = name; 136 this.value = value; 137 } 138 public int getId() { 139 return id; 140 } 141 public void setId(int id) { 142 this.id = id; 143 } 144 public String getName() { 145 return name; 146 } 147 public void setName(String name) { 148 this.name = name; 149 } 150 public String getValue() { 151 return value; 152 } 153 public void setVaue(String value) { 154 this.value = value; 155 } 156 } 157}

index.html

Html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<title>Top page</title> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6<script src="http://code.jquery.com/jquery.min.js"></script><!-- jQueryを利用 --> 7<script th:inline="javascript"> 8$(document).ready(function(){ 9 var num=/*[[${param.id[0]}]]*/; 10 $.get("/rest/"+num,null,callback); // jQuery 11}); 12function callback(result){ 13 $('#obj').append('<li>id: '+result.id+'</li>'); 14 $('#obj').append('<li>name: '+result.name+'</li>'); 15 $('#obj').append('<li>mail: '+result.mail+'</li>'); 16 $('#obj').append('<li>age: '+result.age+'</li>'); 17 $('#obj').append('<li>memo: '+result.memo+'</li>'); 18} 19</script> 20<style> 21h1 { 22 font-size: 18pt; 23 font-weight: bold; 24 color: gray; 25} 26body { 27 font-size: 13pt; 28 color: gray; 29 margin: 5px 25px; 30} 31tr { 32 margin: 5px; 33} 34th { 35 padding: 5px; 36 color: white; 37 background: darkgray; 38} 39td { 40 padding: 5px; 41 color: black; 42 background: #e0e0ff; 43} 44</style> 45</head> 46<body> 47 <h1 th:text="#{content.title}">Hello page</h1> 48 <p th:text="${msg}"></p> 49 <!-- ここにエラーメッセージ --> 50<ul id="obj"></ul> 51 <table> <tr> 52 <th>ID</th> 53 <th>名前</th> 54 <th>年齢</th> 55 <th>メールアドレス</th> 56 <th>コメント(TEL)</th> 57 </tr> 58 <tr th:each="obj : ${datalist}"> 59 <td th:text="${obj.id}"></td> 60 <td th:text="${obj.name}"></td> 61 <td th:text="${obj.age}"></td> 62 <td th:text="${obj.mail}"></td> 63 <td th:text="${obj.memo}"></td> 64 </tr> 65 </table> 66</body> 67</html>

試したこと

MyDataService.javaで発生していた構文エラーだけは何とか解決しました。

補足情報

Eclipse Version: 2021-06 (4.20.0)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

HeloControllerクラスに/page/1のリクエストを受けるメソッドが無いので
当然404 Not Foundになります。

本を見たことがないので、あなたがどこかの作業工程を飛ばしたのか、
本の通りにやっても動かない残念な書籍なのかは分かりません。


Heloってなんだろ…?ググったらソマリ語と出てきたんだが。。。

投稿2021/10/21 06:29

Luice

総合スコア771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazumi_7

2021/10/21 06:49

ご指摘を受けて確認したところ、なぜか該当部分をコメントアウトにしていました。 コメントアウトを外して実行しようとしたところ、Page<MyData>の「Pageが型に解決できません」という構文エラーが出ています……。 ```Java @RequestMapping(value = "/page/{num}", method = RequestMethod.GET) public ModelAndView page(@PathVariable Integer num, ModelAndView mav) { Page<MyData> page = service.getMyDataInPage(num); mav.setViewName("index"); mav.addObject("title", "Find Page"); mav.addObject("msg", "MyDataのサンプル。"); mav.addObject("pagenumber", num); mav.addObject("datalist", page); return mav; } ``` --- HeloはHelloのミスタイプだと思います。最初に「Hello "Spring-Boot" World!」と表示させるコードがあったので。
Luice

2021/10/21 07:04

単純にimportしていないだけ、なんて事はないですよね…
kazumi_7

2021/10/21 07:36 編集

ご回答ありがとうございます。 手で import com.tuyano.springboot.MyDataService; とimport文を打って保存すると、未使用なのか削除されてしまいます。 Page<MyData>をMyDataService.javaからコピー&ペーストすると構文エラーが消えました。 見比べても綴りミスはなかったのですが、お手数お掛けしました。 実行すると、status=500のエラーが発生してしまっているところです。
kazumi_7

2021/10/22 04:49

最終目標であるページ分けでの表示は実現できていませんが、表題と質問内容がずれて来るので一旦解決とさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問