[Dúvida] Iniciante com Java Web!

12 respostas
Nicolas_Fernandes

Olá, pessoal do GUJ!
Tudo bem?

Estava iniciando meus estudos em JSP, e eis que me surgiu uma dúvida.
Dêem uma olhada:

  1. Criei uma Servlet. Ela irá se comunicar com um DAO para requerer dados. Por hora, estou fazendo os dados na mão só para teste.
private List<Noticias>    noticiasList;
    private RequestDispatcher requestDispatcher;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.noticiasList = new ArrayList<Noticias>();
        
        this.noticiasList.add(new Noticias(new Long(1),  "Esporte",   "Notícia 1."));
        this.noticiasList.add(new Noticias(new Long(2),  "Esporte",   "Notícia 2."));
        this.noticiasList.add(new Noticias(new Long(3),  "Televisão", "Notícia 3."));
        this.noticiasList.add(new Noticias(new Long(4),  "Televisão", "Notícia 4."));
        this.noticiasList.add(new Noticias(new Long(5),  "Trânsito",  "Notícia 5."));
        this.noticiasList.add(new Noticias(new Long(6),  "Trânsito",  "Notícia 6."));
        this.noticiasList.add(new Noticias(new Long(7),  "Cinema",    "Notícia 7."));
        this.noticiasList.add(new Noticias(new Long(8),  "Cinema",    "Notícia 8."));
        this.noticiasList.add(new Noticias(new Long(9),  "Saúde",     "Notícia 9."));
        this.noticiasList.add(new Noticias(new Long(10), "Saúde",     "Notícia 10."));

        request.setAttribute("noticias", this.noticiasList);
        this.requestDispatcher = request.getRequestDispatcher("/Noticias.jsp");
        this.requestDispatcher.forward(request, response);
    }
  1. Criei uma página JSP, a qual receberá esses dados que gerei na noticiasList.
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>.: Últimas Notícias - Notícias em Tempo Real :.</title>
    </head>
    <body>
        <h1>Últimas Notícias:</h1>

        <c:if test="${!empty noticias}">
               <c:forEach var="noticia" items="${noticias}">
               <p>${noticia.titulo}</p>
               <p>${noticia.noticia}</p>
               </c:forEach>
        </c:if>
        <c:if test="${empty noticias}">
             Não há nenhuma notícia a ser exibida.
        </c:if>

    </body>
</html>

Mesmo eu preenchendo a lista dentro da minha Servlet, sempre cai no if dizendo que não há notícias!
Creio que seja um erro bobo!

Gostaria que, se possível, me ajudassem a corrigir este problema.
Desde já agradecido, fico no aguardo!

Abraço a todos!

12 Respostas

jyoshiriro

Nicolas,

subtitua

[color=red]<c:if test="${!empty noticias}"> [/color]

por

[color=blue]<c:if test="${not empty noticias}"> [/color]

E mais: num servlet, evite usar variáveis de classe, pois são compartilhadas por todas as requisições que chamarem o servlet. Se essa não for sua intenção, tranforme-a numa variável interna no método, no seu caso, o processRequest().

Aliás, onde estão seu doGet e doPost? Algum deles chama esse seu processRequest() ?

Nicolas_Fernandes

Jyo,

Fiz a conversão dos C:If, já.

Desculpe a minha ignorância, mas onde serão criados/chamados esses métodos doGet e doPost?

jyoshiriro

Nicolas, pode me chamar de Yoshi, ok?

Amigo, sua classe servlet não extendeu javax.servlet.http.HttpServlet?

Se sim, seria obrigatório você ter ou o doGet ou o doPost sobrescritos para poder tratar as requisições GET e POST, respectivamente.

Como você se disse iniciante e WEB, caso não saiba, requisições GET são aquelas em que digitamos uma url no navegador ou quando clicamos num link simples em uma pagina. Requisições POST só podem ser enviadas por formulários.

Dai você deveria sobrescrever um ou ambos no sue servlet. Ai esse método que você criou pode estar em um deles ou até em ambos.

Outro erro que vi só agora:

Tire o

private RequestDispatcher requestDispatcher;

de fora do método.
A instância do RequestDispatcher deve ser feita SEMPRE dentro do método!

Nicolas_Fernandes

Tudo bem, então… hehe.

Yoshi, coloquei a declaração do RequestDispatcher dentro da classe.

Sim, já havia implementado os métodos doGet e doPost. Só esqueci que estavam escondidos por um //… hehe!

Se não me engano, há algum lugar na página JSP onde eu defino um atributo chamado action=“get” ou action=“post”.
É isso mesmo?

Se sim, onde é definido isso?

[]'s

jyoshiriro

Bateu na trave!

É no atributo method da tag form e não no action. No action você indica o JSP ou servlet ou até mesmo link externo que será chamado quando o formulário for submetido.

Exemplo:
<!--  GET é o padrão. Se não informar, este será o usado! -->
<form action="MeuServlet" method="get">
</form>

<form action="MeuServlet" method="post">
</form>
Nicolas_Fernandes

Estamos caminhando… hehe!

Bom, não tenho muito conhecimento sobre HTML, também (quase nada, para falar a verdade!)…

Ficaria assim?

<form action="NoticiasReadAction" method="post">
             <c:if test="${not empty noticias}">
               <c:forEach var="noticia" items="${noticias}">
               <p>${noticia.titulo}</p>
               <p>${noticia.noticia}</p>
               </c:forEach>
            </c:if>
            <c:if test="${empty noticias}">
                 Nenhuma notícia a ser listada.
            </c:if>
        </form>

[]'s

R

Nicolas Fernandes:

<form action="NoticiasReadAction" method="post">
             <c:if test="${not empty noticias}">
               <c:forEach var="noticia" items="${noticias}">
               <p>${noticia.titulo}</p>
               <p>${noticia.noticia}</p>
               </c:forEach>
            </c:if>
            <c:if test="${empty noticias}">
                 Nenhuma notícia a ser listada.
            </c:if>
        </form>

[]'s

acho que agora está correto, lembrando que o servlet deve estar declarado…

test="${not empty noticias}"

funcionou a condição “not empty”?

Nicolas_Fernandes

Rsenhem, obrigado pela resposta!

Ainda não está funcionando.
O que pode ser?

Erro na própria Servlet?
Erro na página JSP?
Burrice minha? hehe

R

Está dando algum erro no LOG?
posta o erro, que talvez podemos ajudar…

Nicolas_Fernandes

Pessoal, muito obrigado por me ajudarem até agora!

Vou postar as partes do meu código, para vocês verem como está:

Esse é o index.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:forward page="Noticias.jsp" />

Esse é o Noticias.jsp:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>.: �ltimas Notícias - Notícias em Tempo Real :.</title>
    </head>
    <body>
        <h1>�ltimas Notícias:</h1>
        <form action="NoticiasReadAction" method="post">
             <c:if test="${not empty noticias}">
               <c:forEach var="noticia" items="${noticias}">
               <p>${noticia.titulo}</p>
               <p>${noticia.noticia}</p>
               </c:forEach>
            </c:if>
            <c:if test="${empty noticias}">
                 Nenhuma notícia a ser listada.
            </c:if>
        </form>
    </body>
</html>

Este é o NoticiasReadAction.java:

package ultimasnoticias.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ultimasnoticias.model.pojo.Noticias;

public class NoticiasReadAction extends HttpServlet {

    private List<Noticias>    noticiasList;
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.noticiasList = new ArrayList<Noticias>();
        
        this.noticiasList.add(new Noticias(new Long(1),  "Esporte",   "Brasil enfrenta a seleção chilena hoje."));
        this.noticiasList.add(new Noticias(new Long(2),  "Esporte",   "Usain Bolt quebra outro recorde mundial."));
        this.noticiasList.add(new Noticias(new Long(3),  "Televisão", "Morre, aos 50 anos, Monstro Jackson."));
        this.noticiasList.add(new Noticias(new Long(4),  "Televisão", "�ltima semana de 'Estrupício das �ndias'."));
        this.noticiasList.add(new Noticias(new Long(5),  "Trânsito",  "Acidente nas proximidades de Piranguinho."));
        this.noticiasList.add(new Noticias(new Long(6),  "Trânsito",  "São Paulo tem manhã congestionada na Tietê."));
        this.noticiasList.add(new Noticias(new Long(7),  "Cinema",    "Harry Potter bate recorde de bilheteria."));
        this.noticiasList.add(new Noticias(new Long(8),  "Cinema",    "Senhor dos Anéis ganha prêmio em 2009."));
        this.noticiasList.add(new Noticias(new Long(9),  "Saúde",     "Nova esperança para a cura da AIDS."));
        this.noticiasList.add(new Noticias(new Long(10), "Saúde",     "Linhaça e seus benefícios para a saúde."));

        request.setAttribute("noticias", this.noticiasList);
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Noticias.jsp");
        requestDispatcher.forward(request, response);
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

E, finalmente, o Pojo Noticias:

package ultimasnoticias.model.pojo;

public class Noticias {

    private Long handle;
    public  Long getHandle()            { return handle; }
    public  void setHandle(Long handle) { this.handle = handle; }

    private String titulo;
    public  String getTitulo()              { return titulo; }
    public  void   setTitulo(String titulo) { this.titulo = titulo; }

    private String noticia;
    public  String getNoticia()               { return noticia;}
    public  void   setNoticia(String noticia) { this.noticia = noticia; }

    public Noticias() {}

    public Noticias(Long handle, String titulo, String noticia) {
        this.handle  = handle;
        this.titulo  = titulo;
        this.noticia = noticia;
    }
}

Gostaria muito que me ajudassem a solucionar este impasse!

Obrigado a todos! []'s

R

tenta colocar então assim…

&lt;c:if test="${noticias != null}"&gt;   
               &lt;c:forEach var="noticia" items="${noticias}"&gt;   
               <p>${noticia.titulo}</p>   
               <p>${noticia.noticia}</p>   
               &lt;/c:forEach&gt;   
        &lt;/c:if&gt;   
        &lt;c:if test="${noticias == null}"&gt;   
             Não  nenhuma notícia a ser exibida.   
        &lt;/c:if&gt;

não sei também se estou entendendo…

Nicolas_Fernandes

Rsehnem,

O que quero fazer é o seguinte.

Minha página index.jsp vai carregar a Noticias.jsp quando carregar o site.
Essa Noticias.jsp faz uma requisição ao NoticiasReadAction.java, para pegar uma lista de Notícias.
Daí, perceba que o Noticias.java é um Pojo e o NoticiasReadAction.java faz uso desse Pojo para criar uma List.

Daí, quero retornar essa List para o Noticias.jsp, e mostrar na tela.
É isso que quero fazer, mas sempre caí na segunda opção, dizendo que não há nada a se mostrar.

Alguma idéia?

Criado 11 de setembro de 2009
Ultima resposta 11 de set. de 2009
Respostas 12
Participantes 3