[RESOLVIDO] Problema com struts + select

Boa tarde,

Estou com o seguinte problema:

Estou usando o struts pela primeira vez. Tenho uma 2 classes:

public class Militar implements Serializable {

private Long id;
private String posto;
private String nome;
private String setor;	
private Set ausencias;


}

public class Ausencia implements Serializable {

private Long id;	 
private Militar militar;	
private Date saida;
private Date retorno;
private String destino;


}

Tenho um formulario onde no combobox eu coloco os militares que seja selecionado o que ficará ausente. Como eu faço, no combobox, para que no struts ele entenda q é um objeto militar? Não sei se tem como. Do jeito que eu coloquei está dando o seguinte erro: javax.servlet.ServletException: BeanUtils.populate

Código do select:

<html:select property=“ausencia.militar”>
<c:forEach var=“militar” items="${listaMilitares}">
<html:option value="${militar.id}">${militar.posto} ${militar.nome}</html:option>
</c:forEach>
</html:select>

Desde já agradeço a ajuda.

Caroline.

Olá, Carol.
Você está preenchendo corretamente o combo, é isso mesmo. Assim, o id do militar é que vai ser preenchido no campo quando o usuário selecioná-lo. E é este id que voce vai recuperar no struts através do seu form bean. Você deve possuir um form bean com um campo para armazena o id do militar (que é o que o usuário seleciona no combo). Em seguida, quando a Action do struts for chamada, você vai capturar o ID do militar, e não o OBJETO militar. Através do ID você carrega (através do Hibernate ou SQL mesmo) o objeto militar que possui este ID.
Ainda com relação ao erro, poste o erro completo.

Você entendeu o que lhe disse aqui ?

Abraço.

Olá…

o jeito mais simples de vc popular uma combo box eh o seguinte…

no action q precede a pagina vc coloca:

  <action
   path="/formulario1"
        type="com.opcoesUploadAction"
        validate="true"
		scope="request">
        <forward name="success" path="/WEB-INF/jsp/formulario1.jsp" />
    </action>

nessa classe “com.opcoesUploadAction” vc popula com o objeto q vc quizer… na verdade fazendo uma lista… observe:

            java.util.List cidade = new Vector();
	cidade.add(new cidade("São Paulo", "1"));
	cidade.add(new cidade("Rio de Janeiro", "2"));
	cidade.add(new cidade("Rancharia", "3"));
	cidade.add(new cidade("Marilia", "4"));

	request.setAttribute("cidadeItems", cidade);

no jsp (q no casso eh a pagina /WEB-INF/jsp/formulario1.jsp) vc coloca assim.

<%
java.util.List cidade = (java.util.List) request.getAttribute(“cidadeItems”);
pageContext.setAttribute(“cidadeItems”, cidade);
%>

<html:select property=“cidade”>
<html:options collection=“cidadeItems” property="valor"
labelProperty=“nome” />
</html:select>

sendo esse “cidade” do <html:select property=“cidade”>, referente ao atributo do bean q vc vai utilizar no form;

sendo esse “cidadeItems” do <html:options collection=“cidadeItems” property=“valor” labelProperty=“nome” />, referente ao nome da coleção (List) q vc declarou no inicio do JSP;

sendo esse “valor” do <html:options collection=“cidadeItems” property=“valor” labelProperty=“nome” />, referente ao valor do seu atributo do “valor” do setado no action, q ocupara o valor do seu select no html;

sendo esse “nome” do <html:options collection=“cidadeItems” property=“valor” labelProperty=“nome” />, referente ao valor do seu atributo do “nome” do setado no action, q ocupara nome de exibição em seu HTML;

tah meio confuso, mas se fizer uma força da pra intender…hehehe… eu acho… espero ter ajudado

[]'s

Caro, o preenchimento do Combo está certinho ! Não precisa mexer. Acredito que sua dúvida seja tratar o valor selecionado no combo, na sua Action do struts. Isso eu comentei acima.

Abraço.

É isso mesmo… a minha dúvida está sendo como tratar no Action. Eu vou seguir o que me disse e depois digo como foi ok?

Vlw!!!

Abraços,

Carol.

Luis,

Continuo com dúvida. Como o meu form coseguirá povoar o ausencia se no select eu só estou passando o id?

no meu form eu tenho o seguinte:

public class AdicionaAusenciaForm extends ActionForm {

private Ausencia ausencia = new Ausencia();

public Ausencia getAusencia() {
	return this.ausencia;
}


}

e na minha action tenho o seguinte:

public class AdicionaAusenciaAction extends Action{

public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
	
	AdicionaAusenciaForm formulario = ((AdicionaAusenciaForm) form);
	
	Ausencia ausencia = formulario.getAusencia();
	
	Session session = new HibernateUtility().getSession();
	Transaction t = session.beginTransaction();
	t.begin();
	
	new AusenciaDAO(session).adicionar(ausencia);
	
	t.commit();
	session.flush();
	session.close();
	
	formulario.reset(map, request);
	
	return map.findForward("ok");	
	
}

}

Onde eu faria isso?

Agradeço mais uma vez.

Abraços,

Carol.

Carol, faça da seguinte maneira:

  1. No seu FormBean, ao invés de ter um objeto Ausencia, tenha um atributo do tipo Int ou Long, que será o seu ausenciaId. No seu option que você cria no jsp, dê o mesmo nome do seu atributo - como você já deve fazer com os outros atributos. Desta maneira, o seu formBean irá receber o valor do option (id) que estiver selecionado.

  2. Na sua Action, você irá capturar do seu formBean, um ausenciaId, ou seja, ao invés de o método “getAusencia()” retornar um objeto ausencia, ele vai retornar um Int ou Long que é o Id selecionado. De posse de id então, você irá instanciar na sua action um novo objeto Ausencia - na verdade irá carregá-lo do banco - através do Id.

Não sei ficou um pouco confuso.
Se nao entender, é só dizer.
Mas resumindo, você vai apenas trocar o seu atributo Ausencia que é um objeto no seu formBean, por um tipo Int ou Long. E vai instanciá-lo ou carregá-lo do banco, usando para isso o id.

Qualquer dúvida posta ae.

Abraço.

Luis,

Obrigada pela ajuda… acho q é por aí mesmo… estou indo embora agora mas já fiz um teste aqui e funcionou… falta só alguns ajustes… Amanhã assim que terminar ou que precisar de alguma ajuda te perturbo um pouco ok?

Vlw mesmo… brigadão!!!

Abraços,

Carol.

Ok, Carol !
Precisando, estamos ae !

Abraços