使用基于注释的控制器映射。
@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
,但我确实需要@Controller
@RequestMapping("/profile/alerts")
public class AlertsController {
@RequestMapping(value="create", method=RequestMethod.GET)
public void create(HttpServletRequest request, Model model) {
}
}
。现在,事情变得奇怪了。我真的想把它映射到`/ profile / alerts',所以我把它改成了这个:
profile/alerts/create
我在转到/alerts/create
时收到404,但由于某种原因仍然映射到@Controller
@RequestMapping("foobar")
public class AlertsController {
@RequestMapping(value="create", method=RequestMethod.GET)
public void create(HttpServletRequest request, Model model) {
}
}
?!?!?!
我将其更改为:
{{1}}
这很奇怪,非常不方便。任何人都有办法解决这个问题,甚至调试正在发生的事情?
答案 0 :(得分:4)
在您的第一个片段中,您错过了领先的/
。它应该类似于@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,可能是。
答案 1 :(得分:0)
您可以对类注释进行url匹配,也可以对方法进行更精细的匹配。类级别注释前置于方法级别注释
@Controller
@RequestMapping(value = "/admin")
public class AdminController {
@RequestMapping(value = "/users", method = RequestMethod.GET)
/* matches on /admin/users */
public string users() { ... }
}
它非常接近您原来的第三个片段,除非您忘记了领先的/.