Como eu carrego dois combos num JSP?

15 respostas
F

Pessoal,

Estou precisando carregar dois combos num JSP, sendo que este JSP é a minha página inicial quando abro o site.

Com servlets consegui fazer fácil, porém estou utilizando como camada de apresentação nesse caso, mas eu gostaria de exibir um JSP.

Como vocês recomendam as boas práticas nesse caso, ainda terá algumas outras páginas que podem precisar do mesmo processamento de informações.

Eu quero fazer isso da forma correta, estou usando JDeveloper 9.0.2…e o JSP e Servlets suportados são 1.1 e 2.2 respectivamente.

Se alguém puder dar um exemplo de código de como fazer vou ficar muito grato.

Obrigado e Abraços a todos!

15 Respostas

K

Carrega no seu servlet os dados, jogando em um List e faz um request.setAttribute(String, Object); e pega o valor na sua JSP para formar, por exemplo.

Ou então crie um taglib (ou utilize uma que já exista) que crie o combo para ti

F

Olá Kina,

Muitas pessoas me falaram para usar dessa forma, mas como que eu recupero no JSP, preciso de um exemplo para poder olhar, pois ainda não tive a visibilidade do código.

TagLib infelizmente não vou poder usar tendo em vista as versões do JSP e servlets citadas.

Preciso ver um código
:slight_smile:

B

Após ter criado no servlet uma Collection com o que você quer use o seguinte

request.setAttribute("colClientes", colClientes);

Assim você jogou no request a coleção de clientes, é só recuperá-la no JSP através de um código mais ou menos como esse

<%
Collection colClientes = (Collection) request.getAttribute("colClientes");
  if (colClientes != null) {  
      for (Iterator it = colClientes.iterator(); it.hasNext(); ) {                   		
            Cliente cliente = (Cliente) it.next();
            %>  <option value="<%=cliente.getCodigo()%>">
                   <%=cliente.getCodigo()%> - <%= cliente.getNome() %>
            </option>
    <% } 
}%>

Isso sem usar JSTL, se for usar JSTL fica muito mais bonito, é só usar um forEach :slight_smile:

F

Opa, estamos avançando, eu estou quase colocando para funcionar.

Bruno, se eu for usar a forEach, como ficaria, mas me dê a mesma visibilidade que você deu neste código para eu saber o que vem de onde.

Tipo, como a kina já disse, tenho que carregar um objeto num servlet primeiro e depois pegar esse objeto no JSP. o meu problema está no seguinte, tenho como definir que o meu servlet é minha página inicial trabalhando da seguinte forma http://…/Aplicacao ? e com isso meu servlet abre, carrega o objeto e passa para a JSP?

Estou usando o RequestDispatcher assim:

RequestDispatcher rd = getServletContext.getRequestDispatcher(index.jsp)

rd.include(request, response)

sendo que antes desse rd.include já tem uma linha request.setAttribute(“combo”, combo)

Está correto esse uso?

Aguardo retorno, obrigado a todos.

Valeu pela ajuda.

B

Olá.
O mesmo código de antes, mas usando a tag forEach

<c:forEach items="${colClientes}" var="cliente">
      <option value="$cliente.codigo}"> ${cliente.nome} </option>
</c:forEach>

Fica uma código muito mais limpo e mais fácil de visualizar :).
Sobre essa questão de como chamar o servlet como página inicial, eu coloco na tag body da página index.jsp o seguinte javascript

<body onLoad="document.location.href='servlet....'">

E pelo que você falou seu jeito de utilizar está certo dentro do MVC, o servlet carrega, joga na request, chama o jsp e ele irá mostrar os dados.
Qualquer duvida sobre esse modelo procure sobre o padrão MVC aqui no forum mesmo que voce ira achar bastante material :slight_smile:

F

Esse cliente.codigo que vc colocou seria uma variável dentro de uma classe, certo? pelo que vc escreveu eu entendi assim.

Ou é outra coisa?

Pode me explicar, por favor?

B

${cliente.codigo} é a mesma coisa que escrever <%=cliente.getCodigo()%>, só que utilizando EL.

F

Entendi, valeu!!

F

Bruno,

Estou com uma pequena dificuldade pois não sei o que colocar após o ponto

&lt;c&#58;forEach items="$&#123;comboStatus&#125;" var="status"&gt;
   &lt;option value="$&#123;status.?&#125;"&gt;$&#123;status.?&#125;&lt;/option&gt;
&lt;/c&#58;forEach&gt;
/*
 * Created on 8 de Julho de 2005, 10&#58;21
 * @author fcardao
 * Este bean está relacionado com as combos da página
 * index.jsp
 */

package br.gov.anp.beans;

public class Combos
&#123;
    private String comboStatus;
    private int    idComboStatus;
    private String comboClassificacao;
    private int    idComboClassificacao;
    
    public Combos&#40;&#41;
    &#123;
        comboStatus          = "";
        comboClassificacao   = "";
        idComboClassificacao = 0;
        idComboStatus        = 0;
    &#125;

    public String getComboStatus&#40;&#41; &#123;
        return comboStatus;
    &#125;

    public void setComboStatus&#40;String comboStatus&#41; &#123;
        this.comboStatus = comboStatus;
    &#125;

    public String getComboClassificacao&#40;&#41; &#123;
        return comboClassificacao;
    &#125;

    public void setComboClassificacao&#40;String comboClassificacao&#41; &#123;
        this.comboClassificacao = comboClassificacao;
    &#125;

    public int getIdClassificacao&#40;&#41; &#123;
        return idComboClassificacao;
    &#125;

    public void setIdClassificacao&#40;int idClassificacao&#41; &#123;
        this.idComboClassificacao = idClassificacao;
    &#125;

    public int getIdComboStatus&#40;&#41; &#123;
        return idComboStatus;
    &#125;

    public void setIdComboStatus&#40;int idComboStatus&#41; &#123;
        this.idComboStatus = idComboStatus;
    &#125;
&#125;

[size=“11”]
[color=“red”]

  • Editado: Aumente as chances de alguém responder o seu tópico. Use BBCode em seus códigos para mantê-los identados e mais legíveis para outros usuários. - Matheus[/color][/size] :joia:
B

Na parte onde tem <option value="">, no value coloque o valor que o item do combo terá, que no exemplo que coloquei seria o código do cliente, assim no servlet quando voce fizer um getParameter() você irá receber o código do cliente. No outro local, que fica entre o <option> e o </option> é o que você quer que apareça para o usuario na combo, no exemplo que lhe passei seria o nome do cliente.
Isso depende muito da funcionalidade do sistema, sendo uma decisão sua ver o que vai precisar :slight_smile:

F

isso eu já sei, não estou conseguindo fazer funcionar mesmo.

B

Depois do ponto deve-se colocar o metodo que retorna o valor, sem o get.
Por exemplo, para mostrar o comboStatus, na sua classe tem o metodo getComboStatus(), você deve colocar apenas ${combo.comboStatus}.

W

Só uma dúvida/observação, você colocou a sua combo no request?

brunopalaoro, corrija-me se eu estiver errado, mas a forma correta de acessar a combo nao seria essa?

&lt;c&#58;forEach items=&quot;$&#123;param.comboStatus&#125;&quot; var=&quot;status&quot;&gt; &lt;option value=&quot;$&#123;status.?&#125;&quot;&gt;$&#123;status.?&#125;&lt;/option&gt; &lt;/c&#58;forEach&gt;

Talvez seja por isso q nao está funcionando.

B

Se voce utilizao ${param.combo}, será como fazer request.getParameter(), não colocando nada na frente, ele pega o atributo através de request.getAttribute().
Como ele usou o servlet para carregar o combo, só pode ter setado um atributo, pois parametros são os campos de um html.

F

Fiz o carregamento das mesmas usando o pattern Helper em conjunto com DAO e DTO para atender a outras necessidades.

Criado 8 de julho de 2005
Ultima resposta 18 de jul. de 2005
Respostas 15
Participantes 4