Spring ViewResolver映射到不正确的视图

时间:2016-08-26 18:19:24

标签: java jsp spring-mvc servlets

我正在编写一个简单的应用程序,我在一个在线教程(gontu系列)中学习了Spring注释。

我有一个名为StudentAdmissionController的控制器类,它处理来自spring-dispatcher-servlet的所有调用。注释如下。我只是展示了一个可读性片段。

@RequestMapping(value="/admissionForm.html", method=RequestMethod.GET)
public ModelAndView getAdmissionForm() {

    ModelAndView model = new ModelAndView("admissionForm");
    return model;
}

这将启动一个名为admissionForm.jsp的JSP,它收集两个字段。这部分工作正常。 JSP中的<form>标记看起来像这样。

<form action="/FirstSpringMVCProject/submitAdmissionForm.html" method="post">

我的控制器中有一个注释来处理这个看起来像这样的提交。

@RequestMapping(value="/submitAdmissionForm.html", method=RequestMethod.POST)
public ModelAndView submitAdmissionForm(@RequestParam("studentName") String     name, @RequestParam("studentHobby") String hobby) {

    ModelAndView model = new ModelAndView("admissionSuccess");

    logger.info("Returning " + model.getViewName());
    model.addObject("msg", "Details submitted by you:: Name: " + name + ", Hobby: " + hobby);

    return model;

}   

出于一些奇怪的原因,当它返回到调度程序servlet时,它正在尝试显示一个名为submitAdmissionForm.jsp的页面(这是注释的名称)。

我不明白为什么会这样做。 GET的注释工作正常,因为注释恰好与视图(admissionForm)同名。我输入了一个logger语句,在调试中,提供给模型的视图看起来是正确的(admissionSuccess),我想运行一个名为admissionSuccess.jsp的文件。但是viewResolver正在尝试运行一个名为submitAdmissionForm.jsp的文件(它不存在),恰好就是我所谓的注释。这不是它应该如何工作....

我一定做错了...我在Youtube上关注的例子工作得很好......所以我的调度员 - servlet中的视图解析器发生了什么......请帮忙。

我的调度程序servlet看起来像这样。

<context:component-scan base-package="com.gontuseries.studentadmissioncontroller" />

<mvc:annotation-driven/>


<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

    <property name="prefix">
        <value>/WEB-INF/</value>
    </property> 
    <property name="suffix">
        <value>.jsp</value>
    </property>


</bean> 

2 个答案:

答案 0 :(得分:0)

@RequestMapping(value="/submitAdmissionForm.html", method=RequestMethod.POST)执行您要求他做的事情:使用POST HTTP方法处理HttpRequest,并设置映射以处理这些请求,此处为submitAdmissionForm.html,仅此而已。

如果您想要显示其他视图,请在ModelAndView中使用model.setView("admissionSuccess");相应地设置视图名并将其返回。它会做得那么棒;)

在返回任何成功视图之前,不要忘记检查表单中是否设置了任何绑定错误:)

编辑:深入了解您的代码,看起来不错。但通常我会使用相同的处理程序名称,并使用不同的方法名称,例如editStudent()和editSubmitStudent(),但是在我的情况下它们指向相同的URL处理程序editStudent.do,但您似乎更喜欢在您的情况下使用editStudent.html; )

确定:使用<c:url value="/admissionForm.html" var="admissionFormUrl">在JSP表单代码中设置操作,并使用它将表单form action=${admissionFormUrl}相应地提交到处理程序映射。它将解决这个问题。

干杯!

答案 1 :(得分:0)

感谢您的回复。我想出了我的问题。很傻。我在类文件的顶部导入了错误的库。

这是我应该导入的那个

import org.springframework.web.servlet.ModelAndView;

我不小心选择了这个

import org.springframework.web.portlet.ModelAndView;

这就是为什么它行为不端......一旦我改变它,它工作正常。

此致

阿吉特