環境
- MackBook(M1) macOS Monterey
前提
Java言語でTodoアプリを作成しています。
以下を作り終えたので実行してみると404が返ってきます。
html
1<!--home.html--> 2 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>Home</title> 8</head> 9<body> 10 <h1>Todo 管理Webアプリケーション</h1> 11 <!-- formで『todo一覧を表示』と書かれたボタンを表示。 12 ボタンを押すと、actionで指定したlist-servletに処理が行く。リクエスト方法はget指定 --> 13 <form action ="list-servlet" method="get"> 14 <input type="submit" value="Todo一覧を表示"> 15 </form> 16 17</body> 18</html>
Jsp
1 2<!--list.jsp--> 3 4<%@ page language="java" contentType="text/html; charset=UTF-8" 5 pageEncoding="UTF-8" import="java.util.List, java.util.ArrayList, 6 model.dao.dto.TodoDTO"%> 7 8<!DOCTYPE html> 9<html> 10<head> 11<meta charset="UTF-8"> 12<title>Todo List</title> 13</head> 14<body> 15 <!-- サーブレットでリクエストスコープにtodoListを設定したので、これをjspで取り出すことができる --> 16 <!-- getAttributeの引数はsetAttributeしたときの第一引数と一致している必要があ --> 17 <% 18 List<TodoDTO> todoList = (List)request.getAttribute("todoList"); 19 %> 20 21 <%for(TodoDTO todo:todoList){ %> 22 <%=todo.getTodo()%>期限:<%=todo.getTimeLimit() %><br> 23 <% } %> 24 25</body> 26</html>
java
1//TodoDTO.java 2 3package model.dao.dto; 4 5import java.sql.Date; 6 7//データを管理するためのクラス 8 9public class TodoDTO { 10 //private=メンバ変数に直接値を格納するのを禁止して、必ずメソッド経由でしか格納・参照できないようにしている 11 12 //todoのIDを保持する 13 private int id; 14 //todoの内容を保持する 15 private String todo; 16 //todoの期限を保持する 17 private Date timeLimit; 18 19 /** 20 * 引数なしのコンストラクタ 21 * newで初期化 22 */ 23 public TodoDTO() { 24 id = 0; 25 todo = ""; 26 timeLimit = new Date(System.currentTimeMillis()); 27 } 28 29 //受け取った引数によって初期化を行う 30 //基本は省略できるが、メソッド内にフィールドと同じ名前のローカル変数があるときはthisが必要 31 public TodoDTO(int id, String todo, Date timeLimit) { 32 this.id = id; 33 this.todo = todo; 34 this.timeLimit = timeLimit; 35 } 36 37 //idを取得 38 public int getld() { 39 return id; 40 } 41 42 //idを設定する 43 public void setld(int id) { 44 this.id = id; 45 } 46 47 //Todoの内容を取得する 48 public String getTodo() { 49 return todo; 50 } 51 52 //Todoの内容を設定する 53 public void setTodo(String todo) { 54 this.todo = todo; 55 } 56 57 //Todoの期限を取得する 58 public Date getTimeLimit() { 59 return timeLimit; 60 } 61 62 //todoの期限を設定する 63 public void setTimeLimit(Date timeLimit) { 64 this.timeLimit = timeLimit; 65 } 66} 67 68
java
1//TodoListDAO.java 2 3package model.dao; 4 5import java.sql.Connection; 6import java.sql.Date; 7import java.sql.PreparedStatement; 8import java.sql.ResultSet; 9import java.sql.SQLException; 10import java.util.ArrayList; 11import java.util.List; 12 13import model.DBConnection; 14import model.dao.dto.TodoDTO; 15 16//todoの一覧を取得するクラス 17 18public class TodoListDAO { 19 //todoの一覧を取得する 20 public List<TodoDTO> getTodoList() throws ClassNotFoundException, 21SQLException{ 22 //返却用Listの初期化 23 List<TodoDTO>todoList = new ArrayList<>(); 24 //実行するSQL 25 String sql = "SERECT id, todo, timeList from todo"; 26 //DBに接続し、todo一覧を取得する 27 //PostgreSQLへの接続を取得するためにgetConnectionを呼び出す 28 try(Connection con = DBConnection.getConnection(); 29 //String型のSQLをPostgreSQLで実行できるように、prepareStatementメソッドに引数としてsqlを渡す 30 PreparedStatement pstmt = con.prepareStatement(sql)) 31 { 32 33 //SQLを実行しResultSetの変数に結果を格納する 34 /* 35 * 「ResultSet」はselect文の実行結果を格納するインタフェースなので、 36 * ResultSet型の変数を用意して結果を受け取るようにしている 37 * 変数resのなかに取得できたデータが格納される 38 * */ 39 ResultSet res = pstmt.executeQuery(); 40 //実行結果を順に取り出す 41 /* 42 * TodoDTOのコンストラクタに渡して、それをtodoListに追加する。 43 * PostgreSQLから取得したTodoを全てtodoListに追加し終わるとwhileループを抜けるという流れ 44 * */ 45 while(res.next()) { 46 //それぞれid,todo,timeListを取得する 47 //小文字・大文字のタイポ注意 48 int id = res.getInt("id"); 49 String todo = res.getString("todo"); 50 Date timeLimit = res.getDate("timeLimit"); 51 52 //取得したid,todo,timeListでTodoDTOの初期化をしてListに追加する 53 todoList.add(new TodoDTO(id,todo,timeLimit)); 54 } 55 } 56 57 return todoList; 58 } 59} 60
java
1//DBConnection.java 2package model; 3 4import java.sql.Connection; 5import java.sql.DriverManager; 6import java.sql.SQLException; 7 8//DBへの接続をするクラス 9 10public class DBConnection { 11 /*throw宣言で例外を呼び出し手元に渡すことを宣言している 12 (Clsss .fromNameをした時にClassNotFoundException、DriverManager.getConectionをしたときにSQLExceptionが発生する可能性があるから)*/ 13 public static Connection getConnection() throws SQLException, 14ClassNotFoundException{ 15 //DBのURL 16 final String URL = "jdbc:postgresql://localhost:5432/tododb"; 17 //DBにアクセスするユーザー 18 final String USER = "sampleUSer"; 19 //パスワード 20 final String PASSWORD = "samplePass"; 21 22 Class.forName("org.postgresql.Driver"); 23 //DBへ接続 24 //引数として、URL、USER、PASSWORDを渡す 25 Connection con = DriverManager.getConnection(URL,USER,PASSWORD); 26 27 return con; 28 //サーブレットを使ってPostgreSQLに接続するための準備ができた状態 29 } 30 31} 32
java
1//ListServlet.java 2 3package servlet; 4 5import java.io.IOException; 6import java.sql.SQLException; 7import java.util.ArrayList; 8import java.util.List; 9 10import javax.servlet.RequestDispatcher; 11import javax.servlet.ServletException; 12import javax.servlet.annotation.WebServlet; 13import javax.servlet.http.HttpServlet; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16 17import model.dao.TodoListDAO; 18import model.dao.dto.TodoDTO; 19 20/** 21 * Servlet implementation class ListServlet 22 * home.htmlでlist-servletにリクエストが投げられるように設定している 23 */ 24@WebServlet("/list-servlet") 25public class ListServlet extends HttpServlet { 26 private static final long serialVersionUID = 1L; 27 28 /** 29 * @see HttpServlet#HttpServlet() 30 */ 31 public ListServlet() { 32 super(); 33 // TODO Auto-generated constructor stub 34 } 35 36 /** 37 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 38 * formでメソッドをgetにしたためformが提出されるとdoGetメソッドが実行される。 39 */ 40 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 //todoの一覧を保持する変数を宣言 42 List <TodoDTO> todoList = new ArrayList<>(); 43 //DAOを生成し、Todo一覧を取得する 44 TodoListDAO dao = new TodoListDAO(); 45 try { 46 //todo一覧を取得する 47 todoList = dao.getTodoList(); 48 }catch(SQLException | ClassNotFoundException e) { 49 e.printStackTrace(); 50 } 51 //todo一覧をリクエストスコープに設定する 52 request.setAttribute("todoList", todoList); 53 //todo一覧画面に遷移する 54 RequestDispatcher rd = request.getRequestDispatcher("list.jsp"); 55 rd.forward(request, response); 56 57 } 58 59 /** 60 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 61 * doPostメソッドが実行される。 62 */ 63 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 64 // TODO Auto-generated method stub 65 doGet(request, response); 66 } 67 68} 69 70
実現したいこと
- 404が返ってくるのを解消したい
発生している問題・エラーメッセージ
情報: Serverのバージョン名: Apache Tomcat/9.0.56 [日 3月 20 17:58:26 JST 2022] 情報: Server ビルド: Dec 2 2021 14:30:07 UTC [日 3月 20 17:58:26 JST 2022] 情報: サーバーのバージョン番号: 9.0.56.0 [日 3月 20 17:58:26 JST 2022] 情報: OS 名: Mac OS X [日 3月 20 17:58:26 JST 2022] 情報: OS バージョン: 11.2 [日 3月 20 17:58:26 JST 2022] 情報: アーキテクチャ: x86_64 [日 3月 20 17:58:26 JST 2022] 情報: Java Home: /Applications/Eclipse_2021-12.app/Contents/java/17/Home [日 3月 20 17:58:26 JST 2022] 情報: JVM バージョン: 17.0.1+12 [日 3月 20 17:58:26 JST 2022] 情報: JVM ベンダ: Eclipse Adoptium [日 3月 20 17:58:26 JST 2022] 情報: CATALINA_BASE: /Users/***/JavaTodoSample1/.metadata/.plugins/org.eclipse.wst.server.core/tmp0 [日 3月 20 17:58:26 JST 2022] 情報: CATALINA_HOME: /Applications/Eclipse_2021-12.app/Contents/tomcat/9 [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: -Dcatalina.base=/Users/***/JavaTodoSample1/.metadata/.plugins/org.eclipse.wst.server.core/tmp0 [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: -Dcatalina.home=/Applications/Eclipse_2021-12.app/Contents/tomcat/9 [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: -Dwtp.deploy=/Users/***/JavaTodoSample1/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: --add-opens=java.base/java.lang=ALL-UNNAMED [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: --add-opens=java.base/java.io=ALL-UNNAMED [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: --add-opens=java.base/java.util=ALL-UNNAMED [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: -Dfile.encoding=UTF-8 [日 3月 20 17:58:26 JST 2022] 情報: コマンドライン引数: -XX:+ShowCodeDetailsInExceptionMessages [日 3月 20 17:58:26 JST 2022] 情報: 商用環境に最適な性能を発揮する APR ベースの Tomcat ネイティブライブラリが java.library.path [/Users/***/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] に存在しません。 [日 3月 20 17:58:26 JST 2022] 情報: プロトコルハンドラ ["http-nio-8080"] を初期化します。 [日 3月 20 17:58:26 JST 2022] 情報: サーバーの初期化 [1029]ms [日 3月 20 17:58:26 JST 2022] 情報: サービス [Catalina] を起動します [日 3月 20 17:58:26 JST 2022] 情報: サーブレットエンジンの起動:[Apache Tomcat/9.0.56] [日 3月 20 17:58:26 JST 2022] 情報: プロトコルハンドラー ["http-nio-8080"] を開始しました。 [日 3月 20 17:58:27 JST 2022] 情報: サーバーの起動 [645]ms [日 3月 20 17:58:27 JST 2022]
試したこと
-
ビルド・パスでクラスパスに外部JARを追加
-
ここが問題なのだろうとは思うのですが、解決に至っていません。
情報: 商用環境に最適な性能を発揮する APR ベースの Tomcat ネイティブライブラリが java.library.path [/Users/***/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] に存在しません。 [日 3月 20 17:58:26 JST 2022]
その他
そもそもパスの部分の理解が乏しく、 java.library.path をどうすればいいのか理解できていません。
どなたかご助言いただけますと嬉しいです。
よろしくお願いいたします。
あなたの回答
tips
プレビュー