我有JSP视图,并且在2个表单中,有2个控制器(1个-UserController,2个-Home Controller)
UserController-管理所有登录到站点的信息
家庭控制器-管理所有用户操作
当我尝试在One Controller中工作时效果很好,但是当我将方法拆分为特殊控制器(HomeController)时出现错误
这是为什么?
*从UserController调用房屋,并将其中所需的操作发送到HomeController
更新资料
home.jsp->需要签署到“ HomeController”的表单
*它包括2种形式(1-“ scanRequest”> UserController,2-“ scanForm”> HomeController)
<form:form method="POST" action="${contextPath}/scanRequest" modelAttribute="scanForm" class="form-signin">
<h2 class="form-signin-heading">Create new scan: </h2>
<table>
<tr>
<td>
<spring:bind path="seller_name">
<div class="form-group ${status.error ? 'has-error' : ''}">
<form:input type="text" path="seller_name" class="form-control" placeholder="Seller Name" autofocus="true"></form:input>
<form:errors path="seller_name"></form:errors>
</div>
</spring:bind>
</td>
<td>
<input type="hidden" name="scanForm" value="${UserRequestDTO}" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Scan</button>
</td>
</tr>
</table>
</form:form>
<form:form method="POST" action="${contextPath}/scanTest" modelAttribute="scanTestForm" class="form-signin">
<h3>${msg}</h3>
<input type="hidden" name="scanTestForm" value="${UserRequestDTO}" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Test</button>
</form:form>
家用控制器:
@Controller
public class HomeController {
@ModelAttribute("scanTestForm")
public UserRequestDTO getScanForm(){
return new UserRequestDTO();
}
@RequestMapping(value = "/scanTest", method = RequestMethod.POST)
public String scanRequest(@ModelAttribute("scanTestForm")UserRequestDTO userRequestDTO, BindingResult bindingResult, Model model) {
String strMsg = "-----------scanTest---------- \r\n";
if (bindingResult.hasErrors()) {
return "home";
}
model.addAttribute("msg", strMsg);
return "home";
}
}
UserController
@ModelAttribute("scanForm")
public UserRequestDTO getScanForm(){
return new UserRequestDTO();
}
@RequestMapping(value = "/scanRequest", method = RequestMethod.POST)
public String scanRequest(@ModelAttribute("scanForm")UserRequestDTO userRequestDTO, BindingResult bindingResult, Model model) {
logger.info("scanRequest():");
String strMsg = "---------------------- \r\n" + userRequestDTO.getSeller_name() + "\r\n";
// Checking if there is any errors with the seller
if (bindingResult.hasErrors()) {
return "home";
}
model.addAttribute("msg", strMsg);
return "home";
}
**我只知道它的工作原理,然后我可以继续执行我的代码。
**更新:错误-当我点击“测试”按钮时**
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
יול 26, 2016 2:34:44 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [searcher] in context with path [/Searcher] threw exception [An exception occurred processing JSP page /WEB-INF/views/home.jsp at line 47
44: <table>
45: <tr>
46: <td>
47: <spring:bind path="seller_name">
48: <div class="form-group ${status.error ? 'has-error' : ''}">
49: <form:input type="text" path="seller_name" class="form-control" placeholder="Seller Name" autofocus="true"></form:input>
50: <form:errors path="seller_name"></form:errors>
Stacktrace:] with root cause
javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'scanForm' available as request attribute
at org.springframework.web.servlet.tags.BindTag.doStartTagInternal(BindTag.java:120)
at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAw
最佳答案
在获得更多详细信息之后,更容易理解发生了什么-即使还有像您第一次显示home.jsp
一样的阴暗面。但是我们在这里:
您设法显示home.jsp
(如何?)
您单击Test
按钮
浏览器向/scanTest
发送发帖请求,该请求由HomeController.scanRequest
处理
控制器在Model中找到一个由POSTed参数构建的属性scanTestForm
,添加一个msg
属性并将其转发以查看home
(我假设它是home.jsp
)
tomcat启动home.jsp以使用scanTestForm
和msg
作为请求属性来构建响应-但没有scanForm
,因为控制器尚未将响应添加到模型中...<form:form ... modelAttribute="scanForm" ...>
在请求中查找scanForm
属性,未找到任何属性并引发错误
怎么修:
快速又肮脏:只需在控制器中添加model.addAttribute("scanForm", userRequestDTO);
。 JSP将找到它,并且应该足以克服此错误
更正确:发布后不只是转发到视图,而是重定向到您最初用于显示home.jsp
的控制器。这是post-redirect-get模式。您甚至可以使用redirectAttributes
将模型属性直接传递给另一个控制器。
但是无论如何,我不明白为什么如果在响应构建时它们应该使用相同的值,那么为什么要在同一页面中使用两个不同的模型属性名称。因为modelAttribute名称仅在那时使用,所以在JSP构建响应时,而不是在浏览器发回POST请求时使用。