Spring (javax或hibernate)验证失败后如何在JSP中保留变量
因此,在javax或hibernate验证失败后,JSP中的模型变量就消失了 因为我从模型中加载spring消息的代码,如Fillow:Spring (javax或hibernate)验证失败后如何在JSP中保留变量,spring,jsp,spring-mvc,jsp-tags,Spring,Jsp,Spring Mvc,Jsp Tags,因此,在javax或hibernate验证失败后,JSP中的模型变量就消失了 因为我从模型中加载spring消息的代码,如Fillow: <spring:message code="${editUser.role.rolename}"/> 在这种情况下,editUser是由表单操纵的模型对象,rolename属性保存spring messages标记使用的翻译代码 我的实体: @Entity @Table(name = "User") public class BUser {
<spring:message code="${editUser.role.rolename}"/>
在这种情况下,editUser
是由表单操纵的模型对象,rolename
属性保存spring messages标记使用的翻译代码
我的实体:
@Entity
@Table(name = "User")
public class BUser {
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@NotEmpty
@NotBlank
@Column(name = "username")
private String username;
....
@ManyToOne
@JoinColumn(name = "role", unique = true)
private BRole role;
}
控制器的一部分:
@Controller
public class AccountController {
@RequestMapping(value = "/secure/user/edit/{username}", method = RequestMethod.GET)
public String editUser(Model model, @PathVariable String username) {
BUser user = bUserService.getUserByUsername(username);
if (user != null) {
user.setPassword(null);
model.addAttribute("editUser", user);
model.addAttribute("roles", bUserService.getRoles(false));
return "editUser";
} else {
return "404";
}
}
@RequestMapping(value = "/secure/user/edit/{username}", method = RequestMethod.POST)
public String editProcessUser(Model model, @PathVariable String username, @UserPrincipal BUser login, HttpSession session,
@Valid @ModelAttribute("editUser") BUser editUser, BindingResult result) {
if (result.hasErrors()) {
return "editUser";
}
//some more code after that... never reached after validation error
}
}
如何正确处理这类问题
谢谢。应OP的要求,作为答案发布
您可以使用“@SessionAttribute”将模型属性设置为控制器中的会话范围。每当您设置已标识模型属性的值时,它都会将其置于会话中
例如,如果我有一个名为“myBean”的属性,您可以执行以下操作:
@Controller
@RequestMapping("/myApp")
@SessionAttribute("myBean")
public class MyController {
// ...
@RequestMapping("/getMyBean")
public String getMyBean(@ModelAttribute("myBean") MyBean myBean, Model uiModel) {
uiModel.addAttribute("myBean", new MyBean());
}
// ...
}
在这个简单的示例中,getMyBean()
每次都创建一个MyBean
的新实例。这不是您可能要做的事情,但请注意,它还设置了模型中的“myBeam”,这会将新创建的MyBean
放入会话范围。这有几个结果:
null
,因为Spring现在将更新现有会话版本,并且不会每次都创建一个空的
的内容时,这一点特别有用。例如:
@Controller
@RequestMapping("/myApp")
@SessionAttribute({"myBean", "cities"})
public class MyController {
// ...
@RequestMapping("/getMyBean")
public String getMyBean(@ModelAttribute("myBean") MyBean myBean, Model uiModel) {
uiModel.addAttribute("myBean", new MyBean());
}
// ...
@ModelAttribute("cities")
private List<String> createCitiesList() {
List<String> cities = new ArrayList<String>();
cities.add("Jacksonville");
cities.add("Orlando");
cities.add("Miami");
cities.add("Tampa");
return cities;
}
// ...
}
@控制器
@请求映射(“/myApp”)
@SessionAttribute({“myBean”,“cities”})
公共类MyController{
// ...
@请求映射(“/getMyBean”)
公共字符串getMyBean(@ModelAttribute(“myBean”)myBean myBean,Model uiModel){
addAttribute(“myBean”,newmybean());
}
// ...
@模型属性(“城市”)
私有列表createCitiesList(){
List cities=new ArrayList();
城市。添加(“杰克逊维尔”);
城市。添加(“奥兰多”);
城市。添加(“迈阿密”);
城市。添加(“坦帕”);
回归城市;
}
// ...
}
在本例中,我们创建了两个@SessionAttributes
,一个用于“myBean”,另一个用于“cities”。我们还创建了一个标有@modeldattribute
的方法,该方法返回城市名称的列表。最终的结果是,我们现在将在会话中自动生成一个城市名称列表,我们可以将其放入任何处理程序方法或直接在JSP中使用。此方法可用于构建和填充任何您想要的内容,包括您的bean(如果需要)
您可以在此处阅读更多内容:
将其再次添加到模型中如何?或者将其放入Session@Bart不起作用,如果我这样做,错误消息就会消失。@CodeChimp我用
试过,但不起作用。或者您的意思是将其添加到控制器中的会话中,在这种情况下,我认为c:set
标记也应该这样做。请显示处理验证的处理程序的控制器代码。
@Controller
@RequestMapping("/myApp")
@SessionAttribute({"myBean", "cities"})
public class MyController {
// ...
@RequestMapping("/getMyBean")
public String getMyBean(@ModelAttribute("myBean") MyBean myBean, Model uiModel) {
uiModel.addAttribute("myBean", new MyBean());
}
// ...
@ModelAttribute("cities")
private List<String> createCitiesList() {
List<String> cities = new ArrayList<String>();
cities.add("Jacksonville");
cities.add("Orlando");
cities.add("Miami");
cities.add("Tampa");
return cities;
}
// ...
}