Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.