

実行環境  
eclipse  
java 1.8  
payaraserver version5  
の環境で構築されています。

[code]

    動的webプロジェクト名
    ｜
    ｜
    ｜
    src
    ｜ーmain
       |
        |- java
       |  |
    | ーresouces
       |
    ｜ーwebapp
          　　　｜
    　　　｜ーmetainf
    　　　｜ーwebinf
    　　　｜
    　　　sample.mp3
    　　　test.xhtml
    
[/code]

といったデプロイの仕方になっています  
コードは次です  
test.xhtml->

[code]

            <:html
            xmlns="http://www.w3.org/1999/xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:p="http://primefaces.org/ui"
            xmlns:jsf="http://java.sun.com/jsf/composite/javax.faces">
            <h:head>
            <title>testページへようこそ</title>
            </h:head>
            <h:body>
            <:audio src="src/sample.mp3" controls="controls">
            </:audio>
            </h:body>
            </:html>
    
[/code]

アクセスした結果は  
Failed to load resource: the server responded with a status of 404 (Not
Found)になり、  
インターフェイスは表示されているのですが、再生ボタンが押せないです

mp3ファイルがデプロイできてないのでしょうか  
それか認識ができていないのでしょうか  
eclipseの仕様上mp3ファイルを認識できないのしょうか  
sftpとかで通したりしないとデプロイはできないのでしょうか

ご回答よろしくお願いします


CC BY-SA 4.0
2022-04-01T08:09:46.460
88130
2022-04-03T00:17:15.633
2022-04-03T00:17:15.633
2808
52034
question
eclipse java-ee servlet jsf xhtml
audioタグでmp3ファイルが再生できない


端的な回答としては、xhtml ファイル中で指定している `src` の指定を `src/sample.mp3` から `sample.mp3`
に変更することで期待する動作になるのでは、ということになります。

* * *

Payara には [`DefaultServlet`](https://javadoc.io/doc/fish.payara.extras/payara-
embedded-all/5.193.1/org/apache/catalina/servlets/DefaultServlet.html)
が組み込まれ[デフォルト設定](https://github.com/payara/Payara/blob/d4bbe3f/appserver/admin/gf_template/src/main/resources/config/default-
web.xml#L454-L458)ではこれを利用するような設定が為されているようなので、特に追加の設定を行わずとも静的リソースを応答できるようです。

`src/main/webapp/sample.mp3` にファイルを置いているのであれば、 `http://localhost:8080/<your-
app-name>/smaple.mp3` でアクセスできると思います。  
次のコマンド

[code]

    curl --head http://localhost:8080/<your-app-name>/smaple.mp3
    
[/code]

をコマンドプロンプト上(等)で実行し、 `200 OK` が返ってくるのを確認してみてください。

実行結果例:

[code]

    HTTP/1.1 200 OK
    Server: Payara Server  5.2022.1 #badassfish
    X-Powered-By: Servlet/4.0 JSP/2.3 (Payara Server  5.2022.1 #badassfish Java/Eclipse Adoptium/17)
    Accept-Ranges: bytes
    ETag: W/"1314238-1648841686349"
    Last-Modified: Fri, 01 Apr 2022 19:34:46 GMT
    Content-Length: 1314238
    Content-Type: audio/x-mpeg
    X-Frame-Options: SAMEORIGIN
    
[/code]

その上で、 `src/main/webapp/test.xhtml` を次のように記述します:

[code]

    <html
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
    >
      <h:head>
        <title>Facelets Hello World</title>
      </h:head>
      <h:body>
        <audio controls="controls">
          <source src="sample.mp3" type="audio/mp3" />
        </audio>
      </h:body>
    </html>
    
[/code]

* * *

([コメント](https://ja.stackoverflow.com/questions/88130/88140?noredirect=1#comment99966_88140)を受けて追記)

ウェブブラウザで `http://localhost:8080/<your-app-name>/foo/bar/baz.xhtml`
を開いたとき、サーバ側では、 `/foo/bar/baz.xhtml` というリクエストパスに対してどう対応するのかを実装する必要があります。  
Payara を含む、Jakarta EE(旧名 Java EE)仕様では、この実装は Servlet という種類のクラスで行うことになっています。

もう少し具体的に言うと、仕様上、本来であれば、

  * リクエストが来た時に、`.war` ファイルに含めたリソース `sample.mp3` をレスポンスとして送信する Servlet の実装
  * `/src/sample.mp3` というパスのリクエストが来た時に、↑の Servlet で処理するようにマッピングするルール設定

が必要になります。  
その上で、設定したルールから外れるリクエストが来た場合の対応は、フレームワーク(今回はPayara)が提供する " _default_ " という名前の
Servlet が処理することになっています。  
(従って _default_ Servlet がどういう挙動になるのかは [Payara
のマニュアル](https://docs.payara.fish/)
に書かれているべきですが、実際には無さそうでした(ので今回はググって実装を探しました)。)

  * 参考: [12.1. Use of URL Paths](https://jakarta.ee/specifications/servlet/5.0/jakarta-servlet-spec-5.0.html#use-of-url-paths) \- Jakarta Servlet Specification, 5.0, September 07, 2020

Payaraでは _default_ Servlet が静的コンテンツを返す機能を有しているので、前述した明示的な実装/設定は必須ではありません。  
ただし、 _default_ Servlet を利用するのであれば、 _default_ Servlet が期待する通りに
リソースファイルを配置する/パスと対応付ける 必要があります。

(逆に言えば、 _default_ Servlet を利用せず、前述のような Servlet の実装/設定を行えば質問文中の `test.xhtml`
のままでも期待通り動作させることは可能です。敢えてそのような実装を行う動機は無いと思いますが。)

> どうして「<source src="sample.mp3" type="audio/mp3" />」これで通るとわかったのですか？

_default_ Servlet
の自然な実装を考えたとき、そうなっているであろう、というのは、マニュアルに書かれていなくとも/実装を確認せずとも想像できる範囲かと思います。  
(少なくとも、質問文にあるような `/src/` 以下にマッピングされる理由は思い浮かびません)

ちなみに、 `.war` ファイルの中にリソースがどう格納されているかは、 [`jar`
コマンド](https://docs.oracle.com/javase/jp/11/tools/jar.html#GUID-51C11B76-D9F6-4BC2-A805-3C847E857867)
で見られます:

[code]

    jar tf <your-file>.war
    
[/code]

実行結果を見ると、最上階層に `sample.mp3` が格納されているのが分かると思います。  
であれば、リクエストパスもコンテキストルート直下 `http://localhost:8080/<your-app-name>/smaple.mp3`
であろう、というのが自然な発想かと考えます。

> 「curl --head localhost:8080/<your-app-name>/smaple.mp3 をコマンドプロンプト上(等)で実行し、
> 200 OK が返ってくるのを確認してみてください。」これが何をしているのかもわからないです

ブラウザで `http://localhost:8080/<your-app-name>/smaple.mp3` を開いて確認するのと同じです。  
今回は HTTPステータスコードが `200 OK` であることを明確に確認できるように `curl` コマンドを用いて説明しました。


CC BY-SA 4.0
2022-04-01T19:49:06.170
88140
2022-04-02T14:26:30.980
2022-04-02T14:26:30.980
2808
2808
88130
answer