Já que é bem nexessário, também utilizo captcha em minhas aplicações, mas gostaria que o formulário de cadastro fosse em tags JSF, o que facilitaria no tratamento e validações de campos.
Mas tô com problemas: o botão de submit sumiu:
<h:form id="form1">
<table>
<tr>
<td align="right">Pagamento:</td>
<td>
<!-- o div contendo nosso conteúdo a ser mostrado //-->
<script src="../../js/forms.js"></script>
<input type="radio" name="formaPgto" value="boleto" checked>Boleto
<input type="radio" name="formaPgto" value="cartao">Cartão
<input type="radio" name="formaPgto" value="deposito">Depósito
<input type="radio" name="formaPgto" value="transferencia">Transferência
</td>
</tr>
<tr>
<td></td>
<td> </td>
</tr>
<tr style="color:#000;">
<td align="right">Código:</td>
<td><small>* Digite corretamente o código de segurança</small></td>
</tr>
<tr style="color:#000;">
<td></td>
<td><img src="../../Kaptcha.jpg" alt="security image" title="security image" onclick="this.src='../../Kaptcha.jpg'"/></td>
</tr>
<tr>
<td></td>
<td>
<h:inputText id="kaptchafield" maxlength="5" autocomplete="off" value="#{LoginBean.kaptcha}" required="true">
<f:validateLength maximum="5" minimum="5"/>
</h:inputText>
</td>
</tr>
<tr>
<td></td>
<td><h:message for="kaptchafield" style="color:red;"/></td>
</tr>
<tr>
<td></td>
<td> </td>
</tr>
<tr>
<td></td>
<td><h:commandButton action="#{LoginBean.CheckCadastro}" image="images/button-acessar.gif" value=""/></td>
</tr>
<tr>
<td></td>
<td> </td>
</tr>
</table>
</h:form>
Eu defini no managed-bean certinho o LoginBean.CheckCadastro, mas tentei fazer com que voltasse pra mesma página se houvesse erro em validações de e-mail, ou captcha mas daí o botão de submit sumiu.
A prova:
[img]http://img34.imageshack.us/img34/6897/cadastrojsfcaptcha.gif[/img]
Isso aconteceu após mapear a classe faces-config
Meu faces-config:<managed-bean>
<managed-bean-name>LoginBean</managed-bean-name>
<managed-bean-class>cadastro.LoginBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/themes/red/cadastro.do</from-view-id>
<navigation-case>
<from-action>#{LoginBean.CheckCadastro}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>loginsuccess.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{LoginBean.CheckCadastro}</from-action>
<from-outcome>fail</from-outcome>
<to-view-id>/themes/red/cadastro.do</to-view-id>
</navigation-case>
</navigation-rule>
Como só definir um valor pra captcha (é porque decidir testar antes de executar), então só tem getter e setter , variavel kaptcha mesmo.:
package cadastro;
import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
/**
*
* @author FF Criações
*/
public class LoginBean {
String kaptcha;
public LoginBean() {
}
public String getLoginid() {
return kaptcha;
}
public void setLoginid(String kaptcha) {
this.kaptcha = kaptcha;
}
public String CheckCadastro() throws IOException {
//******************************************//
// capturando parâmetro do Captcha //
//*******************************************//
// String c = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
// String parm = (String) request.getParameter("kaptchafield");
String c = (String)FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
String parm = (String)FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("kaptchafield");
//out.println("<p>Código: " + parm + " ? Session Key: " + c + " : ");
if (c != null && parm != null) {
if (!c.equals(parm)) { // se o valor digitado for diferente do captcha
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put("Erro", "Digite o código corretamente!");
FacesContext faces = FacesContext.getCurrentInstance();
ExternalContext context = faces.getExternalContext();
context.redirect("/themes/red/cadastro.do");
return "fail";
} else {
return "sucess";
}
}// fim da validação captcha
return "success";
}
}
Sei que estou fazendo muita coisa errada, mas não quero desistir, pois já realizei cadastros antes, mas era pegando os strings com UI e não quero usar isso pq imagina se eu for pegar de todo o formulário que mostrei Oo . Seria muito código.
E então gente, o que está errado? Eu setei o método CheckCadastro lá no botão, mas pq ele sumiu?
Não entendo.
Isso já aconteceu antes aqui comigo, mas era nos textfields, e tb acho que era configuração errada no faces-config.
Fica aí minha dúvida. Nunca consegui resolver, já procurei a documentação, exemplos que não utilizam UI Component eu não encontrei para tirar dúvida, então peço ajuda aqui.
Grato.