我有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以使用scanTestFormmsg作为请求属性来构建响应-但没有scanForm,因为控制器尚未将响应添加到模型中...
<form:form ... modelAttribute="scanForm" ...>在请求中查找scanForm属性,未找到任何属性并引发错误


怎么修:


快速又肮脏:只需在控制器中添加model.addAttribute("scanForm", userRequestDTO);。 JSP将找到它,并且应该足以克服此错误
更正确:发布后不只是转发到视图,而是重定向到您最初用于显示home.jsp的控制器。这是post-redirect-get模式。您甚至可以使用redirectAttributes将模型属性直接传递给另一个控制器。


但是无论如何,我不明白为什么如果在响应构建时它们应该使用相同的值,那么为什么要在同一页面中使用两个不同的模型属性名称。因为modelAttribute名称仅在那时使用,所以在JSP构建响应时,而不是在浏览器发回POST请求时使用。

09-11 03:17
查看更多