Spring MVC - 基本RequestMapping问题

时间:2011-01-10 11:32:14

标签: java spring-mvc

我是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

当提交Login时,biz逻辑是一个登录屏幕“startpage.do”,它可能会失败(在这种情况下,startup.do应该再次返回,在其他情况下,应该返回不同的页面。

如果有更好的方法来实现这一点,我会很高兴听到这一点。

(应该注意的是,我正在尝试将Spring MVC插入到现有项目中,因此我尝试尽可能少地进行更改,因此不使用spring:form等。)

更多信息:

  1. JSP startpage.jsp(由“startpage”解析)的表单为target =“somecontroller.do”。

  2. 完整控制器代码:


    {     public static void main(String [] 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);
    
    }
    }
    

    }

3 个答案:

答案 0 :(得分:1)

关于你的第二个问题:

  

如果有更好的实施方式   这个,我很高兴听到这个。

你在寻找这样的东西:

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

(我更喜欢重定向,因为我认为登录方法有一些副作用。)

答案 1 :(得分:1)

BTW:使用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 {

...

答案 2 :(得分: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);