Posted on 2006-05-25 18:10
柳随风 阅读(3660)
评论(3) 编辑 收藏 所属分类:
开源框架
这两天在学习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方式提交表单的。