Error instantiating servlet class

0

Piszę aplikację webową, która ma wyświetlać bazę danych i umożliwiać jej edycję. Niestety pojawia się błąd, z którym nie mogę sobie poradzić:

HTTP Status 500 - An exception occurred processing JSP page /index.jsp at line 14
type Exception report
message An exception occurred processing JSP page /index.jsp at line 14
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 14

11: <title>Insert title here</title>
12: </head>
13: <body>
14: <jsp:forward page="/FilmController" >
15: <jsp:param name="action" value="listFilm"/>
16: </jsp:forward>
17: </body>

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:574)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:461)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.servlet.ServletException: Error instantiating servlet class com.agh.filmy.controller.FilmController
org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:741)
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:711)
org.apache.jsp.index_jsp._jspService(index_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NullPointerException
java.util.Properties$LineReader.readLine(Properties.java:434)
java.util.Properties.load0(Properties.java:353)
java.util.Properties.load(Properties.java:341)
com.agh.filmy.util.DbUtil.getConnection(DbUtil.java:25)
com.agh.filmy.dao.FilmDao.<init>(FilmDao.java:20)
com.agh.filmy.controller.FilmController.<init>(FilmController.java:32)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:422)
java.lang.Class.newInstance(Class.java:442)
org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:741)
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:711)
org.apache.jsp.index_jsp._jspService(index_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Z tego co widzę, jest jakiś błąd z utworzeniem serwleta FilmController, ale czytałam cały kod i nie wiedzę błędu :(

Struktura projektu:

Filmy
src
main
java
com
agh
filmy
controller
FilmController.java
dao
FilmDao.java
model
film.java
kategoria.java
util
DbUtil.java
db.properties
resources
webapp
META-INF
context.xml
WEB-INF
web.xml
index.jsp
listFilm.jsp

Pliki:

index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <title>Insert title here</title>
    </head>
    <body>
        <jsp:forward page="/FilmController" >
            <jsp:param name="action" value="listFilm"/>
        </jsp:forward> 
    </body>
</html>

FilmController.java

package com.agh.filmy.controller;

import com.agh.filmy.dao.FilmDao;
import com.agh.filmy.model.film;
import com.agh.filmy.model.kategoria;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
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(name = "FilmController", urlPatterns = {"/FilmController"})
public class FilmController extends HttpServlet {
    private static final long serialVersionUID= 1L;
    private static String INSERT_OR_EDIT = "/film.jsp";
    private static String LIST_FILM = "/listFilm.jsp";
    private FilmDao dao;
    public FilmController() {
        super();
        dao= new FilmDao();
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String forward="";
        String action= request.getParameter("action");
        if(action.equalsIgnoreCase("delete")){
            int filmId= Integer.parseInt(request.getParameter("filmId"));
            dao.deleteFilm(filmId);
            forward= LIST_FILM;
            request.setAttribute("filmy", dao.getAllFilms());
        } else if(action.equalsIgnoreCase("edit")){
            forward = INSERT_OR_EDIT;
            int filmId = Integer.parseInt(request.getParameter("filmId"));
            film film = dao.getFilmById(filmId);
            request.setAttribute("film", film);
        }else if(action.equalsIgnoreCase("listFilm")) {
            forward = LIST_FILM;
            request.setAttribute("filmy", dao.getAllFilms());
        } else {
            forward = INSERT_OR_EDIT;
        }
        RequestDispatcher view = request.getRequestDispatcher(forward);
        view.forward(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        film film = new film();
        film.setTytul(request.getParameter("tytul"));
        film.setRezyser(request.getParameter("rezyser"));
        film.setRok(request.getParameter("rok"));
        film.setLink(request.getParameter("link"));
        film.setKategoria(new kategoria(Integer.parseInt(request.getParameter("kategoria_id")),request.getParameter("kategoria_opis")));
        
        String filmid = request.getParameter("filmid");
        if (filmid == null || filmid.isEmpty()) {
            dao.addFilm(film);
        } else {
            film.setFilmId(Integer.parseInt(filmid));
            dao.updateFilm(film);
        }
        RequestDispatcher view = request.getRequestDispatcher(LIST_FILM);
        request.setAttribute("filmy", dao.getAllFilms());
        view.forward(request, response);
    }
    
}

FilmDao.java

package com.agh.filmy.dao;

import com.agh.filmy.model.*;
import com.agh.filmy.util.*;
import java.sql.*;
import java.util.*;

public class FilmDao {
    private Connection connection;
    public FilmDao(){
    connection= DbUtil.getConnection();
    }
    public void addFilm(film film) {
        try{
            PreparedStatement preparedStatement= connection.prepareStatement("INSERT INTO ap_web_filmy (tytul, rok_produkcji, id_kategoria, rezyser, link) VALUES (?, ?, ?, ?, ?)");
            preparedStatement.setString(1, film.getTytul());
            preparedStatement.setString(2, film.getRok());
            preparedStatement.setInt(3, film.getKategoria().getKategoriaId());
            preparedStatement.setString(4, film.getRezyser());
            preparedStatement.setString(5, film.getLink());
            preparedStatement.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        }
    }
    public void updateFilm(film film) {
        try{
            PreparedStatement preparedStatement= connection.prepareStatement("UPDATE ap_web_filmy SET tytul=?, rok_produkcji=?, id_kategoria=?, rezyser=?, link=? WHERE id_film=?");
            preparedStatement.setString(1, film.getTytul());
            preparedStatement.setString(2, film.getRok());
            preparedStatement.setInt(3, film.getKategoria().getKategoriaId());
            preparedStatement.setString(4, film.getRezyser());
            preparedStatement.setString(5, film.getLink());
            preparedStatement.setInt(5, film.getFilmId());
            preparedStatement.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        }
    }
    public void deleteFilm(int id){
        try{
            PreparedStatement preparedStatement= connection.prepareStatement("DELETE FROM ap_web_filmy WHERE id_film=?");
            preparedStatement.setInt(1, id);
            preparedStatement.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        }
    }
    public List <film> getAllFilms() {
        List <film> filmy= new ArrayList<film>();
        try{
            Statement statement= connection.createStatement();
            ResultSet rs= statement.executeQuery("select* from ap_web_filmy, ap_web_kategorie WHERE ap_web_filmy.id_kategoria=ap_web_kategorie.id_kategoria");
            while(rs.next()) {
                film film= new film();
                film.setFilmId(rs.getInt("id_film"));
                film.setTytul(rs.getString("tytul"));
                film.setRok(rs.getString("rok"));
                film.setRezyser(rs.getString("rezyser"));
                film.setLink(rs.getString("link"));
                film.setKategoria(new kategoria(rs.getInt("id_kateoria"),rs.getString("opis")));
                filmy.add(film);
            }
        } catch(SQLException e) { 
            e.printStackTrace(); 
        }
        return filmy;
    }
    public film getFilmById(int id_film) {
        film film=new film();
        try{
            PreparedStatement preparedStatement= connection.prepareStatement("select* from ap_web_filmy WHERE id_film=?");
            preparedStatement.setInt(1, id_film);
            ResultSet rs= preparedStatement.executeQuery();
            if(rs.next()) {
                film.setFilmId(rs.getInt("id_film"));
                film.setTytul(rs.getString("tytul"));
                film.setRok(rs.getString("rok"));
                film.setRezyser(rs.getString("rezyser"));
                film.setLink(rs.getString("link"));
                film.setKategoria(new kategoria(rs.getInt("id_kateoria"),rs.getString("opis")));
            }
        } catch(SQLException e) { 
            e.printStackTrace();
        }
        return film;
    }
    
    
}

DbUtil.java

import java.io.*;
import java.sql.*;
import java.util.*;

public class DbUtil {
    private static Connection connection= null;
    public static Connection getConnection(){
    if(connection!= null)
        return connection;
    else{
        try{
            Properties prop= new Properties();
            InputStream inputStream= DbUtil.class.getClassLoader().getResourceAsStream("/db.properties");
            prop.load(inputStream);
            String driver = prop.getProperty("driver");
            String url= prop.getProperty("url");
            String user= prop.getProperty("user");
            String password= prop.getProperty("password");
            Class.forName(driver);
            connection= DriverManager.getConnection(url, user, password);
        } catch(ClassNotFoundException | SQLException | IOException  e) {
            e.printStackTrace();
            } 
            return connection;
        }
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>FilmController</servlet-name>
        <servlet-class>com.agh.filmy.controller.FilmController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FilmController</servlet-name>
        <url-pattern>/FilmController</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

Jeśli ktoś mógłby mnie naprowadzić gdzie jest błąd, byłabym bardzo wdzięczna.

Jeśli to jest coś oczywistego albo czegoś nie napisałam to przepraszam, w javie jestem zielona. Kod jest praktycznie identyczny z tym podanym przez wykładowcę, dostosowałam go tylko do mojej bazy danych.

0

Może ktoś coś jednak poradzi?

1

java.lang.NullPointerException
java.util.Properties$LineReader.readLine(Properties.java:434)
java.util.Properties.load0(Properties.java:353)
java.util.Properties.load(Properties.java:341)
com.agh.filmy.util.DbUtil.getConnection(DbUtil.java:25)
com.agh.filmy.dao.FilmDao.<init>(FilmDao.java:20)
com.agh.filmy.controller.FilmController.<init>(FilmController.java:32)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:422)
java.lang.Class.newInstance(Class.java:442)
org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:741)
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:711)
org.apache.jsp.index_jsp._jspService(index_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Masz jakis blad w czytaniu propertisow w DbUtil.getConnection.

0

Dzięki za odpowiedź :)

db.properties wygląda tak:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://mysql.agh.edu.pl:3306/******
user=******
password=******

Myślisz, że błąd będzie w tym czy źle używam tych funkcji do wczytania właściwości (DbUtil.class.getClassLoader().getResourceAsStream("/db.properties"))?

0

Podejrzewam ze po wykonaniu linijki:
InputStream inputStream= DbUtil.class.getClassLoader().getResourceAsStream("/db.properties");
inputStream jest nullem, dlatego readLine gdzies wewnatrz properties.load rzuca NPE.

0

Fragment dokumentacji metody load.

The input stream is in a simple line-oriented format ... and is assumed to use the ISO 8859-1 character encoding
Nie kryją się pod tymi gwiazdkami polskie znaki diakrytyczne?
W ramach testów napisz parowierszową aplikację desktopową z

new Properties().load(new FileInputStream("db.properties"));
0

Dzięki wszystkim za pomoc :)
Inputstream był nullem i problemy były dwa:
w targecie nie było pliku db.properties więc dodałam w pliku pom.xml:

<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>

i coś nie tak było z tworzeniem inputstream więc wywaliłam getClassLoader() i teraz to wygląda tak:
InputStream inputStream= DbUtil.class.getResourceAsStream("db.properties")
I wreszcie działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1