beauty_beast

上善若水 厚德载物

这两天在学习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方式提交表单的。

Feedback

# re: Spring框架学习二篇外----在WEBMVC学习遇到的问题  回复  更多评论   

2006-05-26 14:25 by null
为啥“没有配置对应属性 formView值”呢?当你新建一个东西时,不需要“展现一个新表单”吗?
一个SimpleFormController可以处理一种表单的新建、编辑、修改,并且提供数据验证和绑定的功能,我觉得这是SpringMVC最独到的地方了;处理表单以外的其他GET请求时,我都用MultiActionController。

# re: Spring框架学习二篇外----在WEBMVC学习遇到的问题  回复  更多评论   

2006-05-26 15:17 by 柳随风
呵呵,我明白你的意思,我做的测试页面是提交数据的页面,不是展现一个新表单,我实际上只是想测试数据绑定功能。
谢谢你的指导.

# re: Spring框架学习二篇外----在WEBMVC学习遇到的问题  回复  更多评论   

2006-05-26 20:07 by 潜心
当然了
spring对表单提交的方法是非常严格的,
建议把spring的API仔细研究下,里面讲的很清楚

只有注册用户登录后才能发表评论。


网站导航: