2016-09-21 41 views
2

我正在使用Spring Boot和Fremarker作爲模板引擎創建一個簡單的博客應用程序。所以基本上我有作者和郵政。 我有一個navbar.tfl這是一個局部視圖。所以當我在這個部分視圖中選擇作者下拉列表時,我想列出所有作者的名字,幷包含顯示其所有帖子的鏈接。春季 - 如何在局部視圖中訪問對象

<nav class="navbar navbar-default"> 
    <div class="container-fluid"> 
    <div class="navbar-header"> 
     <a class="navbar-brand" href="/">FSM IT</a> 
    </div> 
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
     <ul class="nav navbar-nav"> 
     <li><a href="/">Home</a></li> 
     <li class="dropdown"> 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Posts <span class="caret"></span></a> 
      <ul class="dropdown-menu"> 
      <li><a href="/post/list">List</a></li> 
      </ul> 
     </li> 
     <li class="dropdown"> 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Authors <span class="caret"></span></a> 
      <ul class="dropdown-menu"> 

      <!-- GET ALL AUTHORS HERE. HOW? --> 

      </ul> 
     </li> 
     </ul> 
     <p class="navbar-text navbar-right">Signed in as <a href="#" class="navbar-link">Guest User</a></p> 
    </div> 
    </div> 
</nav> 

問題是導航欄是局部視圖,所以它被所有視圖共享。我知道我們可以在控制器中執行諸如model.addAttribute(「authors」,authorRepository.findAll())之類的東西,以將它傳遞給視圖,但由於navbar是局部的,我必須在我的所有控制器中這樣做。

在Ruby on Rails的,我會做這樣的事情在我看來:

<% Author.all.each do |author| %> 

然後閱讀我的導航欄局部視圖所有作者姓名。

但是,隨着春天,我不知道如何做到這一點。

你能幫我解決嗎?

這裏是我的作者庫(延伸CrudRepository,所以我必須爲作者一個的findAll方法):

package com.example.repository; 

import com.example.domain.Author; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 

@Repository 
public interface AuthorRepository extends CrudRepository<Author, Long> { 

} 

的作者域:

package com.example.domain; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import java.util.List; 

@Entity 
public class Author { 

    @Id 
    @GeneratedValue 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private String email; 

    // Posts 
    @OneToMany(mappedBy = "author") 
    private List<Post> posts; 

    private Author() {} 

    public Author(String firstName, String lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    } 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    public String getFirstName() { 
    return firstName; 
    } 

    public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 

    public String getLastName() { 
    return lastName; 
    } 

    public void setLastName(String lastName) { 
    this.lastName = lastName; 
    } 

    public String getEmail() { 
    return email; 
    } 

    public void setEmail(String email) { 
    this.email = email; 
    } 

    @Override 
    public String toString() { 
    return "Author{" + 
      "id=" + id + 
      ", firstName='" + firstName + '\'' + 
      ", lastName='" + lastName + '\'' + 
      '}'; 
    } 
} 

回答

2

可以使用@ModelAttribute標註在控制器:

@ModelAttribute方法用於用c填充模型通常需要的屬性,例如用狀態或寵物類型來填充下拉列表,或者檢索Account等命令對象,以便用它來表示HTML表單上的數據。

@ModelAttribute("authors") 
public Iterable<Author> getAuthors(){ 
    return authorRepository.findAll(); 
} 

這增加了authors模型屬性到你的Spring MVC模式。如果你把它放在你的控制器中,你可以在你的模板中自動使用這個屬性。

如果您需要在多臺控制器這個模型屬性,看看在@ControllerAdvice註解如下所述:

@ModelAttribute方法也可以在@ControllerAdvice -annotated類中定義,這些方法適用於許多控制器。 See the the section called 「Advising controllers with @ControllerAdvice and @RestControllerAdvice部分了解更多詳情。

+0

你搖滾。非常感謝Johannes。工作完美無瑕! – Fernando

+0

不客氣。你會幫我一個忙,如果你正式將這個答案標記爲接受的答案:-)。謝謝 –

+0

完成!謝啦。 – Fernando