Posted on 2006-05-25 18:10
柳隨風(fēng) 閱讀(3676)
評論(3) 編輯 收藏 所屬分類:
開源框架
這兩天在學(xué)習(xí)SpringMVC遇到兩個(gè)比較郁悶的問題,估計(jì)新學(xué)者很容易遇到,和大家分享一下,避免出現(xiàn)類似的問題。
1、 No request handling method with name 'insert' in class? "ClassName",頁面顯示為404錯(cuò)誤
這個(gè)問題出現(xiàn)在使用多操作控制器情況下,相關(guān)的操作方法中對應(yīng)的方法參數(shù)前兩位必須是request,response對象,必須要有,否則會報(bào)如上異常。
2、這個(gè)問題困惑了我半天,在網(wǎng)上也有類似的問題,但沒有正確解決方法,異常如下:
javax.servlet.ServletException: ModelAndView [ModelAndView: materialized View is [null]
這個(gè)問題可能出現(xiàn)的場景很多,我所描述的只是其中之一,沒有相關(guān)解決方法,只有查看相關(guān)源代碼,開源就是有這個(gè)好處。
異常拋出代碼為:
??????? at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:924)
查看了相關(guān)源代碼,一層一層看下去
首先在ModelAndView 類實(shí)例是在DispatcherServlet類中的doDispatch方法中創(chuàng)建的,
再跟蹤doDispatch方法中相關(guān)代碼行
HandlerAdapter?ha?
=
?getHandlerAdapter(mappedHandler.getHandler());
mv?
=
?ha.handle(processedRequest,?response,?mappedHandler.getHandler());
ha是一個(gè)接口實(shí)現(xiàn)類,在該場景下,對應(yīng)的接口實(shí)現(xiàn)類為:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter類中對應(yīng)的實(shí)現(xiàn)代碼為:
((Controller)?handler).handleRequest(request,?response)
調(diào)用的是對應(yīng)的Controller接口中方法,當(dāng)前Controller對應(yīng)的接口實(shí)現(xiàn)類為我們配置的自定義控制類,一般繼承于org.springframework.web.servlet.mvc.SimpleFormController;一層一層再跟蹤發(fā)現(xiàn):
SimpleFormController繼層于同包AbstractFormController類,而
AbstractFormController繼承于同包AbstractController類,對應(yīng)的
handleRequest(request,response)在AbstractController類中實(shí)現(xiàn),最終調(diào)用代碼如下:
return
?handleRequestInternal(request,?response)
handleRequest方法為一個(gè)抽象方法,在AbstractFormController類中實(shí)現(xiàn),終于找到原因了,呵呵
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);
????????}
????}
原因?qū)嶋H很簡單,就因?yàn)槲以谝峤坏谋韱沃袥]有采用post方法,呵呵
而isFormSubmission(request)就是根據(jù)此項(xiàng)判斷,所以其實(shí)際執(zhí)行的代碼為:
return showNewForm(request, response);
而我在對應(yīng)的配置屬性中沒有配置對應(yīng)屬性 formView值,因?yàn)槲冶緛砭筒皇且宫F(xiàn)一個(gè)新表單。
故最后返回的ModelAndView為空。
問題都解決了,只是沒想到對提交表單這么嚴(yán)格,其他web框架是沒有這種限制,不過也沒多大關(guān)系,在實(shí)際開發(fā)中我們大都是采用post方式提交表單的。