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

[JSP] - erro Páginas Dinâmicas - adicionar Empresa

Fui tentar usar uma página dinamica para imprimir a empresa adicionada, mas apresenta um erro:

novaEmpresa.jsp

<html>
<body>
Empresa adicionada : ${empresa}
</body>
</html>

novaEmpresa.java

package web;

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;

import br.com.alura.gerenciador.Empresa;
import br.com.alura.gerenciador.dao.EmpresaDAO;

@WebServlet(urlPatterns = "/novaEmpresa")

public class NovaEmpresa extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String nome = req.getParameter("nome");
        Empresa empresa = new Empresa(nome);
        new EmpresaDAO().adiciona(empresa);
        req.setAttribute("empresa", empresa);
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/paginas/novaEmpresa.jsp");
        dispatcher.forward(req, resp);    

    }
}

Erro

HTTP Status 500 - java.lang.IllegalStateException: No output folder

type Exception report

message java.lang.IllegalStateException: No output folder

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.IllegalStateException: No output folder
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:585)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:391)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:335)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    web.NovaEmpresa.doPost(NovaEmpresa.java:29)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    web.FiltroDeAuditoria.doFilter(FiltroDeAuditoria.java:49)
root cause

java.lang.IllegalStateException: No output folder
    org.apache.jasper.JspCompilationContext.createOutputDir(JspCompilationContext.java:656)
    org.apache.jasper.JspCompilationContext.getOutputDir(JspCompilationContext.java:193)
    org.apache.jasper.JspCompilationContext.getClassFileName(JspCompilationContext.java:504)
    org.apache.jasper.compiler.Compiler.isOutDated(Compiler.java:444)
    org.apache.jasper.compiler.Compiler.isOutDated(Compiler.java:408)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:557)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:335)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    web.NovaEmpresa.doPost(NovaEmpresa.java:29)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    web.FiltroDeAuditoria.doFilter(FiltroDeAuditoria.java:49)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.12 logs.

Apache Tomcat/8.0.12
10 respostas

Ronaldo,

Pela mensagem o diretório (pasta) não existe ou não está acessível. Você criou a pasta paginas dentro de WEB-INF? Se não criou, deve criá-la e colocar as páginas dentro dela. Além disso o erro ocorreu no servlet FiltroDeAuditoria na linha 49, mas você não postou o código desta servlet. Uma outra coisa que já vi alguns comentarem é sobre o local de instalação do tomcat. Não sei se você usa o Windows, mas se usar, ele bloqueia em alguns casos por questões de segurança o acesso direto ao diretório Program Files e Program Files(x86), por isso é interessane colocar o tomcat em uma pasta fora destas pastas. Preferencialmente em uma pasta diretamente no diretório raiz (c:, d:, etc.) e mapeá-lo a partir dali no eclipse.

Sandro,

Os arquivos estão no WEB-INF, tanto que eu fiz um teste com um arquivo.HTML e foi feito o redirect pelo servidor, mas quando uso um arquivo.JSP apresenta esse problema acima.

Eu uso Ubuntu 14.04 e fiz a instalação do Tomcat no /opt/apache-tomcat-8.0.12

Segue o FiltroDeAuditoria.java

package web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import br.com.alura.gerenciador.Usuario;
@WebFilter(urlPatterns = "/*")
public class FiltroDeAuditoria implements Filter{




    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        String uri = req.getRequestURI();

        /*
        Comentei e refatorei o metodo getUsuario abaixo e convoca o metodo aqui

        String usuario = "<deslogado>";
        Cookie[] cookies = req.getCookies();        
        if(cookies == null) return usuario;
        for(Cookie cookie : cookies){
            if(cookie.getName().equals("usuario.logado")){
                usuario = cookie.getValue();
            }
        }
        */

        String usuario = getUsuario(req);
        System.out.println("Usuario "+ usuario +" acessando a URI " + uri);
        chain.doFilter(request, response);
    }


    private String getUsuario(HttpServletRequest req){

        Usuario usuario = (Usuario) req.getSession().getAttribute("usuario.logado");



        if(usuario == null) return "<deslogado>";
        return usuario.getEmail();

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {


    }

}

como faz import também de uma outra class, a Empresa.java, segue:

package br.com.alura.gerenciador;

public class Empresa {

    private Long id = 0l;
    private String nome;

    public Empresa(String nome) {
        this.nome = nome;
    }

    public Long getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public void setId(long id) {
        this.id = id;

    }

}

Ronaldo,

Você disse que os arquivos estão no WEB-INF, mas a sua servlet NovaEmpresa direciona para WEB-INF/paginas. É lá que eles deveriam estar. O erro ocorre na linha de retorno do FilterChain. Pode confirmar se os arquivos estão na pasta WEB-INF/paginas?

Sandro,

os arquivos de fato estão em /WEB-INF/paginas/, acabei de verificar novamente.

Ronaldo, Copiei seu código do FiltroDeAuditoria para o meu projeto e funcionou normalmente. Não é erro de código. Mas fazendo uma analogia com o Windows (eu não conheço quase nada de Linux...sorry) você deve estar tendo problemas de permissionamento com a pasta de instalação do tomcat. O próprio sistema operacional deve estar te bloqueando, tente alterar as permissões de gravação da pasta do tomcat com o chmod ou altere o proprietário da pasta com o chown. Algo como chown -R roberto apache-tomcatXXXXXX (onde XXXXXX é a versão do tomcat). Isso deve resolver. Lembre do que eu disse: eu não saco nada de Linux, então os comandos podem ter parâmetros que eu desconheço, mas tente aí e retorne o que conseguiu.

Foi mal, no comando chowm eu te chamei de Roberto...e seu nome é Ronaldo...rsrsrs

Tranquilo com relação ao nome rsrsrsrs... então, ainda estou com problemas.

Na verdade, fiz um teste com um arquivo do tipo HTML e a aplicação faz redirect normal, mas com arquivos do tipo JSP ele não funciona!! Estou vendo se consigo descobrir o que está acontecendo antes de tentar dá um chmod da forma como vc falou, afinal vou alterar permissões de arquivo de servidor e eu não sei se isso é uma boa ideia.

Neste caso não vejo problema, pois você estaria dando permissão para o usuário Ronaldo (desta vez acertei rsrsrs) acessar a pasta do servidor. Mas um usuário anônimo acessando externamente o servidor via socket (IP + porta), não teria acesso direto às pastas, pois elas são privativas, excetuando-se, claro as pastas explicitamente visíveis através do tomcat.

solução!

cedi à tentação e deu certo rsrsrsr

na verdade nem foi mudar permissão de escrita e sim mudança de proprietário, ao invés de chmod foi um chown, segue:

chown -R ronaldo:www-data /opt/apache-tomcat-8.0.12/

vlw sandro

Beleza! Pô, apesar de não sacar de Linux, até que servi para alguma coisa...rsrsrs Qualquer coisa grita aí. Abraço.