我是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等。)
更多信息:
JSP startpage.jsp(由“startpage”解析)的表单为target =“somecontroller.do”。
完整控制器代码:
类
{
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);
}
}
}
答案 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);