2016-10-14 127 views
0

更新一個春天啓動項目:構建使用Maven

感謝所有爲你的答案。我仍然有問題,因爲它沒有返回我希望的結果。這是文件放置的問題嗎?他們是這樣組織的:i63.tinypic.com/2by8g2.png

再次提前致謝。


我爲了創建使用Spring引導和JDBC(無JPA)的Web應用研究;我遇到了幾個問題。 我不明白如何正確地創建控制器,以及如何使它返回我想要的.jsp頁面。 我搜索了很多很多的解決方案,但找不到合適的解決方案。 這是我的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>---myprojectname</groupId> 
    <artifactId>tesieasy</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>tesieasy</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.1.RELEASE</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 

我application.properties:

> spring.h2.console.enabled=true 
server.port=8000 
spring.view.prefix=/WEB-INF/jsp/ 
spring.view.suffix=.jsp 

我ServetInizializer:

我的實體:

import java.util.Date; 
import java.text.SimpleDateFormat; 

public class Journal { 

    private Long id; 
    private String title; 
    private Date created; 
    private String summary; 
    private SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy"); 

    /** costruttori**/ 
    public Journal() {} 

    public Journal(Long id, String title, String summary, Date date){ 
     this.id = id; 
     this.title = title; 
     this.summary = summary; 
     this.created = date; 
    } 

    /** getters and setters omitted **/ 

我的服務:

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.stereotype.Service; 

import name of my package-.entity.Journal; 


@Service 
public class JournalService { 
    private static final Logger log = LoggerFactory.getLogger(JournalService.class); 

    @Autowired 
    JdbcTemplate jdbcTemplate; 

    public void insertData() { 
     log.info("> Table creation"); 
     jdbcTemplate.execute("DROP TABLE JOURNAL IF EXISTS"); 
     jdbcTemplate 
       .execute("-cut for brevity-"); 
     log.info("> Done."); 
    } 

    public List<Journal> findAll() { 
     List<Journal> entries = new ArrayList<>(); 
     jdbcTemplate 
       .query("SELECT * FROM JOURNAL", 
         new Object[] {}, (rs, row) -> new Journal(rs.getLong("id"), rs.getString("title"), 
           rs.getString("summary"), new Date(rs.getTimestamp("created").getTime()))) 
       .forEach(entry -> entries.add(entry)); 
     return entries; 

    } 

     public int countEntries() { 
     int rowCount = this.jdbcTemplate.queryForObject("SELECT count(*) FROM JOURNAL", Integer.class); 
     return rowCount; 

    } 

    public Journal insertJournal() { 
     Journal journal = null; 
     this.jdbcTemplate.update(
       -cut for brevity-"); 
     return journal; 

    } 
} 

我的一個.jsp頁面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!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=ISO-8859-1"> 
<title>A title</title></head> 
<body> 
Hello! JSP is working fine! 
</body> 
</html> 

最後我的控制器:

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

import *my package name.entity.Journal; 
import *my package name.service.JournalService; 

@RestController 
public class HelloController { 

    @Autowired 
    private JournalService journalService; 

    @RequestMapping(value="/") 
    public String home() { 
    return "home"; 
    } 

    @RequestMapping("/greeting") 
    public String greeting() { 
     return "greeting"; 
    } 


    @RequestMapping("/findAll") 
    public String index() { 
     List<Journal> all; 
     all = journalService.findAll(); 
     return all.toString(); 
    } 

    @RequestMapping("/count") 
    public int countElements() { 
     int count; 
     count = journalService.countEntries(); 
     return count; 
    } 

    @RequestMapping("/insert") 
    public Journal insertElements() { 
     Journal insert; 
     insert = journalService.insertJournal(); 
     return insert; 
    } 

} 

我明白了什麼:

  • 我並不需要一個Web .xml文件
  • 如何連接t他與控制器業務(即使我的findAll方法返回我的數據爲{},我必須瞭解如何將它正確地寫)

我不明白:

  • 爲什麼它的沒有正確鏈接到我的JSP頁面 - 我需要什麼?
  • 我需要模型和視圖嗎?

我希望你能給我一些建議和/或一些適用於我的範圍的例子。 在此先感謝和問候!

+1

@RestController不應該被用來返回圖。雖然可能有辦法使用它返回視圖,但從根本上說它是不正確的。 – Kamal

回答

1

解決方案:

第一步:改變@RestController到@Controller

第二步:爲您要返回視圖URL(如greeting.jsp中)

@RequestMapping("/greeting") 
public String greeting() { 
    return "greeting"; 
} 

第三步:對於你想返回一個JSON對象的URL,沒有視圖(可能是一個AJAX調用)

@RequestMapping("/findAll") 
@ResponseBody 
public List<Journal> index() { 
    List<Journal> all = journalService.findAll() 
    return all; 
} 

或本

@RequestMapping("/findAll") 
@ResponseBody 
public Model index(Model model) { 
    List<Journal> all =journalService.findAll(); 
    model.addAttribute("journalList", all); 
    return model; 
} 

第四步:爲您想要的視圖和模型的網址(例如Java對象)

裁判羅布·貝利示例代碼

@RequestMapping("/findAll") 
public String index(Model model) { 
    List<Journal> all; 
    all = journalService.findAll(); 
    model.addAttribute("journalList", all); 
    return "listall"; 
} 

,您可以通過訪問您的listall.jsp對象$ {} journalList

說明: 當你在你的類中使用@RestController,它相當於爲你的類中的每個方法添加@ResponseBody。因此,它總是會在頁面上返回一個object.toString(),並且不會鏈接到您的JSP。

此代碼使用Spring 4的新的@RestController註釋,它將類標記爲控制器,其中每個方法都返回一個域對象而不是視圖。它是@Controller和@ResponseBody的縮寫。 REF:https://spring.io/guides/gs/rest-service/

JSP示例參考:https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

+0

感謝您的回答。我仍然有問題,因爲它沒有返回我希望的結果。這是文件放置的問題嗎?他們是這樣組織的:http://i63.tinypic.com/2by8g2.png – tina

+0

嗨,蒂娜,我無法查看鏈接(我不知道爲什麼)。根據你的application.properties文件,你的jsp應該在webapp/WEB-INF/jsp/{myPage} .jsp中。如果訪問url:http:// localhost:8080/greeting,它將查找WEB-INF/jsp/greeting.jsp。 – terencefung

1

如評論指出RestController是不正確的,如果你想返回一個視圖來呈現。 RestController將對象作爲JSON返回,而不是用於AJAX請求的視圖的id。如果你想返回一個視圖,只需使用Controller註解。

您不需要View,因爲它應該將返回值路由到JSP頁面。如果你想使用JSP標籤,那麼你會需要一個模型,你需要添加對象到你的模型對象。看下面的例子。第一種方法應該去welcome.jsp並且沒有可用的模型。第二種方法應該轉到listall.jsp並使journalList屬性可用於JSP標記。

@Controller 
public class ApplicationController { 
    @RequestMapping("/") 
    public String index() { 
     return "welcome"; 
    } 

    @RequestMapping("/findAll") 
    public String index(Model model) { 
     List<Journal> all; 
     all = journalService.findAll(); 
     model.addAttribute("journalList", all); 
     return "listall"; 
    } 
}