Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 春季4&x2B;嵌入式Tomcat7_Spring_Spring Mvc_Tomcat_Embedded Tomcat 7 - Fatal编程技术网

Spring 春季4&x2B;嵌入式Tomcat7

Spring 春季4&x2B;嵌入式Tomcat7,spring,spring-mvc,tomcat,embedded-tomcat-7,Spring,Spring Mvc,Tomcat,Embedded Tomcat 7,我尝试使用SpringWebMVC4.3.2和嵌入式Tomcat7.0.64构建一个web应用程序 我没有编写正确的主方法来启动嵌入式Tomcat。它适用于Spring控制器发送@ResponseBody内容(JSON),但在JSP视图中失败 public static void main(String[] args) throws Exception { String appBase = ".";// What to put here ? Tomcat tomcat = n

我尝试使用SpringWebMVC4.3.2和嵌入式Tomcat7.0.64构建一个web应用程序

我没有编写正确的主方法来启动嵌入式Tomcat。它适用于Spring控制器发送
@ResponseBody
内容(JSON),但在JSP视图中失败

public static void main(String[] args) throws Exception {

    String appBase = ".";// What to put here ?

    Tomcat tomcat = new Tomcat();
    String contextPath = "";
    String port = System.getProperty("server.port");
    tomcat.setPort(port == null ? 8080 : Integer.valueOf(port));

    tomcat.getHost().setAppBase(appBase);
    Context context = tomcat.addWebapp(contextPath, appBase);

    // So that it works when in it's launched from IntelliJ or Eclipse
    // Also need that a folder named "META-INF" exists in build/classes/main
    // https://bz.apache.org/bugzilla/show_bug.cgi?id=52853#c19
    ((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);

    tomcat.start();
    tomcat.getServer().await();
}
对于JSP视图,它表示:请求的资源不可用(WEB-INF/views/home.JSP)HTTP 404

如果我将
appBase
变量设置为JSP所在的绝对路径,它就会工作。但是,当然,这不是一个解决方案,因为它不会在另一台机器上工作。我需要一个相对路径

如果我将
appBase
varibale设置为
“src/main/webapp”
,则Tomcat无法启动,出现以下错误:
java.lang.IllegalArgumentException:Document base C:\Blablabla\spring jsp embedded Tomcat\Tomcat.8080\src\main\webapp\src\main\webapp不存在或不是可读目录

此外,使用Gradle fat jar技术构建的jar不包含WEB-INF目录

如何使一个简单的SpringMVC应用程序与嵌入式Tomcat和JSP一起工作(将使用
java-cp path/to/my/jar com.app.Launcher
启动)

build.gradle:

apply plugin: 'java'

sourceCompatibility = 1.7
version = '1.0'

jar {
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

repositories {
    maven { url "http://repo1.maven.org/maven2" }
}

dependencies {

    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.6.2'

    compile 'org.springframework:spring-webmvc:4.3.2.RELEASE'

    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0'

    compile 'javax.servlet:javax.servlet-api:3.0.1'
    compile 'javax.servlet.jsp:jsp-api:2.2'
    compile 'javax.servlet:jstl:1.2'

    // Embedded Tomcat
    // 2 mandatory libs
    compile 'org.apache.tomcat.embed:tomcat-embed-core:7.0.64'
    compile 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.64'
    // To enable JSPs
    compile 'org.apache.tomcat.embed:tomcat-embed-jasper:7.0.64'

    testCompile group: 'junit', name: 'junit', version: '4.+'

}
public class Launcher {

    public static void main(String[] args) throws Exception {
        String contextPath = "";
        // String appBase = "C:/absolute/path/to/webapp/dir"; // It works but of course I need a relative path
        // String appBase = "."; // Works only for Controller sending back ResponseBody (JSON) but fail to find jsp files
        String appBase = "src/main/webapp"; // Tomcat does not start properly

        Tomcat tomcat = new Tomcat();

        String port = System.getProperty("server.port");
        tomcat.setPort(port == null ? 8080 : Integer.valueOf(port));

        tomcat.getHost().setAppBase(appBase);
        Context context = tomcat.addWebapp(contextPath, appBase);

        // So that it works when in it's launched from IntelliJ or Eclipse
        // Also need that a folder named "META-INF" exists in build/classes/main
        // https://bz.apache.org/bugzilla/show_bug.cgi?id=52853#c19
        ((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);

        tomcat.start();
        tomcat.getServer().await();
    }

}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

}
@Configuration
@EnableWebMvc
@ComponentScan("com.app")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

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

}
Tomcat启动器:

apply plugin: 'java'

sourceCompatibility = 1.7
version = '1.0'

jar {
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

repositories {
    maven { url "http://repo1.maven.org/maven2" }
}

dependencies {

    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.6.2'

    compile 'org.springframework:spring-webmvc:4.3.2.RELEASE'

    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0'

    compile 'javax.servlet:javax.servlet-api:3.0.1'
    compile 'javax.servlet.jsp:jsp-api:2.2'
    compile 'javax.servlet:jstl:1.2'

    // Embedded Tomcat
    // 2 mandatory libs
    compile 'org.apache.tomcat.embed:tomcat-embed-core:7.0.64'
    compile 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.64'
    // To enable JSPs
    compile 'org.apache.tomcat.embed:tomcat-embed-jasper:7.0.64'

    testCompile group: 'junit', name: 'junit', version: '4.+'

}
public class Launcher {

    public static void main(String[] args) throws Exception {
        String contextPath = "";
        // String appBase = "C:/absolute/path/to/webapp/dir"; // It works but of course I need a relative path
        // String appBase = "."; // Works only for Controller sending back ResponseBody (JSON) but fail to find jsp files
        String appBase = "src/main/webapp"; // Tomcat does not start properly

        Tomcat tomcat = new Tomcat();

        String port = System.getProperty("server.port");
        tomcat.setPort(port == null ? 8080 : Integer.valueOf(port));

        tomcat.getHost().setAppBase(appBase);
        Context context = tomcat.addWebapp(contextPath, appBase);

        // So that it works when in it's launched from IntelliJ or Eclipse
        // Also need that a folder named "META-INF" exists in build/classes/main
        // https://bz.apache.org/bugzilla/show_bug.cgi?id=52853#c19
        ((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);

        tomcat.start();
        tomcat.getServer().await();
    }

}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

}
@Configuration
@EnableWebMvc
@ComponentScan("com.app")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

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

}
Spring web app初始值设定项:

apply plugin: 'java'

sourceCompatibility = 1.7
version = '1.0'

jar {
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

repositories {
    maven { url "http://repo1.maven.org/maven2" }
}

dependencies {

    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.6.2'

    compile 'org.springframework:spring-webmvc:4.3.2.RELEASE'

    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0'

    compile 'javax.servlet:javax.servlet-api:3.0.1'
    compile 'javax.servlet.jsp:jsp-api:2.2'
    compile 'javax.servlet:jstl:1.2'

    // Embedded Tomcat
    // 2 mandatory libs
    compile 'org.apache.tomcat.embed:tomcat-embed-core:7.0.64'
    compile 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.64'
    // To enable JSPs
    compile 'org.apache.tomcat.embed:tomcat-embed-jasper:7.0.64'

    testCompile group: 'junit', name: 'junit', version: '4.+'

}
public class Launcher {

    public static void main(String[] args) throws Exception {
        String contextPath = "";
        // String appBase = "C:/absolute/path/to/webapp/dir"; // It works but of course I need a relative path
        // String appBase = "."; // Works only for Controller sending back ResponseBody (JSON) but fail to find jsp files
        String appBase = "src/main/webapp"; // Tomcat does not start properly

        Tomcat tomcat = new Tomcat();

        String port = System.getProperty("server.port");
        tomcat.setPort(port == null ? 8080 : Integer.valueOf(port));

        tomcat.getHost().setAppBase(appBase);
        Context context = tomcat.addWebapp(contextPath, appBase);

        // So that it works when in it's launched from IntelliJ or Eclipse
        // Also need that a folder named "META-INF" exists in build/classes/main
        // https://bz.apache.org/bugzilla/show_bug.cgi?id=52853#c19
        ((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);

        tomcat.start();
        tomcat.getServer().await();
    }

}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

}
@Configuration
@EnableWebMvc
@ComponentScan("com.app")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

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

}
文件夹结构:

apply plugin: 'java'

sourceCompatibility = 1.7
version = '1.0'

jar {
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

repositories {
    maven { url "http://repo1.maven.org/maven2" }
}

dependencies {

    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.6.2'

    compile 'org.springframework:spring-webmvc:4.3.2.RELEASE'

    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0'

    compile 'javax.servlet:javax.servlet-api:3.0.1'
    compile 'javax.servlet.jsp:jsp-api:2.2'
    compile 'javax.servlet:jstl:1.2'

    // Embedded Tomcat
    // 2 mandatory libs
    compile 'org.apache.tomcat.embed:tomcat-embed-core:7.0.64'
    compile 'org.apache.tomcat.embed:tomcat-embed-logging-juli:7.0.64'
    // To enable JSPs
    compile 'org.apache.tomcat.embed:tomcat-embed-jasper:7.0.64'

    testCompile group: 'junit', name: 'junit', version: '4.+'

}
public class Launcher {

    public static void main(String[] args) throws Exception {
        String contextPath = "";
        // String appBase = "C:/absolute/path/to/webapp/dir"; // It works but of course I need a relative path
        // String appBase = "."; // Works only for Controller sending back ResponseBody (JSON) but fail to find jsp files
        String appBase = "src/main/webapp"; // Tomcat does not start properly

        Tomcat tomcat = new Tomcat();

        String port = System.getProperty("server.port");
        tomcat.setPort(port == null ? 8080 : Integer.valueOf(port));

        tomcat.getHost().setAppBase(appBase);
        Context context = tomcat.addWebapp(contextPath, appBase);

        // So that it works when in it's launched from IntelliJ or Eclipse
        // Also need that a folder named "META-INF" exists in build/classes/main
        // https://bz.apache.org/bugzilla/show_bug.cgi?id=52853#c19
        ((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);

        tomcat.start();
        tomcat.getServer().await();
    }

}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

}
@Configuration
@EnableWebMvc
@ComponentScan("com.app")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

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

}

显然,嵌入式Tomcat希望静态资源位于
META-INF/resources
目录中。我遵循这一点:我检查了最终的jar是如何构造的

所以我修改了Gradle构建脚本,将JSP放在那里

sourceSets {
    main {
        resources.srcDirs = ["src/main/webapp"]
        output.resourcesDir = "$buildDir/classes/main/META-INF/resources"
    }
}

现在它开始工作了。然而,我觉得这是一份临时的工作。如果有人有一个更令人满意、更具教育意义的答案,我会很高兴得到它。

你为什么选择这些方法来分别使用spring boot而不是spring boot?@UserF40:我知道大多数人都喜欢spring boot。就我个人而言,我不喜欢以我的名义做出决定,我喜欢了解事情是如何发生的。我不喜欢弹簧靴的“魔力”。我当然错了。但我不想在这里就这一点进行辩论。请在这里添加您可能有的任何事实观点,尝试使用与contextPath相同的appBase。如果contextPath是root,则设置
appBase=“root”
@Md Zahid Raza。当tomcat启动时,它会显示:“java.lang.IllegalArgumentException:Document base C:\blabla\spring jsp embedded tomcat\tomcat.8080\ROOT\ROOT不存在或不是可读目录”。