代码之家  ›  专栏  ›  技术社区  ›  AJ.

Spring SimpleFormController-在成功视图中包括搜索表单

  •  4
  • AJ.  · 技术社区  · 16 年前

    当前位置:由于此线程继续获得大量视图…我很好奇最近它是否对任何人有帮助?请随时留下评论/反馈,谢谢。


    我有一个Spring表单,我想在其中重用搜索页面,将结果包含在搜索表单下。当前,当我执行此操作时,在加载成功视图时出现以下错误:

    java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'searchAccounts' available as request attribute
    

    下面是我的bean配置:

    <bean name="/search.html" class="myapp.web.AccountSearchController">
            <property name="sessionForm" value="true"/>
        <property name="commandName" value="searchAccounts"/>
        <property name="commandClass" value="myapp.service.AccountSearch"/>
        <property name="validator">
            <bean class="myapp.service.AccountSearchValidator"/>
        </property>
        <property name="formView" value="accountSearch"/>
        <property name="successView" value="accountSearchResults"/>
    </bean>
    

    以下是包含搜索表单的JSP片段:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    
    <form:form method="post" commandName="searchAccounts">
    
    <table valign="top" cellspacing="0" cellpadding="0" width="500" border="0">
    
        <tr>
            <td valign="top">
    
            <div class="border-title">Account Search</div>
    
            <div id="navhome">
            <div class="border">
            <div id="sidebarhome">
    
    
            <table id="form">
                <tr>
                    <td colspan="2">Search by Account ID or Domain Name. If
                    values are provided for both, only accounts matching both values
                    will be returned.</td>
                </tr>
    
                <tr>
                    <td colspan="2">&nbsp;</td>
                </tr>
    
                <tr>
                    <td align="right" valign="top"><form:label path="accountId">Account ID</form:label>:</td>
                    <td><form:input path="accountId" size="30"/></td>
                </tr>
                <c:set var="accountIdErrors"><form:errors path="accountId"/></c:set>
                <c:if test="${not empty accountIdErrors}">
                <tr>
                     <td>&nbsp;</td>
                     <td>${accountIdErrors}</td>
                </tr>
                </c:if>
                <tr>
                    <td align="right" valign="top"><form:label path="domainName">Domain Name</form:label>:</td>
                    <td><form:input path="domainName" size="30"/></td>
                </tr>
                <c:set var="domainNameErrors"><form:errors path="domainName"/></c:set>
                <c:if test="${not empty domainNameErrors}">
                <tr>
                     <td>&nbsp;</td>
                     <td>${domainNameErrors}</td>
                </tr>
                </c:if>
                <tr>
                    <td colspan="2">&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td><input type="submit" name="submit" value="Search">
                    </td>
                </tr>
            </table>
    
            </div>
            </div>
            </div>
    
            </td>
        </tr>
    </table>
    </form:form>
    

    下面是我的表单控制器类(减去导入):

        public class AccountSearchController  extends SimpleFormController {
    
        protected final Log logger = LogFactory.getLog(getClass());
    
        public ModelAndView onSubmit(Object command, BindException errors) throws ServletException {
            String accountId = ((AccountSearch) command).getAccountId();
            String domainName = ((AccountSearch) command).getDomainName();
    
            logger.info("User provided search criteria...\n\tDomain Name: " + domainName + "\n\tAccountId: " + accountId);
    
            //TODO do search
    
            logger.info("returning from AccountSearch form view to " + getSuccessView());
    
            return new ModelAndView(getSuccessView());
        }
    
        protected Object formBackingObject(HttpServletRequest request) throws ServletException {
            AccountSearch accountSearch = new AccountSearch();
            return accountSearch;
        }
    }
    

    提前感谢您的帮助!

    -aj

    根据下面的答案,我将其移植到一个带注释的控制器。以下是新代码/工作代码:

    @Controller
    @RequestMapping("/search.html")
    public class AccountSearchController {
    
        // note: this method does not have to be called setupForm
        @RequestMapping(method = RequestMethod.GET)
        public String setupForm(Model model) {
            AccountSearchCriteria accountSearchCriteria = new AccountSearchCriteria();
            model.addAttribute("accountSearchCriteria", accountSearchCriteria);
            model.addAttribute("title", "Account Search");
            return "accountSearch";
        }
    
        // note: this method does not have to be called onSubmit
        @RequestMapping(method = RequestMethod.POST)
        public String onSubmit(@ModelAttribute("accountSearchCriteria") AccountSearchCriteria accountSearchCriteria, BindingResult result, SessionStatus status, Model model) {
            new AccountSearchValidator().validate(accountSearchCriteria, result);
            if (result.hasErrors()) {
                return "accountSearch";
    
            } else {
                ArrayList<AccountSearchCriteria> accountSearchResults = new ArrayList<AccountSearchCriteria>();
    
                AccountSearchCriteria rec = new AccountSearchCriteria();
                rec.setDomainName("ajcoon.com");
                accountSearchResults.add(rec);
    
                AccountSearchCriteria rec2 = new AccountSearchCriteria();
                rec2.setDomainName("ajcoon2.com");
                accountSearchResults.add(rec2);
    
                //TODO do search
                //ArrayList<HashMap<String,String>> accountSearchResults = new AccountSearchService().search(accountId,domainName);
    
                if( accountSearchResults.size() < 1 ){
                    result.rejectValue("domainName", "error.accountSearch.noMatchesFound", "No matching records were found.");
                    return "accountSearch";
    
                } else if(accountSearchResults.size() > 1){
                    model.addAttribute("accountSearchResults", accountSearchResults);
                    return "accountSearch";
    
                } else {
                    status.setComplete();
                    return "redirect:viewAccount?accountId=";
                    //return "redirect:viewAccount?accountId=" + accountSearchResults.get(0).getAccountId();
                }
            }
        }   
    }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   surajz    16 年前

    protected Object formBackingObject(HttpServletRequest request)
                                throws Exception {
            AccountSearch accountSearch = new AccountSearch();
            System.out.println("inside formBackingObject");
            return accountSearch;
    }
    

    似乎没有执行formBackingObject方法。使用上述更改重新运行代码,并查看日志控制台以查看是否执行了该方法。

    --