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…
Validation por botões no form
13 Respostas
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.
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?
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.
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?
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.
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…
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.
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?
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…
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.
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…
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">
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…