【问题标题】:How to properly use multiple controllers in Spring MVC如何在 Spring MVC 中正确使用多个控制器
【发布时间】:2013-05-25 10:48:20
【问题描述】:

我正在尝试在 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/ 这样的 URL

我在 GlassFish 日志中得到一个条目:

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

而不是预期的请求

".../build/web/WEB-INF/views/home/index.jsp"

“/data”的模式相同。从本质上看,请求映射被插入到请求中的错误位置。

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

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

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

公共类 homeController {

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2019-06-04
      • 2011-08-26
      • 2014-05-26
      • 2020-04-13
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多