

お世話になります。

jspからサーブレットを呼び出すときに500エラーが発生します。  
ClassNotFoundExceptionが出ており、  
web.xmlの設定、またはjspでのform内のURL指定が誤っているのかと  
思いましたが、jspからサーブレットを問題なく呼び出せているソースと  
比較したところ、web.xmlの記述などには差異は見られませんでした。

ご助言いただければ幸いです。

以下、ソースコード及びエラーメッセージです。

index.jsp

[code]

    <%@ 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>
        パスワード&nbsp;&nbsp;:<input type = "text" name = "pass"><br>
        <input type = "submit" value = "ログイン">
        </form>
    
    </body>
    </html>
    
[/code]

Login.java

[code]

    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);
    
        }
    
    }
    
[/code]

/pakutter/WEB-INF/web.xml

[code]

    <?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>
    
[/code]

エラーメッセージ

[code]

    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)
    
[/code]

以下に記載するのが正常に動作したコードです。  
動作としてはindex.jspで入力された値をResult.javaのサーブレット側で取得し計算を行うというものでClassNotFoundExceptionが発生せず処理を行なうことができました。

index.jsp

[code]

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html >
    <html>
    <head>
    <meta  charset=UTF-8">
    <title>映画料金計算</title>
    </head>
    
[/code]

Result.java

[code]

    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>
    
[/code]

web.xml

[code]

    <?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>
    
[/code]


CC BY-SA 4.0
2018-07-29T04:18:42.513
47071
2018-07-29T04:53:23.663
29509
question
java jsp servlet
サーブレットクラスを初期化時にClassNotFoundExceptionが発生する

[code]

    java.lang.ClassNotFoundException: servlet.Login
    
[/code]

と言われているので、

[code]

    /pakutter/WEB-INF/classes/servlet/Login.class
    
[/code]

ファイルが配置されていないことが原因と考えられます。いかがでしょうか?


CC BY-SA 4.0
2018-07-29T04:53:23.663
47073
2018-07-29T04:53:23.663
20098
47071
answer