Using ControllerClassNameHandlerMapping with @Controller and extending AbstractController
actually I thought I was trying something really simple. ControllerClassNameHandlerMapping sounded great to produce a small spring webapp using a very lean configuration. Just annotate the Controller with @Controller, have it extend AbstractController and the configuration shouldn't need more than this
<context:component-scan base-package="test.mypackage.controller" />
<bean id="urlMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
to resolve my requests and map them to my controllers. I've mapped the servlet to "*.spring", and calling
<approot>/hello.spring
All I ever get is an error stating that no mapp开发者_运维问答ing was found. If however I extend the MultiActionController, and do something like
<approot>/hello/hello.spring
it works. Which somehow irritates me, as I would have thought that if that is working, why didn't my first try? Does anyone have any idea? The two controllers I used looked like this
@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;
}
}
and
@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;
}
}
You shouldn't be using @Controller
at the same time as extending from AbstractController
. Do one or the other.
Also, @Controller
should be used along with the @RequestMapping
annotation.
If you want lean config, then just put this in your config file:
<context:component-scan base-package="test.mypackage.controller" />
And use this class:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String handle(ModelMap model) {
model.addAttribute("message", "Hello World!");
return "hello";
}
}
In fact, you can probably leave out the return value altogether, Spring should infer the view name "hello" from the request path, but I left this in for clarity.
As of Spring 3.0, the AbstractController
class and its kins (SimpleFormController, AbstractFormController etc etc) are deprecated. So just don't use them anymore. The annotation based @MVC model is far more powerful and flexible.
精彩评论