如何在Spring MVC中正确使用多个控制器

时间:2013-05-30 01:08:35

标签: java spring model-view-controller controller routing

我试图在Spring MVC中使用2个控制器和一个调度程序servlet。但是在尝试渲染视图时遇到404错误。调度程序非常简单,来自web.xml:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

并使用以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    ...
<context:component-scan base-package="com.mycompany.azalea" />

<mvc:annotation-driven />

</beans>

控制器是:

package com.mycompany.azalea;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/home")
public class homeController {

    @RequestMapping(value = "/")
    public String home() {
         return "index";
    }
}

package com.mycompany.azalea;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/data")
public class dataController {

    @RequestMapping(value = "/")
    public String home() {
         return "index";
    }
}

我正在使用一个非常标准的解析器:

@Configuration
public class AppConfig {

// Resolve logical view names to .jsp resources in the /WEB-INF/views directory
@Bean
ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

视图在WEB-INF / views / home /和WEB-INF / views / data /

下设置

但是,如果我尝试请求http://localhost:8080/Azalea/home/

这样的网址

我在GlassFish日志中输入了一个条目:

严重:PWC6117:文件“... / build / web / 主页 /WEB-INF/views/index.jsp”未找到

而不是预期的

请求

“... /建设/网络/ WEB-INF /视图/ 主屏幕 /index.jsp”

“/ data”的相同模式。它基本上看起来像请求映射插入到请求中的错误位置。

我目前的工作是将解析器修改为

resolver.setPrefix("../WEB-INF/views/"); 

并从控制器返回以下内容:

public class homeController {

    @RequestMapping(value = "/")
    public String home() {
         return "home/index";
    }
}

但这似乎是次优解决方案。如果您有任何建议,请告诉我。

1 个答案:

答案 0 :(得分:0)

你几乎做对了。前缀必须是绝对的,以使其按您希望的方式工作。即:视图解析器的prefix必须设置为绝对值:

resolver.setPrefix("WEB-INF/views/");

并且,当您从@RequestMapping方法返回视图名称时,它们必须是相对于view-resolver prefix路径的路径。因此,在homeController中,您应该返回home/index,在dataController中,您应该返回data/index