Valor já preenchido ou pré-enchido :)

21 respostas
A

Olá pessoal,

Sou novo no Struts e tenho uma dúvida:

Como faço para um campo texto já aparecer preenchido na primeira vez que abrir a página. Fiz uma Action que roda antes do jsp e que coloca a String IdNota que eu preciso como atributo da sessão:

session.setAttribute("idNota", idNota);

No início do jsp fiz referencia ao meu bean:

<jsp:useBean id="notaform" scope="request" class="bank.NotaForm" />

e no form, o campo que desejo que já seja preenchido pelo valor:

<html:form action="/printNota.do" method="post" > <html:text property="idNota" name="notaForm" size="6"/>

tudo roda sem erros mas não sei como fazer para setar o valor desse campo com o valor passado pela Action…acredito que seja com o atributo value=<algumacoisa>.

Obrigado desde já!

Pestana

21 Respostas

D

No seu caso, creio que seja melhor colocar o valor no request do que na sessão.

Não precisa usar o <jsp:useBean …/>.

E tenta assim:

Action:

request.setAttribute("nota", nota);

No JSP:

&lt;html:form action="...."&gt; &lt;html:text name="nota" property="idNota" /&gt; &lt;/html:form&gt;

Falou!

A

Daniel,

ok, tirei o <jsp:useBean …/>

Na action deixei:

request.setAttribute("id", id);

No JSP:

&lt;html:form action="...."&gt; &lt;html:text name="id" property="idNota" /&gt; &lt;/html:form&gt;

Mas aí vem a mensagem:

javax.servlet.ServletException: Cannot find bean id in any scope

Não sei se expliquei muito bem…

Eu chamo primeiro uma Action para pegar o valor do último id de notas emitidas que está gravado no banco (isso eu sei q ela faz, ela pega o último id e joga no console para debugar) e passo esse valor para o campo já vir preenchido no formulário.

E agora?

Pestana

D

Tenta:

<bean:write name=“id” property=“idNota” />

A

hum… :cry:

mesma coisa:

javax.servlet.ServletException: Cannot find bean id in any scope

Pestana

D

weird!

E com isso:

<jsp:useBean id=“id” class=“bank.NotaForm” />
<jsp:getProperty id=“id” property=“idNota” />

A

bom,

legal, agora o que eu mudei:

&lt;jsp:useBean id="id" class="bank.NotaForm" /&gt; 

&lt;html:form action="/printNota.do"  method="post" &gt;
	&lt;html:text property="idNota" name="id" &gt;
&lt;/html:form&gt;

Mas o campo vem com valor 0...

Com <jsp:getProperty name="id" property="idNota" /> tb fica zerado o valor do campo....

Pestana

D

Então o valor não está sendo colocado no request.
Seu action não deve estar sendo chamado.

A

olha, dei uma verificada e realmente com request, não passa nada para o form…então resolví mudar para session como tinha feito inicialmente. Verifiquei que se eu fizer isso:

&lt;%=session.getAttribute("id")%&gt;

obtenho o resultado esperado mas gostaria de não usar scriptlets.

Não funciona com:

&lt;html:text property="idNota" name="id"&gt;

tenho que mexer no struts-config.xml?

Pestana

D

Veja se no seu struts-config.xml, na configuração do seu action tem algo que fala do request. Uma vez tive problemas com isso. Tem um atributo que não repassa o conteúdo do request.

A

Nada feito… alguém tem alguma idéia?

Estava vendo em alguns sites que vc pode usar uma subtag da tag <action> chamada <set-property> mas não sei se tem a ver… estou com struts 1.1

Qualquer ajuda é bem-vinda…

Pestana

D

Coloca aqui a configuração do seu struts-config.xml.

A
<struts-config>

   <form-beans>

		<form-bean name="notaForm" type="org.apache.struts.action.DynaActionForm">
		            <form-property name="idNota" type="java.lang.String"/>
		            <form-property name="natureza" type="java.lang.String"/>
		            <form-property name="cfop" type="java.lang.String"/>
		            <form-property name="tipoEntradaSaida" type="java.lang.String"/>
		           
		            <form-property name="razaoSocial" type="java.lang.String"/>
		            <form-property name="endereco" type="java.lang.String"/>
		            <form-property name="cgc" type="java.lang.String"/>
		            <form-property name="dtEmissao" type="java.lang.String"/>
		            <form-property name="dtSaida" type="java.lang.String"/>
		            <form-property name="municipio" type="java.lang.String"/>
		            <form-property name="telefone" type="java.lang.String"/>
		            <form-property name="uf" type="java.lang.String"/>
		            <form-property name="ie" type="java.lang.String"/>
		            <form-property name="irrf" type="java.lang.Double"/>
   		            <form-property name="cofins" type="java.lang.String"/>
		            <form-property name="issCalc" type="java.lang.Boolean"/>
		            <form-property name="inssCalc" type="java.lang.Boolean"/>
		            <form-property name="irrfCalc" type="java.lang.Boolean"/>
		            <form-property name="numFatura" type="java.lang.String"/>
		            <form-property name="vencFatura" type="java.lang.String"/>
		            <form-property name="valorFatura" type="java.lang.Double"/>
		            <form-property name="numFatura2" type="java.lang.String"/>
		            <form-property name="vencFatura2" type="java.lang.String"/>
		            <form-property name="valorFatura2" type="java.lang.Double"/>
		            <form-property name="totalNota" type="java.lang.Double"/>
		            
		            <form-property name="itemProd1" type="java.lang.Double"/>
		            <form-property name="itemProd2" type="java.lang.Double"/>
		            <form-property name="itemProd3" type="java.lang.Double"/>
		            <form-property name="descProd1" type="java.lang.Double"/>
		            <form-property name="descProd2" type="java.lang.Double"/>
		            <form-property name="descProd3" type="java.lang.Double"/>
		            <form-property name="valorProd1" type="java.lang.Double"/>
		            <form-property name="valorProd2" type="java.lang.Double"/>
		            <form-property name="valorProd3" type="java.lang.Double"/>

		            <form-property name="itemServ1" type="java.lang.Double"/>
		            <form-property name="itemServ2" type="java.lang.Double"/>
		            <form-property name="itemServ3" type="java.lang.Double"/>
		            <form-property name="descServ1" type="java.lang.Double"/>
		            <form-property name="descServ2" type="java.lang.Double"/>
		            <form-property name="descServ3" type="java.lang.Double"/>
		            <form-property name="valorServ1" type="java.lang.Double"/>
		            <form-property name="valorServ2" type="java.lang.Double"/>
		            <form-property name="valorServ3" type="java.lang.Double"/>
		            
		            <form-property name="pgto" type="java.lang.Integer"/>
		            <form-property name="iss" type="java.lang.Integer"/>

		</form-bean>
   </form-beans>
    <action-mappings>
           <!-- "printNota" action -->

			<action path="/printNota"      type="bank.NotaAction"
				name="notaForm"
				scope="request"
				validate="true"
				input="/pages/nota.jsp">
				<forward name="success" path="/pages/success.jsp"/>		
			</action>

           <!-- "nota" action -->

			<action path="/pages/Nota"      type="bank.Nota"
				
				validate="true">
				
				<forward name="init" path="/pages/nota.jsp"/>
						
			</action>
        

    </action-mappings>


    <controller

       processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>



    <message-resources parameter="MessageResources"/>

  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property
        property="pathnames"
        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
  </plug-in>

</struts-config>
D

Parece normal. Que estranho!
Você está chamando diretamento o seu JSP ou o .do?

D

André,

Eu acho q vc tah fazendo uma confusãozinha na hora de passar o objeto pro request…

O lance eh o seguinte…
Sua action deve ser chamada antes da jsp…feito isso a sua action vai criar um objeto do tipo bank.NotaForm e atribuir esse objeto como um atributo da requisição…(pelo amor de Deus não use sessao cara! soh qdo for realmente necessario…), mais ou menos assim…

NotaForm nota = ...;//Consulto, seto, etc, etc...

...
request.setAttribute("nota", nota);

Depois disso, em sua jsp vc obterah os dados do bean da maneira q vc estava fazendo:

&lt;form action="/printNota.do"  method="post"&gt;
	&lt;html:text property="idNota" name="nota"/&gt;
&lt;/html:form&gt;

(Presumindo q o objeto nota tenha uma propriedade chamada idNota…)

Mas se ainda assim a propriedade estiver vindo zerada, pode olhar q vc não estah setando a propriedade idNota do seu bean, ou estah setando-a com 0.

A

Resolvido: :D

Como estou começando com Struts, ainda faço confusão com algumas coisas. :lol:

Action

package bank;


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.LinkedList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import db.Conexao;

public class Nota extends Action {
	 private String idNota = null;
	 private Collection natureza = null;
	 private Collection empresas = null;
	 private String sql = "";
	 
	 
	    /* Metódo que invoca a camada de negócios.*/
	    public ActionForward execute(ActionMapping mapping,
	        ActionForm form,
	        HttpServletRequest request,
	        HttpServletResponse response) throws Exception {
	     
	     Conexao c = new Conexao();
	     Connection conn = null;
	     ResultSet rs = null;
	     HttpSession session = request.getSession();
	     
	     try 
	     {
	      conn = c.createConnection();
	      Statement s = conn.createStatement();
	      // pega o último id
	      // para popular campo numero da nota
	      selectIdNota(session, s, form);
	 
	      // pega o último id
	      // para popular campo numero da nota
	      selectNatureza(session, s);

	      // pega o último id
	      // para popular campo numero da nota
	      selectEmpresas(session, s);	      
	      
	      
	      
	      
	   s.close();
	   
	  }
	  catch(SQLException e)
	  {
	   System.out.println(e.toString()); 
	  }
	  catch(NullPointerException e)
	  {
	   System.out.println(e.toString()); 
	  }
	  finally
	  {
	   c.closeConnection(conn);
	  }
	    
	    
	     return (mapping.findForward("init")); // nota.jsp
	    }

	  
	    
	private void selectIdNota(HttpSession session, Statement s, ActionForm form) throws SQLException {
		ResultSet rs;
		// select id nota
		sql = "select ID_NOTA from TB_NOTAS order by ID_NOTA" ;
		             
		System.out.println(sql);//mostra o q faz
		  
		rs = s.executeQuery(sql);
		  
		while(rs.next()){
		  	
			if(rs.isLast())
				idNota = rs.getString("ID_NOTA");
			  
		}
		System.out.println("\n   ID    =    "+idNota+"\n");
		  
		NotaForm notaForm = (NotaForm)form;
		
		System.out.println("\npassou\n");
		//Aqui carrega o atributo do formulario
		notaForm.setIdNota(idNota);
		System.out.println("\npassou 2\n");
		System.out.println(notaForm.getIdNota()+"\n");
		  
	  
	 }
	 	

	 private void selectNatureza(HttpSession session, Statement s) throws SQLException {
		ResultSet rs;
	  	// select id nota
	  	sql = "SELECT ID_NATUREZA_OPERACAO, DESCRICAO FROM TB_NATUREZA_OPERACAO "; 

	             
	  	System.out.println(sql);//mostra o q faz
	  
	  	rs = s.executeQuery(sql);
	  	
	  	natureza = new LinkedList(); 
 
	  	while(rs.next()){
	  		
	  		natureza.add(new NaturezaBean(rs.getString("ID_NATUREZA_OPERACAO"), rs.getString("DESCRICAO"))) ;
		  
	  	}
	
	  	session.setAttribute("natureza", natureza);
	  	
	 }

	 private void selectEmpresas(HttpSession session, Statement s) throws SQLException {
		ResultSet rs;
	  	// select id nota
	  	sql = "select RAZAO_SOCIAL,ID_CLIENTE from TB_CLIENTES" ;

	  	System.out.println(sql);//mostra o q faz
	  
	  	rs = s.executeQuery(sql);
	  	
	  	empresas = new LinkedList();
	  	
	  	while(rs.next()){
	  		
	  		empresas.add(new EmpresaBean(rs.getString("RAZAO_SOCIAL"),rs.getString("ID_CLIENTE"))) ;
		  
	  	}
		
	  	session.setAttribute("empresas", empresas);
	  	
	 }

}

struts-conf.xml

&lt;form-beans&gt;

		&lt;form-bean name="notaForm" type="bank.NotaForm"&gt;
		            &lt;form-property name="idNota" type="java.lang.String"/&gt;
		            &lt;form-property name="natureza" type="java.lang.String"/&gt;
		            &lt;form-property name="cfop" type="java.lang.String"/&gt;
		...
		&lt;/form-bean&gt;
    &lt;/form-beans&gt;

    &lt;action-mappings&gt;
		    &lt;action path="/pages/Nota"
		        type="bank.Nota"
		        name="notaForm" scope="request" validate="true"&gt;
		        &lt;forward name="init" path="/pages/nota.jsp"/&gt;
		    &lt;/action&gt;
    &lt;/action-mappings&gt;

ActionForm

package bank;

import org.apache.struts.action.ActionForm;

public class NotaForm  extends ActionForm{
    private String idNota;
	
    public String getIdNota() {
    return idNota;
 
    public void setIdNota(String idNota) {
       this.idNota = idNota;
    }
}

jsp:

&lt;html:form action="/printNota.do"  method="post" &gt;
	&lt;html:text property="idNota" name="notaForm" &gt;
&lt;/html:form&gt;

Coloquei só que importa... mas deu certo... vou mudar o atributo na session para request..

Obrigado, Diogenes e Daniel! :wink:

Pestana

K

Antes de mais nada, eu tb estou começando com o struts. Estou fazendo algo bem semelhante, ou seja, estou vinculando um elemento de um form com um bean da seguinte forma:

&lt;html:text name="usuarioeditar" property="login" /&gt;

O “usuarioeditar” é uma variável de sessão, e o text é preenchido com o valor do campo “login” de “usuarioeditar”. O problema é que quando altero o conteúdo do text e submeto o formulário, o bean não é alterado. Vcs saberiam me dizer o q estou fazendo errado?

Valeu!

D

Auto-quote eh sacanagem! :smiley:

e outra…

Quando for obter o valor de uma variavel na action do seu form obtenha-o pelo ActionForm passado pro metodo execute…

K

Cara, em primeiro lugar,obrigado por responder.

Perguntas:

  1. O que é auto-quote? Qual é a sacanagem disto? :shock:

  2. Gostaria de não usar variáveis de sessão, mas o caso é que quando eu atribuo alguma coisa à um request, esta coisa é perdida ao fim do request, certo? O que eu quero é criar um VO lá no DAO e carregá-lo no JSP. Como fazer isto sem variáveis de sessão? :shock:

  3. Estou tentando recuperar o bean alterado no validate() do ActionForm, e não no execute() do Action. Ok, isto é quase a mesma coisa, eu sei. Acontece que o ActionForm não tem nem as variáveis membro que são alteradas, elas estão todas no bean que está associado às tags html:... no jsp. Pq isto simplesmente não funciona, ou seja, pq as alterações as alteraçõe nos controle html não se refletem no bean q está associado a eles? :shock:

Valeu, again! 8)

D

Entaum vamos lá…

Disponha! :smiley:

É que no post anterior eu citei eu mesmo… :wink:

Vc quer apenas criar um VO no DAO e mandar pra jsp?

Fácil!

UsuarioVO usuario = usuarioDao.getMeuUsuarioVO(); //Obtem o objeto do DAO
 ...

 request.setAttribute("usuarioeditar", usuario);

E na jsp:

&lt;html:text name="usuarioeditar" property="login" /&gt;

Se vc tem seu ActionForm vinculado a Action no struts-config normalmente,
qdo eh dado o post pra Action o ActionForm será populado com os dados
preenchidos no formulário cara!
É soh vc obter os dados pelos campos do próprio ActionForm…

Como vc tah fazendo no seu ActionForm? Posta ele aih…

K

(Pequena novela)

Cara, o que acontece eh o seguinte: na minha aplicação, existe um <html:form action="/users">, que apresenta uma lista de usuarios na tela. Tudo funciona perfeitamente, pelo menos em princípio. Acontece que um dos botões nesta tela leva a uma outra tela para editar o usuário e voltar a esta. Aí eu pensei: " :idea: Pô, este negócio de ficar criando um ActionForm para cada html:form não tá com nada, isto vai explodir exponencialmente…" E resolvi tentar o seguinte: criar o novo form do outro jsp (o de editar o usuario) com <html:form action="/users">, ou seja, usar o mesmo ActionForm e tudo o mais. Bastaria acrescentar novas variáveis membro + getters & setters. Só que aí aconteceu algo estranho: quando eu alterava o valor de uma propriedade, a página jsp carregava, mas os controles apareciam com o valor antigo da propriedade. O pior é que quando eu avaliava no mesmo ponto a propriedade com uma expressão EL, o valor aparecia atualizado na EL mas não no controle. Aí eu resolvi criar um bean só para associar aos controles da tela de editar, e removi variáveis + getters and setters do ActionForm. Note q o bean NÃO é um ActionForm. Ok, funcionou, os valores apareceram corretamente, mas ao alterar os valores no controle e submeter o form, o bean não tava nem aí e não era alterado. :?

Resumindo, desisti da idéia original e estou fazendo as coisas como sempre, um ActionForm para cada html:form. Da próxima vez, vou ver se aprendo DynaAction, me falaram que é melhor para reutilizar código. :roll:

Mais uma vez, valeu. 8)

D

Se vai usar alguma coisa nova cara, use Webwork!!!
Pense nas pobres foquinhas… :smiley:

Criado 17 de janeiro de 2005
Ultima resposta 19 de jan. de 2005
Respostas 21
Participantes 4