Dúvida com Taglib do struts

37 respostas
marcelo_mococa

É o seguinte galera…

Estou fazendo um esquema para atualizar um cadastro.
Atraves do ID do cliente, eu faço um select no banco e passo pra jsp, um objeto com os dados do cliente. Ate aqui tudo ok.

Minha dúvida é a seguinte, no jsp, atraves da taglib “html” do struts, gostaria de setar o texto de cada campo do formulário com os valores equivalentes no objeto.
Gostaria que vcs me ajudassem em como receberei este objeto na jsp, creio que seja atraves da Expression Language, mas naum sei como. E como preencherei o formulário.

Segue o código da jsp para vcs verem como está.

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>


<html:html>

<html:form action="atualizarcliente" focus="cliente.nome">
	<html:text property="cliente.nome" size="20"/>  <br>
	<html:text property="cliente.email" size="20"/> <br>
	<html:text property="cliente.cidade" size="20"/> <br>
	<html:submit> Atualizar </html:submit>
</html:form>

</html:html>

Espero ter sido claro.

37 Respostas

rmarin

Cara,

Dentro do seu Action vc deve setar o objeto cliente no request

Action:

request.setAttribute("cliente", cliente)

Jsp:

request.getAttribute("cliente")

Depois é só ir pegando os atributos:

&lt;%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%&gt;
 
&lt;html:html&gt;
 
&lt;html:form action="atualizarcliente" focus="cliente.nome"&gt;
 	&lt;html:text property="cliente.nome" size="20" value="&lt;%=cliente.getNome()%&gt;"/&gt;  <br>
 	&lt;html:text property="cliente.email" size="20" value="&lt;%=cliente.getEmail()%&gt;"/&gt; <br>
 	&lt;html:text property="cliente.cidade" size="20" value="&lt;%cliente.getCidade()%&gt;"/&gt; <br>
 	&lt;html:submit&gt; Atualizar &lt;/html:submit&gt;
&lt;/html:form&gt;
 
&lt;/html:html&gt;

:wink:

afamorim

Rapaz que eu saiba va nao vai pdoe fazer isso nao, vc vai ter que fazer

ClienteForm
com os atributos nome, email, cidade e ai no jsp vc coloca nome, email, cidade, quando vc preecher o form do strtus que for para o jsp ele preeche automaticamente.

Ate onde eu sei de strtus vc nao pdoe colocar um objeto tipo Pessoa dentro do form e assim seta-lo no jsp como pessoa.nome, vc teria que fazer pessoaNome como String no form e no jsp colocaria pessoaNome tb.

Se eu estiver errado que alguem me corrija.

rmarin

Ah tá, não tinha reparado nos pontos ‘.’

marcelo_mococa

ok.
mas isso é pra gravar, certo?

acho q a solução postada acima da certo, mas tem como fazer isto sem scriplets?

rodrigo_corinthians

No form aceita sim objetos do seu negócio, fica meio tosco o código mas funciona. :slight_smile:

class PessoaBean {
private nomePessoa;
public String getNomePessoa() {
return nomePessoa;
}
public void setNomePessoa(String p){
this.nomePessoa = p;
}
}

class MeuForm extends ActionForm {
protected PessoaBean pessoaBean;
public PessoaBean getPessoaBean(){
pessoaBean = new PessoaBean();
return pessoaBean;
}
}

// JSP.
<html:text property="pessoaBean.nomePessoa" />

Sem mais, Rodrigo.

marcelo_mococa

Estou fazendo assim tb. Pq fica tosco o codigo?

alguem tem uma solução para o problema q eu citei acima?

marcelo_mococa

sera que assim funciona?

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
  
 <html:html>
  
 <html:form action="atualizarcliente" focus="cliente.nome">
  	<html:text property="cliente.nome" size="20" value="${cliente.nome}"/>  

  	<html:text property="cliente.email" size="20" value="${cliente.email}"/> 

  	<html:text property="cliente.cidade" size="20" value="${cliente.cidade}"/> 

  	<html:submit> Atualizar </html:submit>
 </html:form>
  
 </html:html>
rodrigo_corinthians

Tá mas entaum qual é o seu problema afinal? Faz q nem o rmarin disse no seu action vc seta o objeto na sessão.

Seu problema é colocar os valores dentro do campo text?? Se sim usa o bean:define

<bean:define id="campo" name="meuBean" property="atributoBean" type="java.lang.String" />

<html:text property="blabla" value="<%=campo%>" />

Sem mais, Rodrigo.

afamorim

Calma rodrigo, vamo ver a melhor solução, eu nao sabia do que vc falou, vou testar mais tarde, mais se o que vc falou é verdade, o codigo deveria estar funcionando, uma vez que uma das funcionalidades do struts é este preenchimento automatico.

Marcelo, passe o codigo do seu action o qual vc esta preenchendo o form.

to no aguardo.

marcelo_mococa
package br.com.marcelo.action;

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

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 br.com.marcelo.form.AtualizaClienteForm;
import br.com.marcelo.hibernate.DAO;
import br.com.marcelo.modelo.Cliente;

public class AtualizaClienteAction extends Action{
	
	@Override
	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception {
		
		AtualizaClienteForm c = (AtualizaClienteForm) form;
		Long id = c.getId();
		DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
		Cliente cliente = dao.pesquisa(id);
		
		req.setAttribute("cliente", cliente);
		
		return map.findForward("ok");
	}

}
afamorim

Pronto preenha os campos do seu form, o correto seria agora sua tela vim toda reenchida, de uma olhada no objeto BeanUtils da jakarta, ele vai ser muito util nesse lance de preencher form com vo e vo com form.

post dizendo se funcionou.

:smiley:

marcelo_mococa

veja o erro q esta dando

type Status report

message No action instance for path /atualizarcliente could be created

description The server encountered an internal error (No action instance for path /atualizarcliente could be created) that prevented it from fulfilling this request.

veja meu struts-config

<action path="/atualizarcliente" type="br.com.marcelo.action.AtualizarClienteAction" name="AtualizarClienteForm" >
			<forward name="ok" path="/atualizar_cliente.jsp"/>			
		</action>
rmarin

Você declarou o AtualizarClienteForm dentro do struts-config?

Esse erro é pq ele não está conseguindo montar o html:form, pode ter certeza.

afamorim

Olhe o action do form do seu jsp, veja se ele esta preenchido, se vc tiver um <html:form> este tem que ter um action

nem que vc criem um action no strtus config com uma classe que ainda nao existe so p/ pdoer constar.

outra coisa é verificar se na moficação que vc fez no br.com.marcelo.action.AtualizarClienteAction se ele esta correto e foi compilado realmente.

marcelo_mococa

sim…
veja o resto do meu struts-config:

<form-beans>
		<form-bean type="br.com.marcelo.form.AtualizaClienteForm" name="AtualizaClienteForm"/>
	</form-beans>

e meu AtualizaClienteForm:

package br.com.marcelo.form;

import org.apache.struts.action.ActionForm;

public class AtualizaClienteForm extends ActionForm{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 7362111257516189451L;
	private Long id;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}

	

}
marcelo_mococa

na minha jsp ta assim:

<html:form action="atualizarcliente" focus="cliente.nome">

minha Action está como postado agora pouco.
e ainda ta o erro…

o q pode ser?

Obrigado.

rmarin

Cara, tenta colocar com ‘/’, sempre faço assim:

<html:form action="/atualizarcliente" focus="cliente.nome">
marcelo_mococa

fiz a mudança no form e naum deu tb

rmarin

Pior que não estou conseguindo acessar o WEB-INF lá da empresa :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Não lembro como monta o <action> direito no struts-config. :cry:

afamorim

Rapa esse neogcio ta um pouco estranho…

quais campos vc quer preencher no jsp??

como vc pdoe quere que o struts preencha um campo no jsp se esse nem mesmo existe no form?

os campos que vc quer que o struts preencha, tem que existir tanto no jsp como no form, assim vc preenche o form e o struts faz o resto, quanto ao action tem um campo que vc tem que preencher com request, nao lembro o nome agora, para que o mesmo coloque o form no request e possa preencher.

marcelo_mococa

vou postar todos os codigos pra ficar mais organizado.

AtualizarClienteForm

package br.com.marcelo.form;

import org.apache.struts.action.ActionForm;

public class AtualizaClienteForm extends ActionForm{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 7362111257516189451L;
	private Long id;
	private String nome, email, cidade;
	
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
}

AtualizarClienteAction

package br.com.marcelo.action;

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

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 br.com.marcelo.form.AtualizaClienteForm;
import br.com.marcelo.hibernate.DAO;
import br.com.marcelo.modelo.Cliente;

public class AtualizaClienteAction extends Action{
	
	@Override
	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception {
		
		AtualizaClienteForm c = (AtualizaClienteForm) form;
		Long id = c.getId();
		DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
		Cliente cliente = dao.pesquisa(id);
		
		req.setAttribute("cliente", cliente);
		
		return map.findForward("ok");
	}

}

Atualizar_cliente.jsp

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
  
 <html:html>
  
 <html:form action="/atualizarcliente" focus="cliente.nome">
  	<html:text property="cliente.nome" size="20" value=${cliente.nome}"/>  

  	<html:text property="cliente.email" size="20" value="${cliente.email}"/> 

  	<html:text property="cliente.cidade" size="20" value="${cliente.cidade}"/> 

  	<html:submit> Atualizar </html:submit>
 </html:form>
  
 </html:html>

struts-config.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"         "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
	
	<form-beans>
			<form-bean type="br.com.marcelo.form.AtualizaClienteForm" name="AtualizaClienteForm"/>
	</form-beans>
	
	
	<action-mappings>
		
			<action path="/atualizarcliente" type="br.com.marcelo.action.AtualizarClienteAction" name="AtualizarClienteForm" >
			<forward name="ok" path="/atualizar_cliente.jsp"/>			
		</action>
		
	</action-mappings>
	
	<message-resources parameter="MessageResources"/>
	
</struts-config>
afamorim

Pronto agora sim, hehehehehe

faz o seguinte, no jsp tira os “cliente.” o nome do campo do jsp tem que ser exatamente igual aos que estão no form.

avisa ai, se deu certo.

afamorim

Coloque tb no action o seguinte atributo

scope=“request”

marcelo_mococa

veja como ficou a jsp, ainda naum funcionou…

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean"%>

<html:html>

<html:form action="/atualizarcliente" focus="nome">
	nome <html:text property="nome" value="${cliente.nome}" size="20"/> <br>
	email <html:text property="email" value="${cliente.email}" size="20"/><br>
	cidade <html:text property="cidade" value="${cliente.cidade}" size="20"/><br>
	<html:submit> atualizar </html:submit>
</html:form>

</html:html>

tb coloquei o scope no struts config.

o q mais pode estar acontecendo

obrigado

marcelo_mococa

veja a exception q deu:

exception

javax.servlet.ServletException
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.NullPointerException
	br.com.marcelo.action.AtualizaClienteAction.execute(AtualizaClienteAction.java:21)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
afamorim

Ta dando exception nessa linha 21 de AtualizaClienteAction.java

marcelo_mococa

ta dando erro nesta linha:

Long id = c.getId();
afamorim

Porvavelmente este campo não esta no jsp!

marcelo_mococa

coloquei este campo na jsp e nada…rs

id <html:text property="id" value="${cliente.id}" size="20"/>

ja to ficanu loco com este erro…rs

Guilherme_Silveira

Vamos la do zero.

  1. JAMAIS usar scriplet. Nao importa o que aconteca.
  2. Voce pode colocar um objeto de modelo dentro de um Form desde que o struts passou a usar jxpath (sei que no 1.2 ele usa) sem problemas
public class ClienteForm extends ActionForm {
    private Cliente cliente;
    // gera o getter
}
  1. Tente usar expression language como voce mesmo sugeriu. Funcionou? Deve funcionar. Se nao funcionar poste aqui o stacktrace do erro. Ficou vazio? Se ficou vazio (ULTIMA OPCAO) voce vai ter que fazer o seguinte numa acao ANTES de acessar o seu formulario na pagina que pesquisa os dados no banco, colocar o cliente retornado dentro do formulario recebido e mante-lo na session (entenda: HORRIVEL pois nao permite duas janelas ao mesmo tempo sem possiveis bugs de concorrencia).

4.Rodrigo, o codigo nao fica tosco nao. Eh muito melhor assim. Tosco e improdutivo mesmo eh redigitar o campo nome, email etc e criar uma classe de DTO como o ActionForm IDENTICA a sua classe de modelo. Da maneira sugerida por outros toda vez que voce cria um campo novo no seu modelo voce deve replica-lo no seu ActionForm, isso eh no minimo grosseria.

  1. Jamais usar sessao para atribuir valores de request. Se o cara abrir duas janelas voce vai zuar muita coisa

  2. Beanutil sucks nesse caso pq significa que voce esta replicando seu VO no form. Nao replique objetos. Nao faca coisa a mais do que o necessario. Nao perca tempo. Faca coisas simples.

  3. Por isso tudo que eu odeio o struts. :slight_smile:

marcelo_mococa

blz Guilherme…

mudei o Form.
Na Action fiz assim:

public class AtualizaClienteAction extends Action{
	

	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception {
		
		AtualizaClienteForm c = (AtualizaClienteForm) form;
		DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
		Cliente cliente = dao.pesquisa(c.getCliente().getId());
		
		req.setAttribute("cliente", cliente);
		
		return map.findForward("ok");
	}

}

Continuou o mesmo erro…

Guilherme_Silveira

e usou expression language no value?

marcelo_mococa

sim, veja como esta a jsp…

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean"%>

<html:html>

<html:form action="/atualizarcliente" focus="nome">
	id <html:text property="id" value="${cliente.id}" size="20"/> <br>
	nome <html:text property="nome" value="${cliente.nome}" size="20"/> <br>
	email <html:text property="email" value="${cliente.email}" size="20"/><br>
	cidade <html:text property="cidade" value="${cliente.cidade}" size="20"/><br>
	<html:submit> atualizar </html:submit>
</html:form>

</html:html>
Guilherme_Silveira

http://struts.apache.org/userGuide/index.html
Pelo que vi vai ter que ser a terceira opcao que te falei mesmo.

marcelo_mococa

essa terceira opção é colocar o cliente que o usuário quer atualizar na seção?

A

Marcelo, no seu struts-config, na ação o atributo name tá = AtualizarClienteForm e no seu formBean vc o chamou de AtualizaClienteForm, ou seja, sem o R. Ele não consegue preencher nada do seu form. Vê se eh isso.
Falou cara,

Alberto

afamorim

Meu velho, eu aconselho a vc fazer uma pagina simples e ir colocando campo a campo e no actione fazendo o seguinte

System.out.println(form.getCampo());

p/ vc ir descobrindo o que esta acontecendo

de uma passada tb no www.apache.or, para dar uma olhada no tutorial do struts, pois vale a pena e vc vai ganhar muito tempo.

Criado 27 de julho de 2005
Ultima resposta 31 de jul. de 2005
Respostas 37
Participantes 6