Validation por botões no form

13 respostas
F

oi pessoal… é meu primeiro tópico aqui no GUJ…heeeh…
bom ae vai minha dúvida… tenho um form com 4 botões e a validação para cada botão é diferente, tem como eu fazer essa separação usando a validação do struts validator? eu consegui fazer a validação no validation.xml mas foi genérico, a mesma validação para todos os botões, tem como separar? se tiver, com faz?
abraços…

13 Respostas

J

Você pode fazer validações por action.

Defina seu form como um org.apache.struts.validator.DynaValidatorActionForm e lá no validation.xml utilize as actions para validar os campos:

<form name="/inserirTelefone">
<field property="numeroFone" depends="required">
<arg0 key="Telefone" resource="false"/>
</field>
</form>

No caso acima a action inserirTelefone estaria atrelada ao onClick() de um botão. Para os outros botões seria só criar outras actions.

F

hum… mas no meu caso o formulário todo é enviado pra um único action, e nesse action, dependendo do botão que foi apertado é direcioando para um método específico dentro do action.
Teria alguma saída?

J

Acho melhor você criar um método para cada botão dentro da sua classe de action, exemplo:

public ActionForward inserirDados(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {                             

...

}

public ActionForward editarDados(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {                             

...

}

public ActionForward consultarDados(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {                             

...

}

public ActionForward excluirDados(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {                             

...

}

public ActionForward atualizarDados(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {                             

...

}

E você teria no arquivo de validation.xml:

<form name="/inserirDados">
<field property="codPessoa" depends="required">
<arg0 key="Código" resource="false" />
</field>
</form>

E lá no arquivo config.xml teria

Um form com dados para inserir, atualizar e excluir:

<form-bean name="DadosInserirForm" type="org.apache.struts.validator.DynaValidatorActionForm" dynamic="true">
<form-property name="codPessoa" type="java.lang.String" />
<form-property name="nomPessoa" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
</form-bean>

Um form com dados para consultar:

<form-bean name="DadosConsultarForm" type="org.apache.struts.validator.DynaValidatorActionForm" dynamic="true">
<form-property name="codPessoa" type="java.lang.String" />
<form-property name="nomPessoa" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
</form-bean>

As definições das actions que serão chamadas no submit:

<action name="DadosInserirForm" path="/inserirDados" parameter="dscAcao" type="br.com.sistema.controller.actions.empresa.DadosActions" input="v" scope="session">
<forward name="sucesso" path="/htdocs/programas/empresa/tela.jsp" contextRelative="true" />
<forward name="falha" path="/htdocs/programas/empresa/tela.jsp" contextRelative="true" />
</action>

<action name="DadosInserirForm" path="/consultarDados" parameter="dscAcao" type="br.com.sistema.controller.actions.empresa.DadosActions" input="consultarDados" scope="session">
<forward name="sucesso" path="/htdocs/programas/empresa/tela.jsp" contextRelative="true" />
<forward name="falha" path="/htdocs/programas/empresa/tela.jsp" contextRelative="true" />
</action>

<action name="DadosInserirForm" path="/excluirDados" parameter="dscAcao" type="br.com.sistema.controller.actions.empresa.DadosActions" input="excluirDados" scope="session">
<forward name="sucesso" path="/htdocs/programas/empresa/tela.jsp" contextRelative="true" />
<forward name="falha" path="/htdocs/programas/empresa/tela.jsp" contextRelative="true" />
</action>

Então, ao submeter uma action inserirDados o validation intercepta essa action e valida os campos definidos lá no validation dessa action e assim por diante.

Não sei se pude me expressar claramente, mas se você conhece struts acho que vai entender.

foxpv

acho q você está pensando que é um formulário para cada action, então eu chamaria o método específico do botão no action. não é? mas o form html é apenas um que contém vários botões, como eu escolheria qual função chamar no action do form html?

J

Sim, eu sei que você só tem um form.

Você notou que lá na definição das actions, está:

<action name="DadosInserirForm" path="/excluirDados" parameter="dscAcao" type="br.com.sistema.controller.actions.empresa.DadosActions" input="excluirDados" scope="session">

Ou seja, a action /excluirDados está associada ao form DadosInserirForm e os métodos dentro da classe br.com.sistema.controller.actions.empresa.DadosActions serão chamados conforme valor do parameter dscAcao.

Então, lá no seu form struts (dentro do JSP) você deverá ter um campo hidden chamado dscAcao e esse campo, antes do submit, deverá receber o nome do método a ser executado.

Ao clicar no botão , por exemplo, o campo dscAcao receberá atualizarDados e assim por diante para cada ação do botão.

foxpv

aa sim… agora entendi kra…
outra duvida… eu n poderia ter apenas um form n? jah q o formulario é o mesmo para todos os botões…

J

Sim, pode ter, sem problemas.

No exemplo que lhe passei eu coloquei dois forms, um pra consultar/resultado da consulta e o outro para as operações de inserir/atualizar/editar/excluir por que a quantidade de informação exibida é bem diferente e o propósito também, mas nada impede que você mantenha tudo num só.

Basta, ao submeter, indicar a sua ação (dscAcao) e trocar a action do form.

foxpv

sim…blz… jah estou implementando aqui…
mas tenho outra dúvida… qdo eu submeter o form… oq q eu vou passar no atributo action do form?? jah q ele é obrigatório n eh?
tenhoq setar ele também com o nome do método igual o hidden neh?

foxpv

kra… consegui fazer o formulario blz…
mas tah dando erro… falando q n pode achar o action wiew/Insere por exemplo… ele está procurando pelo Action insere, e não pelo método Insere dentro do action q foi definido no type lah no struts-config. sendo q eu setei o type lah apontando pro action, e o path e o name o nome do método… e também o parameter está setado pro meu hidden…

J

Você colocou todos os campos no form?
Inclusive o dscAcao ??
Não se esquecça que os nomes aqui deverão ser os mesmo lá na tag do jsp.

Exemplo no JSP:

<html:hidden property="dscAcao" value="excluirDados" />

Exemplo no struts-config.xml:

<form-bean name="DadosInserirForm" type="org.apache.struts.validator.DynaValidatorActionForm" dynamic="true">
<form-property name="codPessoa" type="java.lang.String" />
<form-property name="nomPessoa" type="java.lang.String" />
<form-property name="dscAcao" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
<form-property name="bla" type="java.lang.String" />
</form-bean>

Verifique o nome de todas as actions. Faça uma ação de cada vez.

foxpv

kra, no parameter eu coloquei o nome do método direto e deu certo… no parameter do button eu tb coloquei o nome do método… ae funcionou… tipo…eu usei um javaScript pra setar o action do form para o respectivo action relacionado ao botão…
mas agora um outro problema…
o validation naum funcionou passando o path do action… tipo…

<form name="/inserir">

ele passa direto sem fazer a validação…
obrigado pela antenção você esta me ajudando pra kramba…

J

Confirme lá no arquivo struts-config se o tipo do form é
org.apache.struts.validator.DynaValidatorActionForm.

Tem que ser algo assim:

<form-bean name="DadosInserirForm" type="org.apache.struts.validator.DynaValidatorActionForm" dynamic="true">
foxpv

julianostr…
mto obrigado pela ajuda… consegui esolver meu problema aqui!!
PROBLEMA RESOLVIDO…
agora um dúvida… n eh bem a respeito do assunto n… mas acho q vc poderá me responder sem eu ter q abrir outro tópico…
tem alguma função java/taglib q retorne o endereço do servidor? pra eu n ter q correr riscos colocando o endereço tipo… http://localhost:8080/
vai q o endereço do servidor mude neh…obrigado…

Criado 20 de abril de 2006
Ultima resposta 26 de abr. de 2006
Respostas 13
Participantes 3