【发布时间】:2015-09-23 06:35:19
【问题描述】:
我有具有以下请求映射方法的控制器类。
- appStart() 方法负责将用户重定向到 login.html 和 logout() 负责使会话无效并重定向用户 回到 login.jsp
- 如果我从它们的参数中删除 @ModelAttribute 那么这两个方法会抛出异常,是否有任何技巧可以让这些方法在没有模型属性的情况下工作?
控制器方法。
@RequestMapping(value="/",method=RequestMethod.GET)
public String appStart(@ModelAttribute("tempAdmin") Admin tempAdmin) {
return "login.jsp";
}
@RequestMapping(method = RequestMethod.POST,name="doLogin")
public ModelAndView doLogin(@ModelAttribute("tempAdmin") Admin tempAdmin, HttpServletRequest request) {
ModelAndView mvc = new ModelAndView();
/*
Buisness logic
*/
mvc.setViewName("home.jsp");
return mvc;
}
@RequestMapping("doLogout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if(session != null){
session.invalidate();
}
return "login.jsp";
}
login.jsp
<form:form action="doLogin" modelAttribute="tempAdmin" cssClass="form-horizontal">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">Username</label>
<div class="col-sm-10">
<form:input cssClass="form-control" path="adminId" placeholder="username" />
</div>
</div>
<div class="form-group">
<label for="passwd" class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<form:password path="password" cssClass="form-control" id="passwd" placeholder="password" />
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form:form>
堆栈跟踪。
Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'tempAdmin' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
【问题讨论】:
-
模型中必须有一个名为
tempAdmin的对象,当使用@ModelAttribute时,它是自动完成的,否则你必须手动完成。所以这不是一个黑客,它基本上是它应该如何工作的。 -
从其他两种方法返回 ModelAndView,即
appStart and logOut,新创建的 tempAdmin 作为 modelAttribute -
@M.Deinum 但是 appStart() 是为了处理上下文根,我既没有通过请求发送任何数据,也没有在响应中添加它。顺便说一句,它适用于简单的 HTML 表单标签。
-
当然可以,但是 spring 会做数据绑定,并且需要一个底层的表单对象。
-
不是 100% 确定,但值得尝试将 BindingResult 添加到您的方法签名中。必须在 ModelAttribute 之后添加: public ModelAndView doLogin(@ModelAttribute("tempAdmin") Admin tempAdmin, BindingResult bindingResult, HttpServletRequest request) {
标签: spring spring-mvc modelattribute request-mapping