gpt4 book ai didi

java - Spring SimpleFormController - 在成功 View 中包含搜索表单

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:32 24 4
gpt4 key购买 nike

10 年 1 月 31 日更新:由于此主题继续获得大量浏览...我想知道它最近是否对任何人有帮助?请随时发表评论/反馈,谢谢。


我有一个 Spring 表单,我想在其中重用搜索页面以将结果包含在搜索表单下。目前,当我这样做时,我在加载成功 View 时遇到以下错误:

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>

还有...这是我的表单 Controller 类(减去导入):

    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;
}
}

预先感谢您的帮助!

-j

更新:

我根据下面的回答将其移植到带注释的 Controller 。这是新的/工作代码:

@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();
}
}
}
}

最佳答案

尝试使用(抛出异常而不是..)

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

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

--

您应该使用注解而不是扩展 Controller 。 Spring 3.0 将弃用 Controller 层次结构。

关于java - Spring SimpleFormController - 在成功 View 中包含搜索表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com