Java Spring MVC在呈现页面时忽略servlet配置
我编写了一个RESTAPI作为Spring引导应用程序,在我完成这项工作后,我尝试添加一个web前端,从一个基本的“Hello World”类型索引页开始。尝试持续点击主页会导致以下消息: 在名为“DispatcherServlet”的DispatcherServlet中找不到URI为[/WEB-INF/index.jsp]的HTTP请求的映射 这是控制器(我已经验证过它是通过断点命中的): 下面是带有视图解析器的主要应用程序,它似乎是基于该消息合并的:Java Spring MVC在呈现页面时忽略servlet配置,java,spring,jsp,spring-mvc,servlets,Java,Spring,Jsp,Spring Mvc,Servlets,我编写了一个RESTAPI作为Spring引导应用程序,在我完成这项工作后,我尝试添加一个web前端,从一个基本的“Hello World”类型索引页开始。尝试持续点击主页会导致以下消息: 在名为“DispatcherServlet”的DispatcherServlet中找不到URI为[/WEB-INF/index.jsp]的HTTP请求的映射 这是控制器(我已经验证过它是通过断点命中的): 下面是带有视图解析器的主要应用程序,它似乎是基于该消息合并的: @Configuration @Enab
@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>
调度员
org.springframework.web.servlet.DispatcherServlet
1.
jsp
org.apache.jasper.servlet.JspServlet
调度员
/
jsp
/WEB-INF/views/*
jsp
/WEB-INF/*
如您所见,消息中的名称始终是“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的名称与配置中的名称不一致时,这太深入了(甚至故意将格式错误的xml添加到文件中也没有什么区别,尽管这可能只是编译器在识别错误后没有用坏代码替换好代码)
这似乎是一个相当基本的错误,我相信这里的其他人已经问过并得到了回答,但我在这里遇到了很多类似的问题,没有一个解决方案是有效的。我首选的方法是使用Springbean XML配置文件,而不是基于Java的配置,因此我的解释是使用我的首选红色的选择。你可以选择必要的“翻译” 我认为您缺少一些配置:
dispatcher servlet.xml
,如果您的dispatcher servlet.xml
未按预期位于/WEB-INF/
下,那么您应该对其进行配置。例如,它位于/WEB-INF/s下spring/dispatcherservlet.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>
在您的例子中,您将视图解析器bean不按预期放在web应用程序上下文中,您有点混合了您所有的“生活”一个上下文中的bean。当然,您没有看到前面提到的配置dispatcher-servlet.xml在WEB-INF下,但正如我所说的,我怀疑它是否真的被读取了。@Controller类型注释已经被我的REST API使用,以及我作为第一段代码包含的HomeController。我的RestApiAppl初始化已经告诉程序在哪些包中查找控制器、存储库等,并且这些东西起作用。无法读取的是xml内容。我尝试扩展AbstractAnnotationConfigDispatcherServletInitializer以复制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>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>