Spring MVC问题将URL映射到控制器

时间:2011-08-08 14:30:46

标签: java spring web-applications spring-mvc

我正在使用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则会正确加载

0 个答案:

没有答案