2016-06-29 17 views
1

私はさまざまな学習教材へのリンクを保存している大学のプロジェクトに取り組んでいます。そこ私のDBにチュートリアルをテキストにリンクのリストであり、プロジェクトのファイルは、以下のとおりである:Spring MVCはjspのDBデータを表示しません

TextTutorialController.java:

package io.spring.learn.web; 

import java.util.List; 

import javax.inject.Inject; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import io.spring.learn.proc.TextTutorial; 
import io.spring.learn.proc.TextTutorialService; 

@Controller 
@RequestMapping("/textTutorials") 
public class TextTutorialController { 

    @Inject 
    TextTutorialService service; 

    @RequestMapping(value = "/listOfTextTutorials", method = RequestMethod.GET) 
    public String showList(ModelMap model) { 
     List<TextTutorial> listOfTextTutorials = service.findAll(); 
     model.addAttribute("textTutorialList", listOfTextTutorials); 
     return "listOfTextTutorials"; 
    } 

} 

listOfTextTutorials.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>List of Text Tutorials</title> 
</head> 
<body> 
    <h1>List of Text Tutorials on Spring:</h1> 
    <table> 
     <tr> 
      <th>ID</th> 
      <th>Name</th> 
      <th>URL</th> 
      <th>Alexa Global Rank</th> 
      <th>Total Chapters</th> 
      <th>% Completed</th> 
     </tr> 
     <c:forEach var="textTutorial" items="${textTutorialList}"> 
      <tr> 
       <td><c:out value="${textTutorial.id}" /></td> 
       <td><c:out value="${textTutorial.name}" /></td> 
       <td><c:out value="${textTutorial.url}" /></td> 
       <td><c:out value="${textTutorial.alexaGlobalRank}" /></td> 
       <td><c:out value="${textTutorial.totalChapters}" /></td> 
       <td><c:out value="${textTutorial.percentCompleted}" /></td> 
      </tr> 
     </c:forEach> 
    </table> 
</body> 
</html> 

のindex.jsp:

アプリケーションをTomcatで実行すると、コンソールにDB接続が表示されます。うまく行くとさらにいくつかのSELECTステートメントが照会されます:

[EL Info]: 2016-06-29 03:29:17.721--ServerSession(2113257970)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b 
[EL Info]: connection: 2016-06-29 03:29:18.265--ServerSession(2113257970)--file:/Users/AgentDen/Documents/Java/MyProjectSpringMVC/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/LearnSpringMVC/WEB-INF/classes/_LearnSpring login successful 
[EL Fine]: sql: 2016-06-29 03:29:18.314--ServerSession(2113257970)--Connection(302754878)--SELECT ID FROM books WHERE ID <> ID 
[EL Fine]: sql: 2016-06-29 03:29:18.842--ServerSession(2113257970)--Connection(500719466)--SELECT ID FROM CLASSROOM WHERE ID <> ID 
[EL Fine]: sql: 2016-06-29 03:29:18.886--ServerSession(2113257970)--Connection(1612903660)--SELECT ID FROM general_articles WHERE ID <> ID 
[EL Fine]: sql: 2016-06-29 03:29:18.905--ServerSession(2113257970)--Connection(250314644)--SELECT ID FROM online_courses WHERE ID <> ID 
[EL Fine]: sql: 2016-06-29 03:29:18.922--ServerSession(2113257970)--Connection(474813894)--SELECT ID FROM text_tutorials WHERE ID <> ID 
[EL Fine]: sql: 2016-06-29 03:29:18.936--ServerSession(2113257970)--Connection(1688125903)--SELECT ID FROM youtube_tutorials WHERE ID <> ID 
[EL Fine]: sql: 2016-06-29 03:29:19.619--ServerSession(2113257970)--Connection(585968463)--SELECT ID, alexa_global_rank, chapters_studied, date_finished, date_started, days_spent, LANGUAGE, LEVEL, NAME, percent_completed, personal_rating, total_chapters, URL FROM text_tutorials 

しかし、私のJSPに表示されているすべてのものは、単にHTMLタイトルとテーブルヘッダーですが、何もデータがモデルから表示されません:

List of Text Tutorials on Spring: 

ID Name URL Alexa Global Rank Total Chapters % Completed 

JSTL pom.xmlに含まれています:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
</dependency> 

私はここで同様の質問を読んだことがありますが、私の場合は特にそうではありません。私はこれ以上本当に絶望的なので、どんなアドバイスも高く評価されます!

UPD。あなたのコードがよさそうだ

package io.spring.learn.proc; 

import java.util.List; 

import javax.inject.Named; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.transaction.annotation.Transactional; 

@Named 
public class TextTutorialServiceImpl implements TextTutorialService { 

    @Inject 
    private TextTutorialDao txtDao; 

    @Override 
    public List<TextTutorial> findAll() { 
     return txtDao.findAll(); 
    } 

... 

} 
+0

クエリが値を返すことを確認できますか?つまり、少なくとも1つの項目が結果セットにあります - また、デバッガの使用方法も知っていますか(IDEには1つあります) - これは、このような状況で便利になる – ochi

+0

はい、現時点ではリストに3つの値があります(SQLスクラップブックまたはメインコンソール出力を介して 'マニュアル'モードで正常に返されます) –

+0

一見すると、ここからうまくいく - JSP上に 'textTutorialList'の長さを表示するとどうなりますか?すなわち、 – ochi

答えて

1

package io.spring.learn.proc; 

    import java.util.List; 

    import javax.persistence.EntityManager; 
    import javax.persistence.NoResultException; 
    import javax.persistence.PersistenceContext; 
    import javax.persistence.TypedQuery; 

    import org.springframework.stereotype.Repository; 

    @Repository 
    public class TextTutorialDaoImpl implements TextTutorialDao { 

     @PersistenceContext 
     private EntityManager em; 

     @Override 
     public List<TextTutorial> findAll() { 
      TypedQuery<TextTutorial> query = em.createQuery("Select txt from TextTutorial txt", TextTutorial.class); 
      return query.getResultList(); 
     } 

    ... 

} 

とサービスの実装:ここ は、サービスのfindAllの()メソッドの実装です。私が疑うことができる唯一のことはあなたのサービスです - 私はそれが空のリストを返すと確信しています。それをモデルマップに追加する前にリストのサイズを印刷できますか?

public String showList(ModelMap model) { 
    List<TextTutorial> listOfTextTutorials = service.findAll(); 
    System.out.println(listOfTextTutorials.size()); // <-- This line. 
    model.addAttribute("textTutorialList", listOfTextTutorials); 
    return "listOfTextTutorials"; 
} 
+0

よく混乱させてしまいました。リストのサイズは実際には0になっていますが、メインメソッドを使用すると実際には0になります。コンソールモードで: 'ApplicationContext ctx = new ClassPathXmlApplicationContext(" beans.xml "); \t \t TextTutorialService tts = ctx.getBean(TextTutorialService.class);リスト ttList = tts.findAll(); (TextTutorialのTT:ttList)用\t \t {\t \t \tのSystem.out.println(TT)。 \t \t} 'コンソールに表示されたリストの3つのエントリをすべて取得しました! –

+0

あなたの質問に問題があります。あなたはそのリストを照会するサービスメソッドを投稿できますか? –

+0

ここにサービスメソッドの実装があります: '@PersistenceContext \t private EntityManager em; @Override \t公開リスト findAll(){ \t \t TypedQuery query = em.createQuery( "TextTutorial txtからテキストを選択"、TextTutorial.class); \t \t return query.getResultList(); \t} '(フォーマット申し訳ありませんが - 本当にコメントでコードをフォーマットする方法を見つけ出すことはできません) –

0

コントローラメソッドをこれに変更するのはどうですか?

@RequestMapping(value = "/listOfTextTutorials", method = RequestMethod.GET) 
public ModelAndView showList(ModelMap model) { 
    List<TextTutorial> listOfTextTutorials = service.findAll(); 
    return new ModelAndView("listOfTextTutorials", "textTutorialList", listOfTextTutorials);; 
} 

そして古いJSP 1.2記述子のために、手動でELを有効にする必要があります。 JSPに次のコードを追加します。

<%@ page isELIgnored="false" %> 
0

[OK]をリストのサイズを確認するには@Nguyenトゥアン・アインのアドバイスのおかげでサービスから返されたので、私は掘り始め、DBへのSpringの接続が何らかの形で破損していることに気づきました。 application-config.xmlのdb urlをabsoluteからrelativeに変更すると問題は解決しましたが、相対パスがゼロの結果を返した理由はまだ分かりません。

関連する問題