サーブレットクラスを初期化時にClassNotFoundExceptionが発生する
お世話になります。
jspからサーブレットを呼び出すときに500エラーが発生します。
ClassNotFoundExceptionが出ており、
web.xmlの設定、またはjspでのform内のURL指定が誤っているのかと
思いましたが、jspからサーブレットを問題なく呼び出せているソースと
比較したところ、web.xmlの記述などには差異は見られませんでした。
ご助言いただければ幸いです。
以下、ソースコード及びエラーメッセージです。
index.jsp
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>Pakutter</title>
</head>
<body>
<h1>Welcome to Pakutter!!!</h1>
<form action = "/pakutter/servlet/Login" method = "Post">
ユーザー名:<input type = "text" name = "name"><br>
パスワード :<input type = "text" name = "pass"><br>
<input type = "submit" value = "ログイン">
</form>
</body>
</html>
Login.java
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.LoginLogic;
import model.User;
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// リクエストパラメータの取得
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String pass = request.getParameter("pass");
// Userインスタンス(ユーザー情報)の生成
User user = new User(name, pass);
// ログイン処理
LoginLogic loginLogic = new LoginLogic();
boolean isLogin = loginLogic.execute(user);
// ログイン成功時の処理
if (isLogin) {
// ユーザー情報をセッションスコープに保存
// HttpSessionインスタンスの取得
HttpSession session = request.getSession();
// セッションスコープにインスタンスを保存
session.setAttribute("loginUser", user);
}
// ログイン結果画面にフォワード
RequestDispatcher dispacher = request.getRequestDispatcher("/WEB-INF/jsp/LoginResult.jsp");
dispacher.forward(request, response);
}
}
/pakutter/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>servlet.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>
/servlet/Login
</url-pattern>
</servlet-mapping>
</web-app>
エラーメッセージ
HTTPステータス 500 - Internal Server Error
Type Exception Report
メッセージ サーブレットクラス servlet.Login を初期化中にエラーが発生しました
説明 The server encountered an unexpected condition that prevented it from fulfilling the request.
例外
javax.servlet.ServletException: サーブレットクラス servlet.Login を初期化中にエラーが発生しました
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
原因
java.lang.ClassNotFoundException: servlet.Login
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
以下に記載するのが正常に動作したコードです。
動作としてはindex.jspで入力された値をResult.javaのサーブレット側で取得し計算を行うというものでClassNotFoundExceptionが発生せず処理を行なうことができました。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta charset=UTF-8">
<title>映画料金計算</title>
</head>
Result.java
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@WebServlet("/Result")
public class Result extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int age = -1;
// リクエストパラメータを取得
request.setCharacterEncoding("UTF-8");
String gender = request.getParameter("gender");
age = Integer.parseInt(request.getParameter("age"));
String type = request.getParameter("type");
// Calcクラスのインスタンスを生成
Calc calc = new Calc();
// 計算結果を代入
int result = calc.movieFeeCalc(age, gender, type);
request.setAttribute("result", result);
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/jsp/result.jsp").forward(request,
response);
}
}
<body>
<h1>映画料金を計算しゃす!</h1>
<form action = "/movieFee/servlet/Result" method = "Post">
性別:<br>
男<input type = "radio" name = "gender" value = "0" required>
女<input type = "radio" name = "gender" value = "1"><br>
年齢:<br>
<input type = "number" name = "age" required><br>
タイプ:<br>
3D<input type = "radio" name = "type" value = "0" required>
2D<input type = "radio" name = "type" value "1">
<input type = "submit" value = "計算へ">
</body>
</html>
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>Result</servlet-name>
<servlet-class>servlet.Result</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Result</servlet-name>
<url-pattern>
/servlet/Result
</url-pattern>
</servlet-mapping>
</web-app>