2011-01-10 163 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);