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

SRo*_*mes 10 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>
Run Code Online (Sandbox Code Playgroud)

我需要为URLS开头/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>
Run Code Online (Sandbox Code Playgroud)

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

HTTP ERROR 404

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

Powered by Jetty://
Run Code Online (Sandbox Code Playgroud)

我不知道如果我的web.xml文件是错误的,或者如果我只是把文件在错误的地方(我已经下试过src/main/webappsrc/main/webapp/lib/META-INF/resources/)


码头

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

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

zeb*_*h49 5

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

URL路径映射规则:

它按以下顺序使用.使用第一次成功匹配,无需进一步尝试.

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

所以它将匹配规则/static/,并停在那里.