验证后重新提交表单的问题

时间:2015-04-30 17:28:05

标签: java spring validation spring-mvc

我正在尝试使用小应用程序学习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是简单的类

2 个答案:

答案 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,因为这是一个很好的做法。