如何在Tomcat上的Web应用程序中提供静态文件

时间:2014-04-09 14:29:50

标签: java tomcat servlets

我在eclipse中有这个基于servlet的web应用程序项目,想要附加一些html标签,如<script src="Chart.js">

文件夹结构为:

  • C:/apache-tomcat-7.0.53/
  • 我的工作区位于D:/../../ workplace / CpdApplication / src / cpd / MyServlet.java
  • cpd包含:MyServlet.java,Chart.js和其他文件。
  • CpdApplication /的WebContent / META-INF / web.xml中

我有一些路径问题,我无法解决它们,我一遍又一遍地搜索,仍然没有工作,我明白了 http://localhost:8080/CpdApplication/Chart.js的404(未找到)。

问题是当我想追加<script src='Chart.js'></script>时,Tomcat无法解析Chart.js静态文件。

5 个答案:

答案 0 :(得分:15)

  

我有一些路径问题,我无法解决它们,我搜遍了   再一次,仍然没有工作,我得到一个404(未找到)   ... / CpdApplication / chart.js之

确实,在编写<script src="/Chart.js"/>时,您正在告诉浏览器创建自己的,单独的HTTP请求以获取JavaScript文件。为此:

  • servlet容器需要能够提供静态文件
  • 为此,您需要在web.xml中有一个 servlet-mapping 提供静态文件(即默认小服务程序)。

这应该做:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/js/*</url-pattern>
</servlet-mapping>

然后将Chart.js放在以下文件夹中:WebContent/js/它应该有效。

编辑:当然,您需要更新HTML中的<script>标记。此外,请确保重新部署Web应用程序以更新servlet容器上的web.xml(我假设是Tomcat)。

答案 1 :(得分:2)

这对我有用。谢谢沖原ハーベスト

<强>的welcome.jsp

<?php 
    $price_excl_tax = $product->get_price_excluding_tax();
    echo $price_excl_tax > 0 || ! empty( $price_excl_tax ) ? woocommerce_price( $price_excl_tax ) . __(' netto') : '';
?>

文件层次结构树

enter image description here

<强> Web.xml中

  <head>
    <script src="resources/js/jsx/browser.min.js"></script>
    <script src="resources/js/react/react.min.js"></script>
    <script src="resources/js/react/react-dom.min.js"></script>
    <script src="resources/js/main.js"></script>
    <link rel="stylesheet" type="text/css" href="resources/css/style.css">
  </head>

答案 2 :(得分:1)

在我看来,Chart.js与servlet源存储在同一个文件夹中。

通常你应该有这样的结构(我简化了它):

/css/your-css.css
/js/your-script.js
/src/your-package/YourServlet.java

每当您运行应用程序时,编译器都会创建一组文件,这些文件将被复制到您的Web容器中。复制的文件不包含 src 文件夹,而是包含已构建(已编译)类的副本。所有其他文件(我们现在不应该关注的一些例外情况)必须在 src 文件夹之外才能被复制。

尝试将JS移动到src目录之外的js目录中。然后,将其链接为:

<script src='/Your-Context-Path/js/Chart.js'>

必须有一个函数来自动获取上下文路径,我认为它是

ServletContext.getContextPath()

您可以阅读here

那应该成功。

答案 3 :(得分:1)

@Andy回复说,您需要在应用程序的文件夹中设置所有资源(JS,CSS,图像等),然后使用<context_path>/folder/to/your/resource/<resource_name>.<ext>访问它们。以下是如何操作的示例:

  • 在名称为 res 的Web应用程序的根文件夹(通常名为 web WebContent )内创建一个文件夹。
  • res 内,创建一个名为 js 的文件夹,将所有JavaScript文件放在那里。您可以创建 css 文件夹来处理所有CSS样式表, img 来处理图像,然后再打开。
  • 在您看来,这就是您的JSP,您应该通过上下文路径访问您的资源。

这是您的应用程序文件夹的外观:

- WebContent
  - res
    - js
      Chart.js

在你的JSP中:

<script src="${request.contextPath}/res/js/Chart.js"></script>

由于您正在从Servlet创建视图内容(顺便拍摄一下脚),请使用request#getContextPath()附加它:

"script src=\"" + request#getContextPath() + "/res/js/Chart.js\"></script>";

答案 4 :(得分:0)

@ VH-NZZ正确地说,但是如果您使用的是Spring 4x或更高版本,则需要在ResourceHandlerRegistry中添加静态资源。您可以在“ AppConfig”(您的应用程序配置文件)中执行此操作,如下所示:

@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan(basePackages = "com.packagename")
public class AppConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/build/**").addResourceLocations("/build/");
    registry.addResourceHandler("/dist/**").addResourceLocations("/dist/");
    registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    registry.addResourceHandler("/assets/**").addResourceLocations("/assets/");
    registry.addResourceHandler("/images/**").addResourceLocations("/images/");
}

再次正确地说,您不应将Java文件和静态内容放在同一位置。这些应该始终在单独的位置可用。您可以将静态内容直接放在webapp文件夹下。