如何在Spring Boot应用程序中运行多个控制器?

时间:2016-07-07 08:17:09

标签: spring-boot

到目前为止,我的应用程序中有两个控制器。它们都使用@Controller进行注释,但只有一个具有main函数。当我运行应用程序时,只有具有main函数的类显示在浏览器中。当我转到没有主要功能的类的URL时,我只得到404"未找到"错误。

具有主要功能的类是:

@Controller
@RequestMapping("function")
public class Functions {
    @RequestMapping("test")
    public String test(){
       return "this is a test";
    }

    public static void main(String[] args) throws Exception {
         SpringApplication.run(Functions.class, args);
    }
}

当我写localhost:8080 / function / test时,这个类工作正常

然而,另一类:

@Controller
@RequestMapping("index")
public class IndexController {
    @RequestMapping("/")
    public String getHomePage(){
        return "index";
    }
} 
遗憾的是,

无效。当我进入浏览器并编写localhost:8080 / index时,我得到了404:not found-error。

似乎只有具有主功能的控制器才被识别。有谁知道该怎么做才能解决这个问题?

5 个答案:

答案 0 :(得分:3)

您需要先订购代码:

  1. 您拥有主方法并运行所有组件的Application类。
  2. 尽可能多的控制器,但Spring处理这些控制器的方式是下一个

    @Controller
    @RequestMapping("/mainFirstController")
    public class FirstController {
    
        @RequestMapping("/specifcFirstController")
        public String getView(){}
    }
    ...
    
    @Controller
    @RequestMapping("/mainLogicSecondController")
    public class FirstController {
    
        @RequestMapping("/specifcSecondController")
        public String getView(){}
    
    }
    
  3. 现在你可以打电话了

    http://localhost:8080/mainLogicSecondController/specifcSecondController

    http://localhost:8080/mainLogicFirstController/specifcFirstController

    如果对您的业务逻辑有意义,即使您可以为每个控制器使用相同的请求映射,例如:

    /clients/showlist
    /users/showlist
    

    我在上一个回复中读到的关于 @ResponseBody 的内容,注释只是在你想要返回 JSON 对象的情况下。

    我希望这能更清楚地说明你对Spring MVC的看法

答案 1 :(得分:2)

我认为你应该把SpringApplication的main方法放在另一个类中。然后你可以拥有任意数量的控制器,每个控制器都在一个新类中。

编辑:尝试将@ResponseBody放在这里:

@RequestMapping("/")
@ResponseBody
public String getHomePage(){
    return "index";
}

当你使用localhost:8080 / index /时,如果你的控制器工作,你应该在你的页面中看到文本“index”。

答案 2 :(得分:2)

Application类(具有您的main方法)应位于源层次结构中最外层的文件夹中,因为这是组件扫描开始的位置。如果你有任何控制器是控制器以外的任何级别,弹簧将无法在组件扫描期间选择该控制器。

你的src文件夹应该有这样的目录结构

import java.io.*; class CompileData { public static void main(String args[]) { FileReader fr = null; FileWriter fw = null; try { fr = new FileReader("one.txt");

答案 3 :(得分:0)

如果您编写spring web MVC,则应将视图解算器配置如下:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd ">
<mvc:resources mapping="/resources/**" location="/resources/" />

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>
</beans>

在WEB-INF / views / jsp文件夹中,您应该创建一个jsp文件“index.jsp”。

您可以在网站上学习spring mvc:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

答案 4 :(得分:0)

在您指定之前,

@RequestMapping是绝对的。

@RestController
@RequestMapping("/past")
public class Past {
  @RequestMapping( "/version" )
  public ResponseEntity<> version() { return "past"; }
}

@RestController
@RequestMapping("/future")
public class Future {
  @RequestMapping( "/version" )
  public ResponseEntity<> version() { return "future"; }
}

..所以两个类共同产生两个不同的版本,并返回不同的输出:

/过去/版本

过去

/未来/版本

未来