index.html 404 - 在tomcat服务器中找不到

时间:2018-01-03 08:07:47

标签: java tomcat

我有一个Tomcat服务器,我正在尝试访问位于WEB-INF文件夹中的index.html文件,如下图所示

Project directory structure

如图所示,当我打开http://localhost:9999/index.html时,它会抛出404

这是我的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="CERTHMaTHiSiSOpenAPI" version="3.1">
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>OpenAPI</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>
      api.ws;api.ws.oper
      </param-value>
    </init-param>
    <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>api.ws.oper.Authorization</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>OpenAPI</servlet-name>
    <url-pattern>/api/*</url-pattern>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
</web-app>

它位于WEB-INF / lib下是一个问题吗?我尝试将其移至WEB-INF但没有成功。

修改:这是我的Properties > Web Project Settings TabWeb Project Properties

应该注意的是,此项目还有一个API,在Java Resources > src > ws下,它有一个包含此内容的Conductor.java文件:

package ws;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;

import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.listing.ApiListingResource;
import io.swagger.jaxrs.listing.SwaggerSerializers;
import io.swagger.models.Swagger;
import io.swagger.util.Json;
import ws.util.Config;


@ApplicationPath("/")
public class Conductor extends Application {

@Context ServletContext context;

    public static Properties properties = new Properties();

    public Conductor() {
        super();

        BeanConfig beanConfig = new BeanConfig();
        BeanConfig beanConfig2 = new BeanConfig();

        beanConfig.setVersion("3.1.1");
        beanConfig.setSchemes(new String[]{"https","http"});
//        beanConfig.setHost("localhost:8080");
        beanConfig.setBasePath("/api");
        beanConfig.setResourcePackage("ws.lg");
        beanConfig.setTitle("LG lib Open API");
        beanConfig.setScan(true);

        Swagger swaglg = new Swagger();
        swaglg = beanConfig.getSwagger();
        swaglg.setBasePath("/api/lg");

        beanConfig2.setVersion("3.1.1");
        beanConfig2.setSchemes(new String[]{"https","http"});
//        beanConfig.setHost("localhost:8080");
        beanConfig2.setBasePath("/api");
        beanConfig2.setResourcePackage("ws.sla");
        beanConfig2.setTitle("SLA lib Open API");
        beanConfig2.setScan(true);

        Swagger swaglg2 = new Swagger();
        swaglg2 = beanConfig2.getSwagger();
        swaglg2.setBasePath("/api/sla");

        createSwaggerJsonFile(beanConfig, "swagger-lg.json");
        createSwaggerJsonFile(beanConfig2, "swagger-sla.json");
    }

//  public static final int REST_PORT = 8080;
    @Override
    public Set<Class<?>> getClasses(){
        readProperties();

        Set<Class<?>> resources = new HashSet<>();
        addRestResourceClasses(resources);
        return resources;
    }

    private void addRestResourceClasses(Set<Class<?>> resources){
        resources.add(ws.sla.SLAlibOpenAPI.class);
        resources.add(ws.lg.LGlibOpenAPI.class);
        resources.add(ws.auth.Authorization.class);

        resources.add(ApiListingResource.class);
        resources.add(SwaggerSerializers.class);


        //to turn off
//      resources.add(ws.helpers.MongoModifiersAPI.class);
    }


    private Properties readProperties() {
        String fullPath = context.getRealPath(Config.PROPERTIES_FILE);
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(new File(fullPath));
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        if (inputStream != null) {
            try {
                properties.load(inputStream);
            } catch (IOException e) {
                // TODO Add your custom fail-over code here
                e.printStackTrace();
            }
        }else{
            System.err.println("Cannot read config file or no config file exists.");
        }
        return properties;
    }

//  /*
    private static void createSwaggerJsonFile(BeanConfig beanConfig, String filename) {
        try (FileWriter fileWriter = new FileWriter(filename)) {
            File f = new File(filename);
            fileWriter.write(Json.pretty(beanConfig.getSwagger()));
            fileWriter.flush();
            System.out.println("File " + filename + " successfully created in " + f.getAbsolutePath());
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
//    */

}

4 个答案:

答案 0 :(得分:1)

我有一个类似的问题。我对存储在WebContent中的 html 主页和Java代码生成的 servlet 感到困惑。

Tomcat如上下文参数中所示在WebContent中搜索.html文件。 servlet映射的url参数告诉Tomcat在哪里寻找 servlet 本身。对我来说,两个位置必须不同是合乎逻辑的。

我的servlet映射看起来像<url-pattern>/api/*</url-pattern>。我的应用程序类包含@Path('/sname')。在使WEB-INF/web.xml尽可能简单的同时,这使我可以访问localhost:8080/ html 页面和localhost:8080/api/sname的servlet。

答案 1 :(得分:0)

您应该将html内容放在WebContent文件夹中,而不是放在web-inf内。当它搜索WebContent中的 index.html 时,它不在那里,因此显示404未找到错误。

看看有类似情况和可能答案的这个问题 StackOverFlow Question

答案 2 :(得分:0)

默认情况下,当您尝试使用war

进行访问时,系统会调用 ROOT http://localhost:9999/index.html index.html(或welcome-file-list)

如果要更改tomcat默认加载页面,请编辑server.xml文件并更新以下内容

<Context path="" docBase="new_default_app" />

答案 3 :(得分:0)

解决方案是将所有swagger-ui文件移至WebContent下的新文件夹(我称之为ui),将web.xml移至WEB-INF并在web.xml

中添加一个简单的servlet映射
<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/ui/*</url-pattern>
</servlet-mapping>

问题在于,OpenAPI servlet中的/api/* url-pattern是由API使用的。