【问题标题】:Spring - How to access an object in a partial viewSpring - 如何在局部视图中访问对象
【发布时间】:2016-09-21 19:15:19
【问题描述】:

我正在使用 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()) 之类的操作以将其传递给视图,但由于导航栏是部分的,因此我必须在所有控制器中执行此操作。

在我看来,在 Ruby on Rails 中,我会做这样的事情:

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

然后在我的导航栏局部视图中阅读所有作者姓名。

但是对于 Spring,我不知道该怎么做。

你能帮我解决这个问题吗?

这是我的作者存储库(它扩展了 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 + '\'' +
            '}';
  }
}

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

    你可以在你的控制器中使用@ModelAttribute注解:

    @ModelAttribute 方法用于使用常用属性填充模型,例如用状态或宠物类型填充下拉列表,或者检索像 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 部分了解更多详情。

    【讨论】:

    • 你摇滚。非常感谢约翰内斯。完美无瑕!
    • 不客气。如果您将此答案正式标记为已接受的答案,您会帮我一个忙:-)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多