Assunto: Struts <html:multbox> com BD - [RESOLVIDO]

Salve Pessoal,

Estou com um problema em uma aplicação Web/Struts. Eu preciso em uma página apresentar alguns checkboxes que representam o fato de uma coluna em uma tabela estar definida para true ou false.

Estou usando o tag <html:multibox> para isso. Está “quase tudo funcionando”… Se eu seleciono o checkbox na página eu consigo salvar este estado no bd. O problema é que não consigo de modo algum apresentar o checkbox checked se a coluna na tabela estiver definida como true. Será que alguem já teve este problema? Já garimpei na net mas não acehi nada que resolvesse meu problema… Se alguem puder ajudar eu agradeceria. Abaixo mando o codigo da página jsp, das actions, dos forms e a tabela.

Estou usando o hibenate e o struts 1.2.8.

Tabela Questionarios:

CREATE TABLE questionarios
(
  idquestionario int4 NOT NULL DEFAULT nextval('questionarios_idquestionario_seq'::regclass), -- Identificador do question•rio.
  idcursos int4 NOT NULL, -- Identificador do curso ao qual o question•rio se refere.
  semestre int2 NOT NULL, -- Semestre a que se refere o question•rio.
  ano int4 NOT NULL, -- Ano a que se refere o question•rio.
  disponibilidade bool NOT NULL, -- Indica se o question•rio est• disponŸvel para ser respondido ou n—o.
  CONSTRAINT questionarios_pk PRIMARY KEY (idquestionario),
  CONSTRAINT fk_questidcursos FOREIGN KEY (idcursos)
      REFERENCES cursos (idcursos) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
) 
WITHOUT OIDS;
ALTER TABLE questionarios OWNER TO postgres;

Parte da página JSP onde o tag é usado:

				&lt;c:forEach var="quest" items="${questionarios}" varStatus="stat"&gt;
					&lt;tr class="${(stat.index % 2) == 0 ? "evenRow" : "oddRow"}"&gt;
						&lt;td align="center" width="100"&gt;
							&lt;html:multibox property="selectedItems"&gt;
								${quest.idquestionario}
							&lt;/html:multibox&gt;
						&lt;/td&gt;
                    	&lt;td align="center" width="100"&gt;&lt;c:out value="${quest.semestre}" /&gt;&lt;/td&gt;
                    	&lt;td align="center" width="70"&gt;&lt;c:out value="${quest.ano}" /&gt;&lt;/td&gt;
					&lt;/tr&gt;
				&lt;/c:forEach&gt;

Action que é chamada antes do processamento ser encaminhado a página JSP que usa o tag (parte do código)

		// Constrói um objeto de serviço questionario
		QuestionariosService serviceQ = new QuestionariosService();
		// Constrói um vetor (com informações de questionários) para o formulário
		Collection quests = (Vector) serviceQ.makeQuestionariosList(curso);
		
		// Constrói a lista com os questionários que estão disponibilizados
		String selectedItems [] = serviceQ.makeSelectedItems();
		
		for (int i = 0; i &lt; selectedItems.length; i++)	// apresenta as tuplas com disponibilidade = true
			System.out.println(&quot;Id Questionário disponível = &quot; + selectedItems[i]);
		
		QuestForm questForm = new QuestForm();
		questForm.setSelectedItems(selectedItems);
		
		request.setAttribute(&quot;questionarios&quot;, quests);

		// Encaminha o processamento
		return mapping.findForward(FORWARD_disponibilizaQ);

Método da Action que é chamado para tratamento da página JSP. Aqui eu consigo recuperar o estado dos checkboxes e salvá-los no BD.

	public ActionForward finalize(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// Apresenta os parâmetros que chegaram ao método
		java.util.Enumeration nomes = request.getParameterNames();
		while(nomes.hasMoreElements())
			System.out.println(&quot;nomeP = &quot; + nomes.nextElement());
		
		// Salva mensagem no log
		logger.debug(&quot;Entrou no finalize do QuestionarioAction&quot;);
		
		// Recupera o formulário
		QuestForm questForm = (QuestForm) form;
		
		// Cria uma sessão e recupera o curso da sessão
		HttpSession session = request.getSession();
		Cursos curso = (Cursos) session.getAttribute(&quot;curso&quot;);
		System.out.println(&quot;Curso: &quot; + curso.getNome());
		
		// Recupera os id dos questionários que se pretende disponibilizar
		String disponibiliza [] = questForm.getSelectedItems();
		
		// Cria o DTO (Pojo) para manipulação dos dados
		Questionarios quest;

		// Constrói um objeto de serviço questionario
		QuestionariosService serviceQ = new QuestionariosService();
		
		// Altera no BD o estado de cada um dos questionarios selecionados
		if (disponibiliza != null) {
			for (int i = 0; i &lt; disponibiliza.length; i++) {
				System.out.println(&quot;Disponibiliza id = &quot; + disponibiliza[i]);
				quest = serviceQ.getQuestionario(disponibiliza[i]);
				quest.setDisponibilidade(!quest.getDisponibilidade());
				serviceQ.updateQuestionario(quest);
			}
		}		

		return mapping.findForward(GLOBAL_FORWARD_start);
	}

O ActionForm:

public class QuestForm extends org.apache.struts.action.ActionForm {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String idquestionario;
	private String ano;
	private String semestre;
	private Cursos idcursos;
	private boolean disponibilidade;
	private String selectedItems [];
        
        // Métodos get e set não apresentados

Salve Pessoal,

Depois de quebrar a cabeça boa parte do sábado consegui resolver. Em parte pelas informações daqui: http://www-128.ibm.com/developerworks/java/library/j-sr3.html.

O que eu fiz foi o seguinte: na ction, antes de chamar a página JSP, além de criar o FormBean e chamar o setSelectedItems para salvar as opções selecionadas no form eu salvei o form na requisição. O código ficou assim:

	public ActionForward disponibilizaQ(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println(&quot;A opção Disponibilizar Questionário foi escolhida&quot;);
		logger.debug(&quot;A opção Disponibilizar Questionário foi escolhida&quot;);
		
		// Cria uma sessão e armazena o curso nela
		HttpSession session = request.getSession();
		session.setAttribute(&quot;curso&quot;, curso);

		// Armazena o titulo na requisição
		titulo = &quot;Curso de &quot; + curso.getNome() + &quot; - Disponibilizar Questionário&quot;;
		request.setAttribute(&quot;titulo&quot;, titulo);
		System.out.println(&quot;Título: &quot; + titulo);
		
		// Constrói um objeto de serviço questionario
		QuestionariosService serviceQ = new QuestionariosService();
		// Constrói um vetor (com informações de questionários) para o formulário
		Collection quests = (Vector) serviceQ.makeQuestionariosList(curso);
		
		// Constrói a lista com os questionários que estão disponibilizados
		String selectedItems [] = serviceQ.makeSelectedItems();
		for (int i = 0; i &lt; selectedItems.length; i++)
			System.out.println(&quot;MenuAction - ID dos questionários selecionados antes da submissão = &quot; + selectedItems[i]);
		session.setAttribute(&quot;selectedItems&quot;, selectedItems);
		
		for (int i = 0; i &lt; selectedItems.length; i++)	// apresenta as tuplas com disponibilidade = true
			System.out.println(&quot;Id Questionário disponível = &quot; + selectedItems[i]);
		
		QuestForm questForm = new QuestForm();
		questForm.setSelectedItems(selectedItems);
		
		request.setAttribute(&quot;questionarios&quot;, quests);
		request.setAttribute(&quot;questForm&quot;, questForm);
		
		// Encaminha o processamento
		return mapping.findForward(FORWARD_disponibilizaQ);
	}

Depois na página JSP foi necessário colocar um atributo name na tag. Ficou assim a parte de apresentação:

&lt;c:forEach var="quest" items="${questionarios}" varStatus="stat"&gt; &lt;tr class="${(stat.index % 2) == 0 ? "evenRow" : "oddRow"}"&gt; &lt;td align="center" width="100"&gt; &lt;html:multibox property="selectedItems" name="questForm"&gt; ${quest.idquestionario} &lt;/html:multibox&gt; &lt;/td&gt; &lt;td align="center" width="100"&gt;&lt;c:out value="${quest.semestre}" /&gt;&lt;/td&gt; &lt;td align="center" width="70"&gt;&lt;c:out value="${quest.ano}" /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/c:forEach&gt;

Agora sim, cada um dos checkbox aparece setado se o atributo correspondente estiver como true no BD.

celso