我正在使用Spring MVC开发一个Web应用程序。
我有两个控制器:QuestionController和TodoController - 都扩展了MultiActionController并且都定义了list()
方法。
我已在web.xml中为调度程序定义了映射,如下所示:
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/todo/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/question/*</url-pattern>
</servlet-mapping>
下一步,我在mvc配置中定义了特定的控制器映射,如下所示:
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/todo/**">todoController</prop>
<prop key="/question/**">questionController</prop>
</props>
</property>
通过上述方案,一切正常,我可以导航到/question/list
,我看到了预期的问题,我可以导航到/todo/list
,我看到了预期的待办事项列表。
现在,我想向使用@PathVariable
的QuestionController添加一个方法(因此我可以使用一个方法处理所有网址,例如:/question/detail/[QUESTION_ID]
)。为了实现这一点,我将@RequestMapping
注释添加到我的问题控制器中的detail()
方法 - 为了完成这项工作,我需要将@Controller
注释添加到我的QuestionController类,以及适用的{{ 1}}注释到我原来的@RequestMapping
方法。
同样,这一切似乎完美无缺 - 我仍然可以通过list()
访问问题列表页面并导航到/question/list
,这样我就可以查看我对第123个问题所期待的详细页面了。 ,当我现在导航到/question/detail/123
时,我会看到/todo/list
所期望的页面,日志显示如下:
/question/list
正如您所看到的 - 出于某种原因,尽管URL与TodoController的映射匹配,但现在仍在选择Question控制器。
有什么想法吗?
更新
两个控制器的定义如下:
QuestionController.java
2011-08-08 15:23:38,098 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'app' determining Last-Modified value for [/app/todo/list]
2011-08-08 15:23:38,098 [http-8080-3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapping [/list] to handler 'com.tmm.enterprise.controller.QuestionController@1ef4b'
2011-08-08 15:23:38,133 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/app/todo/list] is: -1
2011-08-08 15:23:38,133 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'app' processing GET request for [/app/todo/list]
2011-08-08 15:23:38,133 [http-8080-3] DEBUG org.springframework.web.bind.annotation.support.HandlerMethodInvoker - Invoking request handler method: public org.springframework.web.servlet.ModelAndView com.tmm.enterprise.controller.QuestionController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception
ToDoController.java
@Controller
public class QuestionController extends MultiActionController implements InitializingBean
{
@RequestMapping("/list")
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception{
//Display List view for questions
}
@RequestMapping("/detail/{questionId}")
public ModelAndView detail(@PathVariable("questionId") long questionId, HttpServletRequest request, HttpServletResponse response) throws Exception{
//Display Detailed Question View for questionId...
}
}
如您所见,我只在QuestionController上添加了注释,而不是ToDo控制器。我还没有在注释中再次明确定义到问题控制器的URL映射(我知道我可以将public class TodoController extends MultiActionController implements InitializingBean
{
@Transactional
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception{
//Display list of Todos
}
}
放在类级别 - 但是因为这已经在配置中定义了我还没有在这里添加它另外,如果我在这里定义它,那么我会收到@RequestMapping("/question")
错误,但是如果我导航到ResourceNotFound
则会正确加载