这两天在学习SpringMVC遇到两个比较郁闷的问题,估计新学者很容易遇到,和大家分享一下,避免出现类似的问题。
1、 No request handling method with name 'insert' in class? "ClassName",页面显示为404错误
这个问题出现在使用多操作控制器情况下,相关的操作方法中对应的方法参数前两位必须是request,response对象,必须要有,否则会报如上异常。
2、这个问题困惑了我半天,在网上也有类似的问题,但没有正确解决方法,异常如下:
javax.servlet.ServletException: ModelAndView [ModelAndView: materialized View is [null]
这个问题可能出现的场景很多,我所描述的只是其中之一,没有相关解决方法,只有查看相关源代码,开源就是有这个好处。
异常抛出代码为:
??????? at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:924)
查看了相关源代码,一层一层看下去
首先在ModelAndView 类实例是在DispatcherServlet类中的doDispatch方法中创建的,
再跟踪doDispatch方法中相关代码行
HandlerAdapter?ha?
=
?getHandlerAdapter(mappedHandler.getHandler());
mv?
=
?ha.handle(processedRequest,?response,?mappedHandler.getHandler());
ha是一个接口实现类,在该场景下,对应的接口实现类为:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter类中对应的实现代码为:
((Controller)?handler).handleRequest(request,?response)
调用的是对应的Controller接口中方法,当前Controller对应的接口实现类为我们配置的自定义控制类,一般继承于org.springframework.web.servlet.mvc.SimpleFormController;一层一层再跟踪发现:
SimpleFormController继层于同包AbstractFormController类,而
AbstractFormController继承于同包AbstractController类,对应的
handleRequest(request,response)在AbstractController类中实现,最终调用代码如下:
return
?handleRequestInternal(request,?response)
handleRequest方法为一个抽象方法,在AbstractFormController类中实现,终于找到原因了,呵呵
protected
?
final
?ModelAndView?handleRequestInternal(HttpServletRequest?request,?HttpServletResponse?response)
????????????
throws
?Exception?
{
????????
//
?Form?submission?or?new?form?to?show?
????????
if
?(isFormSubmission(request))?
{
????????????
//
?Form?submission:?in?session-form?mode,?we?need?to?find
????????????
//
?the?form?object?in?the?HTTP?session.
????????????
if
?(isSessionForm())?
{
????????????????HttpSession?session?
=
?request.getSession(
false
);
????????????????
if
?(session?
==
?
null
?
||
?session.getAttribute(getFormSessionAttributeName(request))?
==
?
null
)?
{
????????????????????
//
?Cannot?submit?a?session?form?if?no?form?object?is?in?the?session.
????????????????????
return
?handleInvalidSubmit(request,?response);
????????????????}
????????????}
????????????
//
?Found?form?object?in?HTTP?session:?fetch?form?object,
????????????
//
?bind,?validate,?process?submission.
????????????Object?command?
=
?getCommand(request);
????????????ServletRequestDataBinder?binder?
=
?bindAndValidate(request,?command);
????????????
return
?processFormSubmission(request,?response,?command,?binder.getErrors());
????????}
????????
else
?
{
????????????
//
?New?form?to?show:?render?form?view.
????????????
return
?showNewForm(request,?response);
????????}
????}
原因实际很简单,就因为我在要提交的表单中没有采用post方法,呵呵
而isFormSubmission(request)就是根据此项判断,所以其实际执行的代码为:
return showNewForm(request, response);
而我在对应的配置属性中没有配置对应属性 formView值,因为我本来就不是要展现一个新表单。
故最后返回的ModelAndView为空。
问题都解决了,只是没想到对提交表单这么严格,其他web框架是没有这种限制,不过也没多大关系,在实际开发中我们大都是采用post方式提交表单的。