我编写了一个REST API作为Spring Boot应用程序,在我开始工作之后尝试添加一个Web前端,从一个基本的“Hello World”类型索引页开始。尝试一直打到主页会导致以下消息:
在DispatcherServlet中找不到名为“dispatcherServlet”的带有URI [/WEB-INF/index.jsp]的HTTP请求的映射
这是控制器(我已验证通过断点命中):
@Controller
public class HomeController {
@RequestMapping(value = "/")
public String index() {
return "index";
}
}
以下是视图解析器的主要应用程序,它似乎基于该消息合并:
@Configuration
@EnableWebMvc
@EnableJpaRepositories("com.name.api.repositories")
@ComponentScan(basePackages = {
"com.name.api.controllers",
})
@EntityScan("com.name.api.entities")
@SpringBootApplication
public class RestApiApplication {
public static void main(String[] args) {
SpringApplication.run(RestApiApplication.class, args);
}
@Bean
public ViewResolver internalResourceViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/");
bean.setSuffix(".jsp");
return bean;
}
}
这是我的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/views/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/*</url-pattern>
</servlet-mapping>
</web-app>
如您所见,消息中的名称始终为“dispatcherServlet”,即使我重命名上面的servlet,它也是不变的。
我还有一个dispatcher-servlet.xml,我怀疑它是否被使用。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
在WebContent / WEB-INF /(我将动态网页构面添加到项目时创建的文件夹)下面有一个index.html文件和一个index.jsp文件。它始终无法找到它们,即使我将WEB-INF复制到与WebContent相同级别的自己的文件夹而不是它下面(或者如果WEB-INF复制到src / main / webapp /下)。我已经介入调试器并发现消息在找不到处理程序映射时会被打印出来,但是我怀疑当servlet的名称与servlet的名称不对应时,这个内容太过深入了解。配置(甚至故意将错误的xml添加到文件中没有任何区别,尽管这可能只是编译器在识别错误时没有用坏代码替换好代码)。将相同的<load-on-startup>
标记添加到“jsp”servlet也没有任何作用。
这似乎是一个相当基本的错误,我确信这里的其他人已经问过它并得到了答案,但我在这里遇到了很多类似的问题,但没有一个解决方案似乎有效。
答案 0 :(得分:0)
我的首选是使用spring bean XML配置文件而不是基于Java的配置,所以我的解释是使用我的首选。之后你可以进行必要的“翻译”。
我相信你错过了一些配置:
第一次加载调度程序servlet时,它会查找一个spring bean配置文件名:dispatcher-servlet.xml
,如果dispatcher-servlet.xml
不在{{1}下面正如它所期望的那样,你应该配置它。比方说,它是在/WEB-INF/
下找到的,然后在/WEB-INF/spring/dispatcher-servlet.xml
中你应该这样:
web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
文件中,您需要提供配置如何支持您的web-mvc应用程序。在该文件中,您将在Web应用程序上下文中提供“实时”bean配置,这将控制spring-mvc项目中的requset处理。话虽如此,只需添加dispatcher-servlet.xml
中的下一行:
dispatcher-servlet.xml
,以便在您的项目中支持spring web-mvc annotations,例如:<mvc:annotation-driven />
&amp; @Controller
,此外它还会为您提供其他弹簧网络mvc功能支持,例如数据绑定,自定义验证等等。@RequestMapping
这将告诉IOC容器您的控制器在您的项目中的确切位置。将视图解析器放在<context:component-scan base-package="org.your.controller.package" />
中,该视图解析器bean应存在于Web应用程序上下文中。对于eaxmple:
dispatcher-servlet.xml
在您的情况下,您将视图解析器bean放在Web应用程序上下文中并不是预期的,您可以在一个上下文中混合使用所有“活”bean。当然,你错过了已经提到的配置