繁体   English   中英

Spring MVC对控制器映射非常困惑

[英]Spring MVC very confused about controller mappings

使用基于注释的控制器映射。

@Controller
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

当访问alerts/create ,我收到消息Does your handler implement a supported interface like Controller? 这看起来很奇怪,与文档所说的相反。

所以,我在类中添加了一个RequestMapping

@Controller
@RequestMapping("/alerts")
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

这样就可以了。 我不应该需要@RequestMapping ,但我确实如此。 现在,事情变得奇怪了。 我真的想把它映射到`/ profile / alerts',所以我把它改成这个:

@Controller
@RequestMapping("/profile/alerts")
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

我在进行profile/alerts/create时得到404,但由于某种原因它仍然映射到/alerts/create ?!?!?!

我把它改为:

@Controller
@RequestMapping("foobar")
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

这很奇怪,非常不方便。 任何人都有办法解决这个问题,甚至调试正在发生的事情?

在你的第一个片段中,你错过了领先/ 它应该像@RequestMapping(value="/create", method=RequestMethod.GET)

现在你应该把你的第三个片段改成这个,

@Controller
public class AlertsController {

  @RequestMapping(value="/profile/alerts/create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

此外,当您使方法void ,期望DispatcherServlet回退到默认视图名称“profile / alerts / create”。 然后将它与合适的视图解析器结合使用。 例如,

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

那里有404,可能是。

您可以对类注释进行URL匹配,也可以对方法进行更精细的匹配。 类级别注释前置于方法级别注释

@Controller
@RequestMapping(value = "/admin")
public class AdminController {

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  /* matches on /admin/users */
  public string users() {  ...  }
}

它非常接近你原来的第三个片段,除非你忘了领先/。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM