Problema com SUBMIT no Struts2 - campos perdidos

Bom dia senhores, estou tentando usar o struts2 mas to tendo problemas com ele. Um dos problemas é que quando submeto o formulário os dados não são recuperados na action, estão vindo nulos. Não sei o pq desse erro. Minha idéia é o seguinte:

1 ? Submeter um arquivo Excel para upload. Quando submetido, listar todas as planilhas dele.
2 ? Quando clicar no link ou botão referente a planilha, será mostrado o conteúdo da planilha selecionada.

No passo 2, quando clico no botão ou link, no action meus atributos estão nulos. Como faço para manter eles no formulário?

Segue trechos de código:

struts.config

<package name="defaut" namespace="/" extends="struts-default" >
		<interceptors>
	    	<interceptor name="pontoOnLineUploadInterceptor" class="action.PontoOnLineUploadInterceptor"/>
		</interceptors>
    
    
        <action name="*ImportacaoPonto" class="action.ImportacaoPontoOnLineAction" method="{1}">
        	<interceptor-ref name="pontoOnLineUploadInterceptor"/>
            
            <result name="show">/jsp/importarPonto.jsp</result>
            
            <result name="success">/teste.jsp</result>
        </action>
        
       
    </package>

JSP


<script language="JavaScript" type="text/JavaScript">
				
		function setTabela(nomeTabela){
			var form = document.getElementById("importacaoPontoOnLineForm");
			
			form.nomePlanilhaSelecionada.value = nomeTabela;
		}
	</script>

<s:form action="/ImportacaoPonto" id="importacaoPontoOnLineForm" theme="simple" method="POST" enctype="multipart/form-data">
		<s:textfield name="nomePlanilhaSelecionada"></s:textfield>
		<s:textfield name="nomesPlanilhas"></s:textfield>
		<s:bean name="dominio.ArquivoImportado" var="arquivoImportado"></s:bean>
		
	 	<div>
			Importar: &nbsp;<s:file name="arquivo" size="100%" label="Importar" ></s:file> 
			 &nbsp; <s:submit action="uploadImportacaoPonto" value="Importar" id="btImportar" ></s:submit>
	 	</div>
	 	
	 	<div>
	 		<s:if test="%{nomesPlanilhas != null}">
	 			<table width="100%">
					<tr valign="top">
			 			<s:iterator var="nomePlanilha" value="nomesPlanilhas">
			 				<td align="center">
			 					<s:url id="url" action="visualizarImportacaoPonto">
			 						<s:param name="nomePlanilha"> <s:property /> </s:param>  
			 					</s:url>
			 					
			 					<s:a href="%{url}" > <s:property /> &nbsp;</s:a>
			 					
			 					<s:submit action="visualizarImportacaoPonto" value="%{nomePlanilha}" id="btVisualisar_%{nomePlanilha}" onclick="setTabela('%{nomePlanilha}');"></s:submit>
			 				</td>
			 			</s:iterator>
	 				</tr>
	 			</table>
	 		</s:if>
	 	</div>

	</s:form>

public class ImportacaoPontoOnLineAction extends PontoOnLineAction implements PontoOnLineUploadInterface{

	private File arquivo;//arquivo temporario
	private String nomeArquivo; //The uploaded file name
	private ArquivoImportado arquivoImportado;
	private List<String> nomesPlanilhas = new ArrayList<String>();
	private String nomePlanilhaSelecionada;
	private List<LinhaArquivoImportado> linhasPlanilha = new ArrayList<LinhaArquivoImportado>();

	public String show() throws Exception {
		return "show";
	}

	public String upload() throws Exception {
		try {
			if(!super.hasErrors()){
				if(!Util.isNulloOuVazio(arquivo)){
					String strDiretorioUpload = servicoGerenciadorPonto.getDiretorioUpload();

					//o Nome do arquivo foi setado pelo interceptor
					File arquivoUpload = new File(strDiretorioUpload + this.getNomeArquivo());
					File diretorioUpload = new File(strDiretorioUpload);

					if(!diretorioUpload.exists()){
						diretorioUpload.mkdirs();
					}

					if(!arquivoUpload.exists()){
						arquivoUpload.createNewFile();
					}
					FileUtils.copyFile(arquivo, arquivoUpload);
					
					arquivo.delete();

					arquivoImportado = new ArquivoImportado(arquivoUpload);
					
					nomesPlanilhas = Arrays.asList(arquivoImportado.getNomePlanilhas());
					
					super.addActionMessage("sucesso upload");
				}
			}
		} catch (Exception e) {
			super.addActionError(e.getMessage());

		}finally{
			
		}

		return "show";
	}
	
	public String visualizar() throws Exception {
		try {
			if(!Util.isNulloOuVazio(nomesPlanilhas) 
					&& !Util.isNulloOuVazio(nomePlanilhaSelecionada) ){
				
				HSSFSheet planilha = arquivoImportado.getPlanilha(nomePlanilhaSelecionada);
				
				linhasPlanilha = arquivoImportado.getLinhasPlanilha(planilha, true);
				
				super.addActionMessage("sucesso visualizando planilha");
			}else{
				super.addActionMessage("ERRO visualizando planilha");
			}
		} catch (Exception e) {
			super.addActionError(e.getMessage());
		}finally{
			
		}

		return "show";
	}


}

Olá.

Amigo, antes uma dica: procure estudar os mapeamentos via CoC do Struts2 que dispensam o uso de XML e até mesmo de anotações. Em todo caso usar anotações para mapeamentos é muito melhor do que XMLs (na minha opinião).

Bem, agora quanto à seus campos ficarem “null”, é simples: Faltaram os getters e setters dos campos na Actions :wink:

[quote=jyoshiriro]Olá.

Amigo, antes uma dica: procure estudar os mapeamentos via CoC do Struts2 que dispensam o uso de XML e até mesmo de anotações. Em todo caso usar anotações para mapeamentos é muito melhor do que XMLs (na minha opinião).

Bem, agora quanto à seus campos ficarem “null”, é simples: Faltaram os getters e setters dos campos na Actions ;)[/quote]

OI jyoshiriro,

não entendi a sua dica, vou procurar saber o que é esse tal CoC mas de cara adianto que meus dados não vão ser persistidos em banco de dados, serão impressos na tela e no máximo gerado um XML com uma estrutura pre-definida.

Quanto aos get/set, eles existem, só não coloquei ai pra não ficar muito grande. Teria outra sugestão?

Reparei também que você criou e usou um interceptor, o “pontoOnLineUploadInterceptor”.
Não se esqueça que, para que seus getters e setters sejam usados, sua action deve passar pelo “basicStack” ou pelo 'defaultStack" do Struts2.
Assim você deve criar um pilha de interceptors que use um desses 2 mais o seu.

Coc -> Convenção sobre Configuração. Assim a própria organização das pastas e nomes de classes e arquivos é sua configuração, sem XML nem anotação.

[quote=jyoshiriro]Reparei também que você criou e usou um interceptor, o “pontoOnLineUploadInterceptor”.
Não se esqueça que, para que seus getters e setters sejam usados, sua action deve passar pelo “basicStack” ou pelo 'defaultStack" do Struts2.
Assim você deve criar um pilha de interceptors que use um desses 2 mais o seu.

Coc -> Convenção sobre Configuração. Assim a própria organização das pastas e nomes de classes e arquivos é sua configuração, sem XML nem anotação.[/quote]

Cara, poderias me ajudar nessa parte do “basicStack” ou pelo 'defaultStack". Não sei como fazer isso, qual a possível correção?

Kuroki

Após a tag …

<interceptor-stack name="submissao"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="pontoOnLineUploadInterceptor"/> </interceptor-stack>
Dai, no mapeamento da action

<interceptor-ref name="submissao"/> 

Po velhão, valeu pela dica!!

Não tenho como testar aqui nesse momento, so em casa.
Amanhã digo se era apenas isso mesmo!

Mas pelo que entendi, sempre que usar um Interceptor teria que criar esse stack pois é ele o responsável por manter os atributos no formulário, confere?

Se não tivesse usado um Interceptor, os dados seria mantidos pois por padrão já é implementado esse stack?

Valeu pela ajuda, amanhã confirmo se falta mais alguma coisa.

Kuroki

Ocorre que, como seu package estendeu “struts-default”, o interceptor padrão passou a ser “defaultStack”.
Só que você pediu que usa action usasse outro, o que você criou.
Assim, para usar um interceptor seu mas manter as funcionalidades do Struts2, deve criar uma pilha e usá-la, como eu demonstrei.

Abraços.