Criar um master detalhe - struts

5 respostas
B

Pessoal estou precisando criar um formulário do tipo master detalhe, onde o usuário insere os dados do formulário mestre e depois em uma tabela vai preenchendo o formulário detalhe.

A classe Master.
public class Materia {
    
    private int cdmateria;
    private int cdcurso;
    private String descricao;
    private Conteudo[] conteudo;
//get e sets associados
}

A classe Detalhe

public class Conteudo {    
    private int cdconteudo;
    private String item;
    private String dsitem;
//get e sets associados
}

Bem, o que gostaria é montar um formulário que o usuário informe os dados da matéria, e em uma tabela abaixo ele possa adicionar n conteúdos a essa matéria. Nesta tabela deveria conter um campo para o item e outro para a dsitem. So que nao sei como faço para passar esses dados para o meu VO acima, inserirndo os dados do conteúdo no vetor de conteúdos da classe Matéria. Andei pesquisando e achei um artigo falando que era possível fazer isso com tiles, ms o artigo nao ensian com fazer.

Se alguem tiver alguma ideia de como montar da forma que falei , ou de alguma outra forma... Estou completamente perdido.

Valeu...

5 Respostas

Guerr

Eu já enferntei este problema algumas vezes e o Struts não ajuda nada em fazer o binding de um array. Todas as vezes que eu fiz com o Struts eu precisei recuperar os parâmetros na mão e inserir no objeto de domínio.

Quando eu comecei a usar o webwork eu consegui criar um interceptor que fazia isto para mim, mas com o struts é bem mais difícil (a não ser que seja o Struts 2 que copiou isto do webwork…).

B

Guerr@:
Eu já enferntei este problema algumas vezes e o Struts não ajuda nada em fazer o binding de um array. Todas as vezes que eu fiz com o Struts eu precisei recuperar os parâmetros na mão e inserir no objeto de domínio.

Quando eu comecei a usar o webwork eu consegui criar um interceptor que fazia isto para mim, mas com o struts é bem mais difícil (a não ser que seja o Struts 2 que copiou isto do webwork…).

O problema é que tenho q fazer com o struts, como vc faz para recuperar os parametros na mao?

Guerr

Consiga uma referência do request e pegue vários parâmetros com o mesmo nome usando o método getParameterValues().

Se na tabela você possui três campos chamados “nome”, usando getParameterValues() você vai recuperar um array com os três.

B

Guerr@:
Consiga uma referência do request e pegue vários parâmetros com o mesmo nome usando o método getParameterValues().

Se na tabela você possui três campos chamados “nome”, usando getParameterValues() você vai recuperar um array com os três.

Valeu cara, consegui, deu um pouquinho de trabalho como vc falou, mas deu pra fazer.

Guerr

Segue o interceptor do WebWork que eu fiz para fazer isto de forma automatizada:

package com.arquitetura.webwork.interceptor;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.arquitetura.util.BeanUtils;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.AroundInterceptor;

public class ListInterceptor extends AroundInterceptor {

	
	@Override
	protected void after(ActionInvocation arg0, String arg1) throws Exception {
	}

	@Override
	protected void before(ActionInvocation inv) throws Exception {
		
		if(!"save".equals(inv.getProxy().getMethod()))
			return;
		
		Map<String,String> allParams = inv.getProxy().getConfig().getParams();
	
        for(String param : allParams.keySet()) {
        	if(param.endsWith(".classname")){
        		Class classe = Class.forName(allParams.get(param));  
        		String parameterName = param.replaceFirst(".classname","");
        		Set<String> parameters =  getParamsStartedWith(inv, parameterName);
        		ArrayList list = new ArrayList();
        		for(String parameter : parameters){
        			String[] parameterValues = ServletActionContext.getRequest().getParameterValues(parameter);
        			for(int i=0; i<parameterValues.length; i++){
        				if(list.size() == i){
        					list.add(classe.newInstance());
        				}
        				String prop = parameter.replaceFirst(parameterName+".","");
        				BeanUtils.setProperty(list.get(i),prop,parameterValues[i]);
        			}
        		}
        		Set retorno = new HashSet();
        		retorno.addAll(list);
        		BeanUtils.setProperty(inv.getAction(),parameterName,retorno);
        	}
        }

	}
	
	private Set><String> getParamsStartedWith(ActionInvocation inv, String start){
		Set<String> paramsName = new HashSet<String>();
		Enumeration allParams = ServletActionContext.getRequest().getParameterNames();
		while (allParams.hasMoreElements()) {
            String input = (String) allParams.nextElement();
            if (input.startsWith(start)) {
            	paramsName.add(input);
            }
        }
		return paramsName;
	}

}

Depois você precisari passar como parâmetro para a action a classe e a propriedade:

<param name="domain.comentarios.classname">com.arquitetura.domain.Comentario</param>

Sendo domain.comentarios a propriedade com a lista e com.arquitetura.domain.Comentario a classe com os beans da lista.

Criado 9 de dezembro de 2006
Ultima resposta 13 de dez. de 2006
Respostas 5
Participantes 2