Java Servlet - 将servlet映射到每个URL而不是字符串

时间:2014-12-11 20:44:59

标签: java servlets

我有一个配置为处理所有URL(*)的servlet:

<servlet>
    <servlet-name>MyServ</servlet-name>
    <servlet-class>MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServ</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

对于以/static/开头的网址,我需要它,它应该从静态WEB-INF提供服务。也就是说,MyServ应该提供所有 /static

我该怎么做?


更新:澄清一下,我想要的是:

/*/ - 转到MyServ
/static/dir/file.css - Jetty从/ dir /.

提供静态file.css

我不确定要做什么的web.xml,或者放置静态文件的位置。

我尝试添加这个:

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

但是,当我转到/static/网址时,我得到:

HTTP ERROR 404

Problem accessing /static/dir/file.css. Reason: 
    Not Found

Powered by Jetty://

我不确定我的web.xml是否错误,或者我是否只是将文件放在错误的位置(我已在src/main/webapp和{{1}下尝试过}})


码头

我正在使用 Jetty 。我想避免任何其他层,如Nginx,Apache等。

为了赢得赏金,请确保您回答Jetty的作品。

6 个答案:

答案 0 :(得分:5)

您最好的选择可能是在*规则之前出现静态规则。

  

URL路径映射规则:

     

按以下顺序使用。使用第一次成功的比赛,没有进一步的尝试。

     
      
  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功匹配选择servlet。
  2.   
  3. 容器将递归尝试匹配最长的路径前缀。这是通过使用'/'字符作为路径分隔符一次单击目录的路径树来完成的。最长的匹配决定了所选的servlet。
  4.   
  5. 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理扩展请求的servlet。扩展名被定义为最后一个'。'字符后的最后一个段的一部分。
  6.   
  7. 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。
  8.   

因此它会匹配/static/的规则,然后停在那里。

答案 1 :(得分:4)

您可以使用Nginx解决问题。 Nginx提供静态内容HTML文件,图像(.jpg,.png,.gif),样式表(.css)和JavaScript(.js)。 Web服务器无需处理这些文件。 Nginx将完成这项工作。

server {
  listen          80;
  server_name     YOUR_DOMAIN;
  root            /PATH/TO/YOUR/WEB/APPLICATION;
  location / {
    index index.jsp;
  }
  location ~ \.jsp$ {
    proxy_pass              http://localhost:8080;
  }
  location ^~/servlets/* {
    proxy_pass              http://localhost:8080;
  }
}

答案 2 :(得分:3)

要提供静态内容,您甚至不需要拥有servlet。您可以将静态内容放在可通过服务器直接访问的文件夹中。

例如,如果您的应用程序名称为TestApp,则可以将内容放在TestApp/static/dir目录中。基于您的目录结构将是:

TestApp
   |
   |_____ WEB-INF
   |
   |_____ static
             |
             |____ dir

通过上述目录结构完成所有静态内容,例如: Sample.css可通过以下网址访问:

/TestApp/static/dir/Sample.css

请查看此问题以获取更多信息How to serve static content from tomcat

请注意,通过这样做,您的静态目录将对所有人开放,没有任何限制,这意味着任何人都可以在没有任何身份验证的情况下访问您的静态内容。但是,除非你有任何理由,否则我认为它的静态内容很好。

答案 3 :(得分:1)

首先,位于“WEB-INF”目录中的文件无法直接通过Web访问。

另外,我注意到你的条目“src / main / webapp / lib / META-INF / resources /”不包括提取的WAR目录,也就是web应用程序文件夹。

实施例: src / main / webapp / [WAR文件夹] / lib / META-INF / resources /

我以为你在使用Tomcat。因此,在创建WAR文件后,将其放入“webapp”目录,然后启动Tomcat。 WAR文件应提取到与WAR文件同名的Web应用程序文件夹中。现在,您可以从浏览器访问“WEB-INF”之外的任何文件。

示例: localhost:8080/[web app folder name]/[some file]

希望这有帮助,

答案 4 :(得分:1)

只需将您的静态内容放入 webapp 目录即可。 那部分可以直接访问。使用 localhost:port / yourAppName / ResourceName

答案 5 :(得分:1)

根据我的经验(正如Srinivasu Talluri已经建议的那样),反向代理是您解决问题的答案。

您可以使用Nginx See detail configuration或将Apache配置为反向代理。

通过Nginx提供静态内容的详细配置可以找到here

当Web服务器本身处理静态内容时,您的servlet配置可以按原样使用。因此,您的servlet将仅提供动态资源。

希望它有所帮助。