初めてEclipseで動的Webページを作る時に出会ったエラー

<h2>本記事の目的</h2>
初めてEclipseでアプリケーションを作った時、どんなエラーに出会うかメモしていく。
環境：macOS 11、Java11、Tomcat9、Eclipse2021-03 (4.19.0)。

<h2>こうやって進めています</h2>
Java基本文法を学習済の状態で開始。
他のサイトも参考にしながら、大筋はこちらを参照した。
https://www.kkaneko.jp/pro/tomcat/eclipsetomcat.html
↓
エラーで進めなくなったため、書籍「スッキリわかるJava&サーブレット入門」に従って進めることにした。記事内で書籍と述べているのはこの本を指す。

<h2>Eclipseのインストール</h2>

全部入ってるパッケージであるPleiades All in Oneをインストールした。
Pleiades = Eclipseに主要なプラグインやweb開発に必要なTomcatを追加したもの(日本語化済)
All in One = フレームワークのSTS(Spring)も入っている。
すでにeclipse単体で元々インストールしていたら、後からPleiadesプラグインだけインストールすることもできる。


<h2>Eclipseの使い方（Tomcatアプリの作り方、HelloWorldまで）</h2>
下記参照した。
https://searchman.info/java_eclipse/1100.html

Eclipse内部Tomcatサーバ設定→パースペクティブをJava EEに変更→動的Webプロジェクト作成

<h2>出会ったエラー(と解決策)(解決していないもの多々）</h2>
<h4>1.参照サイトをもとにファイルを作成したがブラウザ表示できない</h4>
参照サイト丸々コピーではなく、自分の作りたいアプリケーションのファイル命名に合わせたらブラウザ表示できなかった。
【原因】web.xmlの記述内容やブラウザへのURL指定が間違っていた。
【解決策】以下の通り記述するよう注意する。
>web.xml
>```<servlet-class> パッケージ名.クラス名 </servlet-class>```

>ブラウザへの指定URL
>```http://localhost:8080/プロジェクト名/web.xmlで指定したurl-pattern```

<h4>2.eclipseを再起動したところ、内容を変更していないのにweb.xmlのweb-appタグ内でエラー表示が出た</h4>
【原因】不明
【解決策】
改行したらエラーは消えた。書籍p125には、JSPファイルでこのようなエラーが起きることがあると書いてある。（文方エラーがないのに赤い波線がつく）
エラーとなっている箇所をコピペ＆上書き保存するようにとのこと。


<h4>3.Tomcatを起動した後、「http://localhost:8080/」でブラウザからアクセスしてもTomcatの接続確認ページが表示されない。404が出る【未解決】</h4>
プロジェクトはちゃんと実行されているが、ネコチャンのページが見られない状況。
解決方法はこちらのよう。↓余裕が出たらみる
https://ja.stackoverflow.com/questions/23905/tomcat%E3%81%AE%E7%8C%AB%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84-404

<h4>4.Tomcatは起動しているが、サーブレットのjavaファイルを実行しても404が出る</h4>
・アノテーションでルーティングしていたが、web.xmlにも追記してみた。→むしろサーバー起動すらしなくなった。
【原因】不明
【解決策】
web.xmlの追記部分をコメントアウトし、元の状態で再度実行をかけたら通った。

<h4>5.サーブレットの記述内容を変更したが、実行結果に反映されない</h4>
参照サイト
https://dewa.hatenadiary.org/entry/20070903/1188801736
【試したこと】
・サーバー名を右クリック、クリーン
・サーバー名を右クリック、Tomcatワーク・ディレクトリをクリーン
・プロジェクト名を右クリック、リフレッシュ
・プロジェクトを閉じて、また開く
・サーバーの再起動
・Eclipseの再起動
・serversファイル内のserver.xml、<Context>内の、reloadable="false"を"true"に変える
・FinderからEclipseのContentsフォルダの中を検索、対象のclassファイルを削除した
→ここまで試したが、更新前の結果しか表示されなかった。
classファイルを削除したのちに再実行をかけたが、表示されたのは更新前の内容。
削除したclassファイルのあった「Eclipse¥Contents¥workspace¥プロジェクト名¥build¥classes¥パッケージ名」を見に行くも、何もなかった。
実行して表示されたということは、classファイルがあるはずなのになんでなの。
Contents内を検索するが、どこにも該当classファイルは無い。おばけ？
・Eclipse再起動
→ここで404エラーとなり表示すらされなくなった。
ブラウザのアドレスバーに表示されているURLはなぜか```http://localhost:8835/```に変わっている。URLを8080に変更しても404。
・ターミナルで```lsof -i :8080```を入力するとポート8080を使用している項目はEclipse3件、Java1件が表示された。とりあえず全部```kill -9 PIDの番号```で終了させる。
→Eclipseを立ち上げ、再実行すると更新後の結果が表示された！解決！
(ただしアドレスバーのポート番号は8835のまま)
知識不足で今回のエラーの原因がわからないが、eclipse¥Contents配下のファイル以外にもclassなどの実行ファイルをキャッシュしているところがある？？？それはターミナルからアクセスできる？？
その後も同じエラーを出してみて解決策をいろいろ試した結果、プロジェクトメニューからの全てのプロジェクトをクリーン（ビルドを即時に開始）で再コンパイル成功。
【原因】
参考書籍によると、更新前のインスタンスを利用しているために発生するとのことでした。
【解決策】
サーブレットファイルの内容を変更したときは、
①サーバーの再起動（本来はこれだけで動くはず）
②だめな時はサーバーの停止→プロジェクトのクリーン→Tomcatワークディレクトリのクリーン
```再コンパイルはプロジェクトのクリーン＆ビルドでできる```

参照サイト
https://www.javadrive.jp/eclipse3/step/index6.html

<h4>6.アドレスバーに表示されるlocalhostのポート番号が8835に変わってしまったので8080に戻したい</h4>
【原因】
原因不明、8080を使用して実行しているタスクが詰まっているうちに次の実行をかけたからとか？
リビルドや再起動しても8080には戻らなかった。また、server.xmlの中も見に行ったが、port=8080の記述しか見当たらなかった。
【解決策】
サーバータブのtomcatサーバー名を右クリック→プロパティ→モニター、で動いているポートを「停止」。javaファイルを実行すると8080に戻った。
サーバーポートとモニターポートの役割や挙動について調べた方が良さそう。
（動いていたポートはサーバーポート8080、モニターポート8835だった）
今回は関係なかったが、使用するポートを変更したい時はserver.xml内を修正する。
https://teratail.com/questions/272753

<h4>7.form actionで設定したアドレス先に飛ばない。404。</h4>
form action="/example/ContentPage"と指定し、ContentPage.javaに遷移したいが、404となる。(プロジェクト名：example)
【原因】
ContentPage.java内のアノテーションを@WebServlet("/ContentPage")としており、指定アドレスと齟齬があった。
【解決策】
form action="/ContentPage"に変更し、解決。

<h4>8.Tomcatサーバーが起動しなくなった</h4>
Tomcatをリビルドした直後は起動するが、とあるhtmlファイルを実行するとエラーが起きて起動しない。クリーンしても変わらず。他のファイルを実行しても変わらず。
期待する挙動は次の通り：test.html→フォームでTestServlet.javaへ遷移、フォワードでresult.jspへ遷移し結果表示。
【原因】
ひとつのプロジェクト内でアノテーション先が重複しているサーブレットファイルがあった。
TestServlet.java(@WebServlet("/"))を別のファイルSampleServlet.javaから複製して作っていたために、アノテーションの指定が2つのファイルで重複していた。
TestServlet.java(@WebServlet("/SampleServlet"))
SampleServlet.java(@WebServlet("/SampleServlet"))
【解決策】
TestServlet.java内を@WebServlet("/TestServlet"))と修正して解決。
【コンソールに表示されたエラー内容（一部）】
↓illegal reflectivについてご指摘いただき、解決に至った。
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.catalina.loader.WebappClassLoaderBase (file:/Applications/Eclipse_2021-03.app/Contents/tomcat/9/lib/catalina.jar) to field java.io.ObjectStreamClass$Caches.localDescs
WARNING: Please consider reporting this to the maintainers of org.apache.catalina.loader.WebappClassLoaderBase
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

<h4>9.「.metadata」ファイルの場所がわからなかった</h4>
【原因】
隠しファイル（不可視ファイル）についてよく知らなかった。
【解決策】
「command + Shift + .(ドット)」で見えるようになった。

<h4>10.ショートカットが効かない</h4>
よく使用する「実行」「クリーン」などでショートカットキーが使いたいが、OSのショートカットと衝突しているのか？うまく動かない。
下記の設定方法を参照して自分の好みに設定しなおした。
https://yagisuke.hatenadiary.com/entry/2014/11/23/023001


<h4>11.mySQLとの連携がうまくいかない</h4>
DBViewerの使い方
JDBCドライバの配置、バージョン依存のエラー
接続の方法、closeなど

<h4>12.Git管理の方法がわからない</h4>
GitとGitHubってどう違うの？ Bitbucketとは？
Sourcetreeって何？GUI操作って具体的にどういうこと？
Sorcetreeの触り方が全然わからない…公式チュートリアルわからない…

<h4>α1.DAOファイルがDBに接続できないときのチェック項目</h4>
・カラムの型名とrs.get型名の、型に齟齬がないか
・取得データが1行だけであっても、While(rs.next())でしかデータを取り出せないので注意
・SQLでは大文字と小文字を区別しない


<h2>メモ</h2>

<h4>動的ページのしくみ</h4>
・javaファイル（データ受け渡しなど裏方専門）
・jspファイル（ブラウザ表示など表専門）
この二つでセットになっており、

URLに指定したパスがどのjavaクラスを呼び出すかを
・web.xml
のなかで指定する。(=マッピング定義)


呼び出されたjavaファイル内のクラスがjspファイルを呼び出し、ブラウザ表示に至る。


<h4>サーブレットとクラスを区別する考え方</h4>
どちらもjavaファイルで記述されるが、
サーブレットはURLとjavaクラスとのマッピングが必要になる。

<h4>Tomcatはどこにある？</h4>
Eclipseの外にある公開Tomcatサーバと、Eclipseの内部にあるTomcatサーバのふたつ。
同時に起動するとポート番号の奪い合いになることがあるので注意する。

<h4>Eclipseのバージョンアップによるディレクトリ構成（フォルダ名）の変更</h4>
srcファイルその他のファイル名や位置が変わっていて、参考にしているサイトの記述との相違がある。
動的Webプロジェクトを作成すると、srcという名前のファイルが作られるはずが、
src/main/javaになっている。srcへの変更はできない。

参考サイトで認めるが自分のEclipse上で無くなっているファイル名
・Javaリソース
・src
・WebContent

参考サイトで見たことのないフォルダ名
・JREシステムライブラリー
・Apache Tomcat vx.x[Tomcatx(Javax)]


Eclipse IDE 2021-03 （2021年3月17日）以降のバージョンで「動的および静的Webプロジェクトを作成するときに、推奨されるコンテンツパスとJavaソースフォルダーパスが変更されました」とのこと。
https://www.eclipse.org/webtools/releases/3.21/NewAndNoteworthy/#Modernized%20default%20paths
自分で置き換えて考えなくてはならず、つまづいているところがある。
まだ未解決。
下記参照した。
https://teratail.com/questions/337875