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
只是实例化,email
是null
。
您需要填写 user
的属性才能显示 ${user.email}
。
另见:
你可以尝试添加 modelAndView.getModel().put("user", webProfile.getUser());
或者您可以尝试添加 <form:form modelAttribute="profile">
并在显示时使用 ${profile.user.email}
我正在开发一个 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
只是实例化,email
是null
。
您需要填写 user
的属性才能显示 ${user.email}
。
另见:
你可以尝试添加 modelAndView.getModel().put("user", webProfile.getUser());
或者您可以尝试添加 <form:form modelAttribute="profile">
并在显示时使用 ${profile.user.email}