我正在尝试使用小应用程序学习Spring MVC,但遇到了问题。
我已经为用户注册创建了一个表单,现在在表单提交上我正在使用注释进行验证。
验证失败时,我将重新显示包含错误详细信息的表单。但是当我重新提交表单时,我面临着如何处理URL映射的问题。
这是我的控制器代码:
@Controller
public class PersonController {
private PersonService personService;
public PersonService getPersonService() {
return personService;
}
@Autowired
public void setPersonService(PersonService personService) {
this.personService = personService;
}
@RequestMapping("/allpersons")
public String showPersonListPage(Map<String, Object> model) {
model.put("persons", getPersonService().fetchAllPersons());
return "person_list";
}
@RequestMapping(value = "/person", method = GET)
public String showNewPersonForm(Map<String, Object> model) {
model.put("person", new Person());
return "new_person";
}
@RequestMapping(value = "/person/add", method = RequestMethod.POST)
public String addPersonFromForm(@Valid Person person,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "new_person";
}
getPersonService().addPerson(person);
return "redirect:/allpersons";
}
}
最初我尝试使用网址http://localhost:8080/myapp/person
来显示表单。我的表单代码是这样的:
new_person.jsp
<div>
<h2>New Person Form</h2>
<sf:form method="POST" modelAttribute="person"
action="person/add">
<fieldset>
<table cellspacing="0">
<tr>
<th><label for="name">Name:</label></th>
<td><sf:input path="name" id="name" /></td>
<td><sf:errors path="name" /></td>
</tr>
<tr>
<th><label for="age">Age:</label></th>
<td><sf:input path="age" id="age" /></td>
<td><sf:errors path="age" /></td>
</tr>
<tr>
<th><input type="Submit" value="Submit" /></th>
<td></td>
</tr>
</table>
</fieldset>
</sf:form>
</div>
现在,在表单提交时,我的表单的网址格式为person/add
,因此网址将更改为http://localhost:8080/myapp/person/add
。最初我提交的表单包含错误的信息,因此表单会重新加载验证错误消息。
现在,当我使用正确的值重新提交表单时,网址将转到http://localhost:8080/myapp/person/person/add
,而不是http://localhost:8080/myapp/person/add
。
有人可以帮我解决这个基本问题吗?
如果您需要更多详细信息,请与我们联系。
这是我的弹簧配置文件。
仅添加文件的主要条目:
<mvc:annotation-driven validator="validator" />
<context:component-scan
base-package="com.examples" />
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix" value=".jsp" />
</bean>
PersonService
(有@Service
注释)&amp; Person
是简单的类
答案 0 :(得分:1)
维护GET
以及POST
的单一网址格式。
因此,在表单提交的控制器中,处理程序应该是这样的:
@RequestMapping(value = "/person", method = RequestMethod.POST)
public String addPersonFromForm(@Valid Person person,
BindingResult bindingResult) {
... // your code
}
在上面的代码中,我更改了网址格式。
现在进入您的JSP,删除action
属性以避免URL不匹配。
进行这两项更改将解决问题。
答案 1 :(得分:1)
我在任何地方都看不到“form2”引用。也许你错过了一些问题?或者只是写错了?
另外,作为建议,我建议您使用GET和POST方法使用相同的URL,因为这是一个很好的做法。