Java Spring 引导:检索模型属性

Java Spring Boot: Retrieving Model Attribute

我正在开发一个 Java Spring 启动 Web 应用程序,但在检索我想在我的其中一个页面上显示的模型属性时遇到问题。该页面是“/profile”,这里是 profile.jsp 页面:

<c:url var="editAccount" value="/editAccount" />
   
<div id="profileAbout">

    <div class="row">
    
        <form:form modelAttribute="user">
    
            <div class="col-md-10 col-md-offset-1">
                    
                <div style="text-align: center; font-weight: bold; font-size: x-large; margin: 1%;">Username: <c:out value="${user.email}" /></div>
    
            </div>
                
            <div class="profile-about-edit">
                <a href="${editAccount}">Edit</a>
            </div>
        
        </form:form>
        
    </div>
    
</div>

下面是控制器方法:

    @RequestMapping(value="/profile")
    public ModelAndView profile(ModelAndView modelAndView, @ModelAttribute("user") SiteUser user) {
        
        SiteUser userVal = getUser();
        Profile profile =  profileService.getUserProfile(userVal);
        
        if(profile == null) {
            profile = new Profile();
            profile.setUser(userVal);
            profileService.save(profile);
        }
        
        Profile webProfile = new Profile();
        webProfile.safeCopyFrom(profile);
        
        modelAndView.getModel().put("profile", webProfile);
        
        modelAndView.setViewName("app.profile");
        
        return modelAndView;
    }

因此,正如您在 profile.jsp 中看到的那样,我正在尝试显示 user.email,但由于某种原因无法显示。我有这个适用于其他模型属性,但我不确定如何处理这个。我还附上了一张图片来说明我的问题:

这是配置文件的实体:

@Entity
@Table(name="Profile")
public class Profile {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="profileId")
    private long profileId;
    
    @OneToOne(targetEntity=SiteUser.class)
    @JoinColumn(name="user_id", nullable=false)
    private SiteUser user;
    
    @Column(name="about", length=1000)
    @Size(max=1000, message="{edit.profile.about.size}")
    private String about;
    
   ...

}
    

这里是 SiteUser 的实体:

@Entity
@Table(name="Users")
@PasswordMatch(message="{register.repeatPassword.mismatch}")
public class SiteUser {
    
    @Id
    @Column(name="userId")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long userId;

    @Column(name="email", unique=true)
    @Email(message="{register.email.invalid}")
    @NotBlank(message="{register.email.invalid}")
    private String email;

    ...
}

试试这个。您应该使用配置文件访问它。

${profile.email} 

嗯,看起来 Profile 和 SiteUser 在语义上非常紧密,你真的应该考虑只用 1 个 bean 来同时包含 Profile 和 SiteUser 的信息。

话虽如此,您可以创建一个新的 class 假设包含两个 classes 的信息的 ProfilePageModel 并在您的视图中使用它。

既然要展示数据,为什么还要表格?我假设所有编辑都将在 /edit-profile.

页上完成

此外,此页面的模型属性似乎是 profile,而不是 user

考虑到以上所有因素,我认为您的页面应该如下所示:

<c:url var="editAccount" value="/editAccount" />
<div id="profileAbout">
    <div class="row">
        <div class="col-md-10 col-md-offset-1">
            <div style="text-align: center; font-weight: bold; font-size: x-large; margin: 1%;">Username: <c:out value="${profile.user.email}" /></div>
            </div>
            <div class="profile-about-edit">
                <a href="${editAccount}">Edit</a>
            </div>
            </div>
     </div>
</div>
    @RequestMapping(value = "/profile")
    public ModelAndView profile(final ModelAndView modelAndView, @ModelAttribute("user") final SiteUser user) {

至少当上述方法处理GET请求时,user只是实例化,emailnull

您需要填写 user 的属性才能显示 ${user.email}

另见:

你可以尝试添加 modelAndView.getModel().put("user", webProfile.getUser());

或者您可以尝试添加 <form:form modelAttribute="profile"> 并在显示时使用 ${profile.user.email}