Validação de Campos no form // Struts 2 - urgente!

INDEX.JSP

<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<s:head/>   
	<body>
		<div style="width: 300px;border-style: solid">
			<p>Projeto</p> 
			<s:form action="salvar">
			    <s:textfield id="id" name="projeto.id" cssStyle="display:none" required="true"/>
				<s:textfield id="nome" label="Nome" name="projeto.nome" required="true"/>
				<s:textfield id="data" label="Data" name="projeto.data" required="true"/>
				<s:textfield id="url" label="URL" name="projeto.url" required="true"/>
				<s:textfield id="linguagem" label="Linguagem" name="projeto.linguagem" required="true"/>								
				<s:submit/>
			</s:form>
		</div>
	</body>
</html>

STRUTS.XML


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
        "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts>
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.devMode" value="false" />
    <package name="projeto" extends="struts-default">
        <action name="listar" class="projetoAction" method="listar">
            <result>/jsp/listar.jsp</result>
        </action>

        <action name="remover" class="projetoAction" method="remover">
            <result type="redirect">listar.action</result>
        </action>

        <action name="salvar" class="projetoAction" method="salvar">
            <result type="redirect">listar</result>
            <result name="input">/jsp/index.jsp</result>                  
        </action>

        <action name="alterar" class="projetoAction" method="alterar">
            <result type="redirect">listar.action</result>
        </action>
    </package>
</struts>

ProjetoAction-salvar-validation.xml


<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
    <field name="projeto.nome">
        <field-validator type="required">
            <message>Campo Nome é obrigatório</message>
        </field-validator>
    </field>
    <field name="projeto.data">
        <field-validator type="required">
            <message>Campo Data é obrigatório</message>
        </field-validator>
    </field>
    <field name="projeto.url">
        <field-validator type="required">
            <message>Campo URL é obrigatório</message>
        </field-validator>
    </field>
</validators>

applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    <bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean id="projetoService" class="ProjetoServiceImpl" />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        
        
        <property name="jpaVendorAdapter">
            <bean
                class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="MYSQL" />
                <property name="showSql" value="true" />
            </bean>
        </property>
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/prototipo" />
        <property name="username" value="a" />
        <property name="password" value="b" />
    </bean>

    <bean id="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="projetoAction" scope="prototype"
        class="ProjetoAction">
        <constructor-arg ref="projetoService" />
    </bean>
</beans>

Ainda ocorre o mesmo erro de antes?

Sequer volta para a tela de formulario?

Ah, e seu JSP esta com um errinho bobo.

Deveria estar

[code]

....[/code]

Não, não volta !
Desisto.
Q inferno conseguir um Crudzinho em java…
Esses tutoriais nao func mesmo !

Vou tentar a ‘sorte’ amanhã.

até

(obrigada)

Ainda acho que o spring ta atrapalhando o meio de campo.

Tente mudar o mapeamento de “salvar” para ignorar o spring so para testar a validacao:

<action name="salvar" class="ProjetoAction" method="salvar"> <!-- ProjetoAction e nao projetoAction --> <result type="redirect">listar</result> <result name="input">/jsp/index.jsp</result> </action>

Veja o que acontece.

Outras dicas:

  • evite classe no pacote raiz
  • veja se sua action estende ActionSupport

Oi Yoshi,
-Não ha classe no pacote raiz e a Action implementa Preparable (Xwork).
-O ‘projetoAction’ (‘p’ minúsculo, vem da definição da applicationContext.xml)
Tentei seguir o tutorial:

http://struts.apache.org/2.0.14/docs/struts-2-spring-2-jpa-ajax.html

Achei que era algo certo…

:S

Amiga,

como te disse, esse tutorial é antigo e feito usando-se a família 2.0.x do Struts2.

Como disse, tente fazer o mapeamento ignorando o spring só para ver se a validação funciona, ok?

Não, não funciona.
Cai na mesma coisa, ele tenta inserir no banco e cai.
Desisto desse crud.
Obrigada !

Amiga, não desista assim.

Deve ser algum detalhe simples. Ja participei da criação de 3 aplicações bem grandes usando struts2 + hibernate que são bem mais que CRUDs.

Sua classe action estende Actionsupport ou apenas implementa Preparable? Deve estender o ActionSupport.

Verifique também se seu projeto tem todas as bibliotecas necessárias.

Pois é, Yoshi,
Um simples CRUD nao valida. Eu só não posso ficar dias numa coisa que não funciona, rs.
Já estou apelando para outtros aqui do trabalho, que não encontram o problema.

  1. Ele implementa Preparable (Como no tutorial)
  2. Ele insere no banco, mostra os inseridos, ele sõ não valida os campos do form.
  3. As libs estão ok !

obrigada.

Sim, sim, não vou entrar nessa questão,…
Mas mesmo assim poderia haver um CRUD na internet (velho ou não),
com validações do Struts2 funcionando, certo ?

Porque até outros colegas, que repassei a aplicação simples já desistiram.

Aqui no trabalho fica sempre a eterna briga do que é mais simples java .net…
Sinceramente, se eu nem consigo subir um CRUD java, tá difícil justificar.

Era essa minha missão…

Abordata

Amiga, não posso dizer se o erro é no tutorial ou em sua implementação sem ver todo seu projeto. O fato é que o struts2 é usado por milhares ou até milhões de usuários e se um CRUD com validação não funcionasse ele não teria cerca de 3mil downloads por mês (http://people.apache.org/~vgritsenko/stats/projects/struts#Monthly).

Quanto ao java x .Net todo desenvolvedor java honesto sabe que o .Net é mais produtivo, com certeza. A questão é o custo das licenças do visual studio/ windows server e a perfomence e escalabilidade de aplicações .Net.

Agora, se for pra comparar só produtividade, Grails e Rails são muito mais produtivos que .Net e com alta performance e escalabilidade.

Oi! Estou tentando desabilitar a validação do struts2,estou usando aversão 2.1.8.
Tenho meu form JSP que envia a requisição para o Servlet, e quando volta do servlet ele retorna msn de erro: Invalid field value for field.
Eu gostaria que neste meu metodo esta validação não fosse feita, pois estou somente limpando os get do form.
Não uso validador.xml do struts, faço minhas validações no form

public  class XXX extends ActionSupport implements Preparable

Help!

Amigo, para evitar validação, há duas opções:

  1. usar a anotação @SkipValidation sobre o método mapeado

  2. mapear essa ação passando por uma pilha de interceptors que não use o “defaultStack”

Mas, em todo caso, essa mensagem que aparece pra você sempre ocorrerá em caso de campo inválido (exemplo: preenchimento de número em data).

Correto foi este erro que achei de double para String.

Devido ao fato de eu estar utilizando virgula no meu preço quando é editado pelo usuario.
Quando minha action vai pegar o valor gera erro.

Html envia 15,00 devido a mascara.
Meus metodos e assim

public double getPreco(){
return this.preco;
}
public void setPreco(double preco) {
this.preco = preco;
}

Estou pesando em pegar e alterar meu get para tipo String e criar uma função que o transforme em double.
Pois quando utilizo HttpServlet, tenho todo o trabalho de tratar para double:

double dVlr = 0;
try {
dVlr = formatador.parse(request.getParameter(“vlr”)).doubleValue();
request.setAttribute(“vlr”,String.valueOf(dVlr));
} catch (Exception e) {
request.setAttribute(“vlr”,“0”);
sMsg = “Valor do Pago deve ser válido !”;
}

Acho isto muito tosco!

Value!!!

O que eu acabei fazendo foi:
Peguei meu metado

alterei para isto:
public void setValorLancamento(String valorLancamento) throws Exception {
this.valorLancamento = stringToDouble(valorLancamento);
}

Crei a função:

public double stringToDouble(String sVlr) throws Exception {
//import java.text.*;
DecimalFormat formatador = new DecimalFormat();
formatador.applyPattern("######0,00;- #####0,00");
double dVlr = 0;
try {
dVlr = formatador.parse(sVlr).doubleValue();
}catch(Exception e){
throw new Exception (“Valor digitado invalido!” );
}
return dVlr;
}

Bom agora esta funcionado direito, mas deve existir um modo mais inteligente de se fazer isto,ou não?
Obs.:
Estou usando a seguinte arquitetura:
JSP+Struts2+Hibernate+MySQL.

O meu JSP é assim, que mostra o valor:

Valeu!

Amigo, esse problema é devido entre as diferenças entre nossos sistema de formatação de números e o sistema americano.

Aqui, ponto é separados de milhar e vírgula de decimais. Nos EUA (e acho que na maioria dos lugares) é o contrário.

Neste link
http://struts.apache.org/2.1.8.1/docs/formatting-dates-and-numbers.html

É exclicada uma maneira “formal” de corrigir isso.

Mas há outras dicas legais aqui:
http://www.roseindia.net/struts/struts2/struts-2-format.shtml

Obrigadão.