2011-01-10 161 views
0

我是Spring MVC的新手。我在下面得到錯誤(目前還不能確定是什麼; S信息requierd的全部範圍,以幫助我):Spring MVC - 基本的請求映射問題

做工精細:

@RequestMapping(value = "startpage.do") 
public ModelAndView startpage(HttpServletRequest req, HttpServletResponse res) { 
. 
. 
    ModelAndView mv = new ModelAndView("startpage"); 
    mv.getModelMap().addAttribute("loginPage", loginPage); 
    return mv; 

但失敗:

  @RequestMapping(value = "somecontroller.do") 
public ModelAndView ftcontroller(HttpServletRequest req, HttpServletResponse res, ModelAndView mav) {.. ... 
    ModelAndView mv = new ModelAndView("startpage"); 
     mv.getModelMap().addAttribute("loginPage", loginPage); 
    return mav; 

正如你所看到的,相同的代碼,不同的請求映射。難道這是以某種方式讓MVC感到困惑嗎?

我得到的錯誤是:

java.lang.NullPointerException 
at jsp_servlet._web_45_inf._jsp.__somecontroller._jspService(__ftcontroller.java:103) 
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34) 
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) 
Truncated. see log file for complete stacktrace 

的BIZ邏輯是一個登錄界面「startpage.do」登錄提交時,它可能會失敗(在這種情況下,startup.do應retuend再次,在其他情況下,differn頁應返回。

如果實現這個更好的辦法,我會很高興聽到這個消息。

(應當指出的是,我想爲了將Spring MVC插入到現有的項目中,所以我試圖儘可能少地做出更改,因此不使用彈簧:形成等)

更多信息:

  1. 的JSP startpage.jsp(從 「起始頁」)解決了已經與目標= 「somecontroller.do」 的形式。

  2. 全控制器代碼:


    { 公共靜態無效的主要(字串[] args) {

    @RequestMapping(value = "startpage.do") 
    public ModelAndView startpage(HttpServletRequest req, HttpServletResponse res) { 
        System.out.println(">>>>>>HomeController: Passing through (Get Type)..."); 
        LoginPage loginPage = new LoginPage(); 
        ModelAndView mv = new ModelAndView("startpage"); 
        mv.getModelMap().addAttribute("loginPage", loginPage); 
        return mv; 
    } 
    
    @RequestMapping(value = "somecontroller.do") 
    public ModelAndView ftcontroller(HttpServletRequest req, HttpServletResponse res) 
         throws Exception { 
    
        // Parsing for login request; 
        String sUsername = req.getParameter(USER_ID); 
        String sUserPassword = req.getParameter(PASSWORD); 
        AbstractResponseDataComponent returnedResponse = new LoginCommand().login(sUsername, sUserPassword); 
    
        String returnedView = GlobalConstants.EMPTY_STRING; 
        JstlView view = new JstlView(); 
        Map model = new HashMap(); 
        if (returnedResponse.isSuccessful()) 
        { 
         view.setUrl("somecontroller"); 
         model.put("loginResponse", (LoginResponse) returnedResponse); 
    
        } else 
        { 
         view.setUrl("startpage"); 
         model.put("loginPage", (LoginPage) returnedResponse); 
        } 
        return new ModelAndView(view, model); 
    
    } 
    } 
    

    }

+0

如果您收到錯誤,告訴我們它們是什麼。 – skaffman 2011-01-10 11:33:10

+0

對不起,我會編輯。 – 2011-01-10 11:52:53

+0

@ user569544:這看起來不像映射問題。什麼是`loginPage`變量引用,並且你在JSP中引用它? – skaffman 2011-01-10 11:55:38

回答

1

順便說一句:當使用Spring 3時。0讓你的方法簽名更乾淨:中

代替

public ModelAndView ftcontroller(HttpServletRequest req, HttpServletResponse res) 
    throws Exception { 
    String sUsername = req.getParameter(USER_ID); 
    String sUserPassword = req.getParameter(PASSWORD); 
... 

做的春天3.0方式:

public ModelAndView ftcontroller(
    @RequestParam(USER_ID) String sUsername, 
    @RequestParam(PASSWORD) String sUserPassword) 
    throws Exception { 

... 
1

對於第二個問題:

如果有更好的方法來實現 這個,我很樂意聽到這個。

您正在尋找這樣的事情:

@RequestMapping(value = "startpage.do") 
public String startpage() { 
    ...  
    if (loginFailed) { 
     return "redirect:startpage.do"); 
    } else { 
     return "redirect:somecontroller.do"); 
    } 
} 

(我prefere重定向,因爲我假定該登錄方法有一定的副作用。)

0

我相信你的異常的原因是JstlView。

儘量不要使用JstlView direct,instad將視圖名稱作爲String傳遞。

final String viewName; 
Map model = new HashMap(); 
if (returnedResponse.isSuccessful()) 
{ 
    viewName = "somecontroller"; 
    model.put("loginResponse", (LoginResponse) returnedResponse); 

} else 
{ 
    viewName = "startpage"; 
    model.put("loginPage", (LoginPage) returnedResponse); 
} 
return new ModelAndView(viewName, model);