在Spring MVC中,如何映射嵌套的URL,例如/ settings /,/ settings / users /和/ settings / users / delete?


问题内容

在Spring 3
MVC中,我有一个称为SettingsController的控制器,它具有诸如displayUsers()的方法来显示用户列表,saveUser()和deleteUser()。SettingsContoller还控制角色和其他内容。

我很希望能够使用URL路由,这样/ settings / users将调用displayUsers(),/ settings / users /
save将调用saveUser(),/ settings / users / delete将调用deleteUser()。

我的代码在下面,并且我收到代码后的错误消息。 我究竟做错了什么?谢谢!

@Controller
@RequestMapping("/settings")
public class SettingsController {

    @Transactional
    @RequestMapping(value = {"/users/save"}, method = {RequestMethod.POST})
    public ModelAndView saveUser(details removed){
        //details removed
    }

    @RequestMapping(value = {"/users/delete"}, method = {RequestMethod.POST})
    public ModelAndView deleteUser(details removed){
       //details removed
    }

    @RequestMapping(value = {"/users"}, method = RequestMethod.GET)
    public ModelAndView settingsUsers(details removed){
      //details removed
    }

}

错误:

HTTP ERROR: 500

Could not resolve view with name 'settings/users/delete' in servlet with name 'spring'
RequestURI=/das-portal/srv/settings/users/delete

Caused by:

javax.servlet.ServletException: Could not resolve view with name 'settings/users/delete' in servlet with name 'spring'
    at        org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1029)
...

问题答案:

在我看来,您已经正确设置了控制器。正如您指出的那样,问题可能出在Spring在启动时如何解析批注。

您如何配置Sprint来解析诸如之类的注释@Controller?您是否明确设置了某种HandlerMapping?如果使用<context:component- scan>,它将为您注册一个DefaultAnnotationHandlerMapping

好消息是您可以将多个处理程序映射类链接在一起。该DispatcherServlet会检查每一个在您通过指定的顺序处理程序映射豆的顺序属性(换句话说,使用order属性来表示你的处理程序的优先级)。

因此,<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>放入配置并适当设置其order属性。