xml - 带有 Tiles 的 HTTP 404 Spring MVC 没有 XML

标签 xml spring maven spring-mvc tiles

我正在尝试将带有 Tiles 的 Spring MVC Web 应用程序部署到 Tomcat 8 服务器。除了 pom.xml,我没有使用任何 xml。我一运行应用程序就不断收到 404 错误。有什么想法吗?

初始化器:

package soda.store.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SodaStoreInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { SodaStoreContextConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

上下文配置:

package soda.store.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;    
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;

@EnableWebMvc
@Configuration
@ComponentScan("soda.store.*")

public class SodaStoreContextConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
        viewResolver.setViewClass(TilesView.class);
        return viewResolver;
    }

    @Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitionsFactoryClass(TilesDefinitionsConfig.class);
        tilesConfigurer.setCheckRefresh(true);
        TilesDefinitionsConfig.addDefinitions();
        return tilesConfigurer;
    }
}

TilesDefinitions:

package soda.store.config;

import java.util.HashMap;
import java.util.Map;

import org.apache.tiles.Attribute;
import org.apache.tiles.Definition;
import org.apache.tiles.definition.DefinitionsFactory;
import org.apache.tiles.request.Request;

public final class TilesDefinitionsConfig implements DefinitionsFactory {

    private static final Map<String, Definition> tilesDefinitions = new HashMap<String,Definition>();
    private static final Attribute BASE_TEMPLATE = new Attribute("/WEB-INF/views/layouts/defaultLayout.jsp");

    @Override
    public Definition getDefinition(String name, Request tilesContext) {
        return tilesDefinitions.get(name);
    }

    /**
    * @param name <code>Name of the view</code>
    * @param title <code>Page title</code>
    * @param body <code>Body JSP file path</code>
    *
    * <code>Adds default layout definitions</code>
    */
    private static void addDefaultLayoutDef(String name, String title, String body) {
        Map<String, Attribute> attributes = new HashMap<String,Attribute>();

        attributes.put("title", new Attribute(title));
        attributes.put("header", new Attribute("/WEB-INF/views/layouts/header.jsp"));
        attributes.put("body", new Attribute(body));
        attributes.put("footer", new Attribute("/WEB-INF/views/layouts/footer.jsp"));

        tilesDefinitions.put(name, new Definition(name, BASE_TEMPLATE, attributes));
    }

    /**
    * <code>Add Apache tiles definitions</code>
    */
    public static void addDefinitions() {
        addDefaultLayoutDef("login1", "Login", "/WEB-INF/views/login.jsp");
    }
}

Spring Controller :

package soda.store.controller;

import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class SodaStoreController {

    @RequestMapping(value = {"/"}, method = RequestMethod.GET)
    public String homePage(Model model) {
        return "login1";
    }
}

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.o7planning</groupId>
    <artifactId>SodaStore</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>SodaStore Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <java-version>1.8</java-version>
        <apachetiles.version>3.0.7</apachetiles.version>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <servletapi.version>3.1.0</servletapi.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- Spring dependencies -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.springframework/spring-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-jsp -->
        <!-- Apache Tiles -->
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-core</artifactId>
            <version>${apachetiles.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-api</artifactId>
            <version>${apachetiles.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-servlet</artifactId>
            <version>${apachetiles.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-jsp</artifactId>
            <version>${apachetiles.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servletapi.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>SodaStore</finalName>
    </build>
</project>

WEB-INF structure

日志:

Nov 25, 2016 12:39:47 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:SodaStore' did not find a matching property.
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/8.0.8.5.5
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Aug 31 2016 19:51:16 UTC
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         8.5.5.0
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Windows 10
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            10.0
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             C:\Program Files\Java\jdk1.8.0_102\jre
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_102-b14
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         C:\Users\fmarq_000\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         C:\Users\fmarq_000\Downloads\apache-tomcat-8.5.5-windows-x64\apache-tomcat-8.5.5
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=C:\Users\fmarq_000\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Users\fmarq_000\Downloads\apache-tomcat-8.5.5-windows-x64\apache-tomcat-8.5.5
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=C:\Users\fmarq_000\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=C:\Users\fmarq_000\Downloads\apache-tomcat-8.5.5-windows-x64\apache-tomcat-8.5.5\endorsed
Nov 25, 2016 12:39:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=Cp1252
Nov 25, 2016 12:39:47 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.8.0_102\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_111/bin/server;C:/Program Files/Java/jre1.8.0_111/bin;C:/Program Files/Java/jre1.8.0_111/lib/amd64;C:\app\demoMan\product\12.1.0\dbhome_2\bin;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Lenovo\FusionEngine;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Lenovo\Bluetooth Software\;C:\Program Files\Lenovo\Bluetooth Software\syswow64;C:\Program Files (x86)\Lenovo\Motion Control\;C:\Program Files (x86)\Common Files\lenovo\easyplussdk\bin;C:\Program Files (x86)\Skype\Phone\;C:\Users\fmarq_000\Downloads\apache-maven-3.3.9-bin\apache-maven-3.3.9\bin;C:\Users\fmarq_000\AppData\Local\Microsoft\WindowsApps;C:\Users\fmarq_000\Downloads\eclipse-jee-mars-2-win32-x86_64\eclipse;;.
Nov 25, 2016 12:39:47 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Nov 25, 2016 12:39:48 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Nov 25, 2016 12:39:48 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Nov 25, 2016 12:39:48 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Nov 25, 2016 12:39:48 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2352 ms
Nov 25, 2016 12:39:48 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Nov 25, 2016 12:39:48 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.8.5.5
Nov 25, 2016 12:39:54 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Nov 25, 2016 12:39:54 PM org.apache.catalina.core.ApplicationContext log
INFO: Spring WebApplicationInitializers detected on classpath: [soda.store.config.SodaStoreInitializer@4b886479]
Nov 25, 2016 12:39:55 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'dispatcher'
Nov 25, 2016 12:40:00 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [http-nio-8080]
Nov 25, 2016 12:40:00 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [ajp-nio-8009]
Nov 25, 2016 12:40:00 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 11796 ms

最佳答案

问题解决了。我将 WEB-INF 文件夹从 src 移到了 WebContent。

关于xml - 带有 Tiles 的 HTTP 404 Spring MVC 没有 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40796878/

相关文章:

java - Maven 编译不创建类文件

java - 仅当节点具有属性时才使用 java 在 xml 中添加节点

javascript - XML:通过值而不是属性来选择节点

sql - 使用 LIKE 或类似的完整搜索操作搜索 XML

java - 在 Linux 系统上安装 Spring Boot 应用程序

java - 如何使用 Spring Boot 修改 Wildfly/JBoss 配置

maven - 如何使用 maven-tomcat-plugin 在远程 Tomcat 7 上重新部署 war

java - Jersey API 中不支持的媒体类型错误

java - 有哪些库可以在 Google App Engine/Java Servlet 上处理 XML

java - Spring 单元测试: Autowire the Implementation of an Interface directly?