Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Problemas na hora de rodar uma aplicação com Servlets

Estou fazendo um projeto de avaliações de filmes e series usando java e servlets. Na hora de enviar a requisição pra cair no controller não está funcionando. Só funciona quando chamo diretamente o JSP. Vou deixar como está o codigo abaixo. Quem poder me ajudar agreço muito.

Aqui está como fica quando chamo diretamente o login.jsp:Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui quando eu chamo pelo LoginFormBean:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui vou deixar os codigos:

package br.com.cine.controller;

import java.io.IOException;

import jakarta.servlet.ServletException;

public interface TipoAcao {
    void execute() throws ServletException, IOException;
} 
package br.com.cine.controller;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/cine")
public class CineController extends HttpServlet {

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");

        String fqn = "br.com.cine.model.bean." +  Character.toUpperCase(action.charAt(0)) + action.substring(1)
        + "Bean";

        try {
            Class<?> classe = Class.forName(fqn);
            Constructor<?> constructor = classe.getDeclaredConstructor(HttpServletRequest.class, HttpServletResponse.class);
            TipoAcao tipoAcao = (TipoAcao) constructor.newInstance(req, resp);
            tipoAcao.execute();
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException
                    | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            throw new ServletException(e);
        }
    }
}
package br.com.cine.model.bean;

import java.io.IOException;
import br.com.cine.controller.TipoAcao;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class LoginFormBean implements TipoAcao{
    private HttpServletRequest req;
    private HttpServletResponse resp;

    public LoginFormBean(HttpServletRequest req, HttpServletResponse resp) {
        this.req = req;
        this.resp = resp;
    }

    @Override
    public void execute() throws ServletException, IOException {
        RequestDispatcher rd = this.req.getRequestDispatcher("/login.jsp");
        rd.forward(this.req, this.resp);
    }
}
4 respostas

Aqui o login.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:url value="/cine?action=LoginBean" var="login"/>
<c:url value="/cine?action=CadastroUsuarioBean" var="cadastroUsuario"/>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/login.css">
    <title>Login</title>
</head>
<body>
<div class="container" id="container">
<div class="form-container sign-up-container">
    <form action="${login}" method="post">
        <h1>Criar uma conta</h1>
        
        <span>ou use seu e-mail para cadastro</span>
        <input type="text" placeholder="First name" name="name"/>
        <input type="text" placeholder="Last name" name="surname"/>
        <input type="email" placeholder="Email" name="email"/>
        <input type="password" placeholder="Password" name="password"/>
        <input type="date" placeholder="date"/>
        
<select id="sexo" name="genero">
    <option value="" disabled selected>Selecione uma opção</option>
    <option value="feminino">Masculino</option>
    <option value="masculino">Feminino</option>
    <option value="outros">Outros</option>
</select>
        <button>Inscrever-se</button>
    </form>
</div>

<div class="form-container sign-in-container">
    <form action="${cadastroUsuario}" method="post">
        <h1>Entrar</h1>		
        <span>ou se escrever-se</span>
        <input type="email" placeholder="Email" name="email"/>
        <input type="password" placeholder="Password" name="password"/>
        <a href="#">Esqueceu a senha ?</a>
        <button>Entrar</button>
    </form>
</div>
<div class="overlay-container">
    <div class="overlay">
        <div class="overlay-panel overlay-left">
            <h1>Bem vindo de volta!</h1>
            <p>Para se manter conectado conosco, faça login com suas informações</p>
            <button class="ghost" id="signIn">Entrar</button>
        </div>
        <div class="overlay-panel overlay-right">
            <h1>Olá, Amigo!</h1>
            <p>Insira seus dados e comece sua diversão conosoco</p>
            <button class="ghost" id="signUp">Inscrever-se</button>
        </div>
    </div>
</div>
</div>

<script src="js/login.js"></script>
</body>
</html>

O login e o cadastroUsuario ainda falta fazer, mas primeiro quero resolver o problema que não está chamando pelo controlador.

Oi

Parece que há um problema na forma como você está construindo o nome da classe no servlet. Você está usando o nome da classe diretamente a partir do parâmetro action, e isso pode estar causando problemas. Além disso, é uma boa prática verificar se o parâmetro action não é nulo antes de tentar criar a instância da classe.

Vamos fazer algumas modificações no seu servlet:

@WebServlet(urlPatterns = "/cine")
public class CineController extends HttpServlet {

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");

        if (action != null) {
            String className = "br.com.cine.model.bean." + capitalize(action) + "Bean";

            try {
                Class<?> classe = Class.forName(className);
                Constructor<?> constructor = classe.getDeclaredConstructor(HttpServletRequest.class, HttpServletResponse.class);
                TipoAcao tipoAcao = (TipoAcao) constructor.newInstance(req, resp);
                tipoAcao.execute();
            } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException
                    | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                throw new ServletException(e);
            }
        } else {
            // Lógica para tratar quando o parâmetro action é nulo
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Parâmetro 'action' não fornecido");
        }
    }

    private String capitalize(String str) {
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);
    }
}

Além disso, adicionei uma verificação para garantir que o parâmetro action não seja nulo antes de tentar criar a instância da classe. Também adicionei um método capitalize para garantir que o nome da classe tenha a primeira letra maiúscula.

Certifique-se de que a string fornecida como parâmetro action corresponde exatamente ao nome da classe que você deseja instanciar. Caso contrário, a classe não será encontrada e você receberá uma exceção.

Não consegui utilizar o metodo capitalize, não importava nd. Ai utilizei da mesma forma que estava usando, fiz a validação para ver se ele não estava vindo nulo.

O link que estou passando é esse: http://localhost:8080/cine_synergy/cine?action=LoginFormBean

A classe que ele deveria chamar é essa:

package br.com.cine.model.bean;

import java.io.IOException;
import br.com.cine.controller.TipoAcao;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class LoginFormBean implements TipoAcao{
    private HttpServletRequest req;
    private HttpServletResponse resp;

    public LoginFormBean(HttpServletRequest req, HttpServletResponse resp) {
        this.req = req;
        this.resp = resp;
    }

    @Override
    public void execute() throws ServletException, IOException {
        RequestDispatcher rd = this.req.getRequestDispatcher("/login.jsp");
        rd.forward(this.req, this.resp);
    }
}

O controller ficou assim:

package br.com.cine.controller;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import com.mysql.cj.util.StringUtils;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/cine")
public class CineController extends HttpServlet {

    private static final long serialVersionUID = 1L;
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        
        String fqn = null;

        if (action != null) {
            fqn = "br.com.cine.model.bean." + Character.toUpperCase(action.charAt(0)) + action.substring(1) + "Bean";
        } else {
            throw new IllegalArgumentException("Nenhuma ação foi informada!");
        }

        try {
            Class<?> classe = Class.forName(fqn);
            Constructor<?> constructor = classe.getDeclaredConstructor(HttpServletRequest.class, HttpServletResponse.class);
            TipoAcao tipoAcao = (TipoAcao) constructor.newInstance(req, resp);
            tipoAcao.execute();
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException
                    | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            throw new ServletException(e);
        }
    }
}

E mesmo assim não está funcionando, não to entendendo. Pq se fosse um problema no tomcat ele não chamaria pela url diretamente o jsp.

Vou deixar aqui como está as distribuições das pastas:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Problema resolvido. O problema era que as versões do tomcat com o java e a do servlet não eram compativeis.