开发者

Using ControllerClassNameHandlerMapping with @Controller and extending AbstractController

开发者 https://www.devze.com 2022-12-23 02:52 出处:网络
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

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消