使用ControllerClassNameHandlerMapping和@Controller并扩展AbstractController

时间:2010-03-18 13:05:52

标签: java spring spring-mvc

实际上我以为我在尝试一些非常简单的事情。 ControllerClassNameHandlerMapping听起来很棒,可以使用非常精简的配置生成一个小型弹簧webapp。只需用@Controller注释Controller,让它扩展AbstractController,配置不需要超过这个

<context:component-scan base-package="test.mypackage.controller" />
<bean id="urlMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

解决我的请求并将它们映射到我的控制器。我已将servlet映射到“* .spring”,并调用

<approot>/hello.spring

我得到的只是一个错误,表明没有找到映射。但是,如果我扩展MultiActionController,并执行类似

的操作
<approot>/hello/hello.spring

它有效。这有点让我感到恼火,因为我觉得如果那样有效,为什么我的第一次尝试没有?有谁有想法吗?我使用的两个控制器看起来像这样

@Controller
public class HelloController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello World!");
    return modelAndView;
    }
}

@Controller
public class HelloController extends MultiActionController {
public ModelAndView hello(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello World!");
    return modelAndView;
    }
}

2 个答案:

答案 0 :(得分:2)

您不应在@Controller延伸的同时使用AbstractController。做一个或另一个。

此外,@Controller应与@RequestMapping注释一起使用。

如果你想要精简配置,那就把它放在配置文件中:

<context:component-scan base-package="test.mypackage.controller" />

并使用此课程:

@Controller
public class HelloController {

   @RequestMapping("/hello")
   public String handle(ModelMap model) {
      model.addAttribute("message", "Hello World!");
      return "hello";
   }
}

实际上,你可以完全忽略返回值,Spring应该从请求路径推断出视图名称“hello”,但为了清楚起见,我将其留下了。

答案 1 :(得分:2)

从Spring 3.0开始,不推荐使用AbstractController类及其别名(SimpleFormController,AbstractFormController等)。所以不要再使用它们了。基于注释的@MVC模型功能强大且灵活。