VRaptor3 e load do JQuery - popular select/combo

Olá pessoal

Tenho a seguinte Jquery para acessar uma url num OnChange:

<script language="javascript" type="text/javascript" src="${pageContext.request.contextPath}/jquery-latest.js"></script>

<script charset="ISO-8859-1">

$(document).ready( function () {
	$('#select_uf').change(
		function() {
			$('#restante_contrato.cod').load('/restante/popularcontrato/' + this.value);
		}
	);
});

Tenho um select fora de um formulário, que é o select tratado com change:

<fmt:message key="contrato.form.uf"/><br>
	<select id="select_uf">
		<option value=""></option>
		<c:forEach var="uf" items="${listUf}">
			<option value="${uf}"
				<c:if test="${estado == uf}">selected="true"</c:if>>
				${uf}
			</option>
		</c:forEach>
	</select><br></br>

Um select dentro do meu formulário que será o select populado

<fmt:message key="restante.form.contrato"/><br>
<select name="restante.contrato.cod" id="restante_contrato.cod"></select><br>

E o código do Vraptor que irá tratar o evento e responder:

@Path("/restante/popularcontrato/{uf}")
	public void populaComboContrato(String uf){
		System.out.println("TESTE POPULAR");
		List<Contrato> lista = contratodao.list(uf);
		StringBuilder options = new StringBuilder(); 
		options.append("<option value=''></option>");
		if(!uf.equalsIgnoreCase("")){
			for (Contrato c : lista) {
				options.append("<option value=");
				options.append("'" + c.getCod() + "'>");
				options.append(c.getNome() + "-" + c.getUf());
				options.append("</option>");  
			} 
		}
		writer.print(options);
		result.use(Results.nothing());
	}

Porém, a Jquery sequer está acessando minha url.
Já tentei escrever a url de várias maneiras:
’/restante/popularcontrato/’
‘restante/popularcontrato/’
’/popularcontrato/’
‘popularcontrato/’

Achei que o problema pudesse ser o arquivo js com a biblioteca do jquery, mas tenho outros códigos jquery rodando e funcionando na mesma página.

Não consigo ver o que há de errado.
Se alguém puder ajudar, obrigado!!!

Dependendo do código eu uso o nome do projeto no inicio da url:

/nomeDoProjeto/restante/popularcontrato/

ou diretamente:

popularcontrato/

Você pode colocar ${pageContext.request.contextPath} no começo da url no javascript, ou usar a tag c:url

$('#restante_contrato.cod').load('<c:url value="/restante/popularcontrato/"/>' + this.value);

Bacana

Os dois tipos funcionaram. Meu controller tá contruindo certinho a estrutura de options mas não está populando.

O PrintWriter é o jeito correto de voltar com a requisição?

public RestanteController(Result result, Validator validator, HttpSession session, HttpServletResponse response)
	throws Exception{
		this.result = result;
		this.validator = validator;
		this.session = session;
		writer = response.getWriter();  
	}

O writer eu tiro do HttpServletResponse como no código acima.

Valeu!!!

o jeito certo é criar o WEB-INF/jsp/popularContrato/populaComboContrato.jsp e gerar o combo dentro dele

vc nunca deveria receber HttpServletRequest ou Response nos seus controllers…

O mais elegante é fazer o vraptor retornar um JSON, e então via jquery você popular seu select.

O que eu fiquei intrigado é que eu vi vários exemplos na internet feitos do mesmo modo que eu. Mas nenhum mostrava como o servidor respondia. E se tantos exemplos foram dados dessa forma, acredito que deveria funcionar.

Tentei dessa maneira também:

$(document).ready(function(){
	$('#select_uf').change(
		function() {
			$.get('<c:url value="/restante/popularcontrato/"/>' + this.value,function(resposta){
				$('#restante_contrato.cod').html(resposta);	
			});
		}
	);
    });

Mas também não funcionou.

Então tentei de uma outra forma. Não ficou tão simples como eu queria, mas funcionou:

$(document).ready(function(){
	$('#select_uf').change(
		function() {
			$.get('<c:url value="/restante/popularcontrato/"/>' + this.value,function(resposta){
				popularContratos(resposta);
			});
		}
	);
    });

    function popularContratos(resposta){
    	select_name = "restante_contrato.cod";
		limparSelect(select_name);
		contratos = resposta.split(";");
		select = "<option value=''></option>";
		for(i = 0; i < contratos.length; i++){
			select += "<option value = " + contratos[i].split(",")[0] + ">";
			select += contratos[i].split(",")[1] + "</option>";	 
		}
		document.getElementById(select_name).innerHTML = select;    
    }

    function limparSelect(name){
    	var select = document.getElementById(name);

        while (select.options.length > 0){
        	select.options[0] = null;
        }
        select.selectedIndex = -1;
    }
@Path("/restante/popularcontrato/{uf}")
	public void populaComboContrato(String uf) {
		
		List<Contrato> lista = contratodao.list(uf);
		StringBuilder json = new StringBuilder();    
		for (Contrato c : lista) {  
			json.append(c.getCod() + "," + c.getNome() + "-" + c.getUf() + ";");  
		}  
		int i = json.lastIndexOf(";");
		json.replace(i, i + 1, "");
		writer.print(json.toString());
		result.use(Results.nothing());
}

Lucas, dessa forma que vc disse, eu iria carregar a minha página de formulário inteira novamente?

o que vc pode fazer é trocar o popula combo:

 @Path("/restante/popularcontrato/{uf}")  
     public void populaComboContrato(String uf) {  
           
         List<Contrato> lista = contratodao.list(uf);  
        result.use(Results.json()).from(lista, "contratos").serialize();
 }

que vai retornar algo do tipo:

{"contratos": [
    {"cod": "231",
      "nome": "abc",
      "uf": "SP",
      //...
    }, //...
]}

e você consegue ler no javascript:

 function popularContratos(resposta){  
         select_name = "restante_contrato.cod";  
         var contratos = eval(resposta).contratos;
         limparSelect(select_name);  
         select = "<option value=''></option>";  
         for(i = 0; i < contratos.length; i++){  
             select += "<option value = " + contratos[i].cod + ">";  
             select += contratos[i].nome + "</option>";      
         }  
         document.getElementById(select_name).innerHTML = select;      
     }  

e isso vai carregar só o select, não o formulario inteiro

Eu fiz algo assim que popula uma lista de cidades e preenche um select.

$.getJSON('/l10n/countries/', function(data) { var o =countries.options; o.length = 0; // limpa o select $.each(data.list, function(k, v) { // retorna chave-valor o[o.length] = new Option(v.name, v.id); o[o.length -1].selected = (v.id ==defaultCountry); }); });

Hmmm, show hein!!!

Pra usar o Results.json() tive que baixar a versão nova do Vraptor pq a minha versão não tinha.

Só que não está dando certo. Estou removendo o jar antigo e adicionando o novo lá no

(Eclipse) Properties > Java Built Path > Libraries

mas nã está funcionando. O projeto fica com status de erro. Não sei se estou fazendo certo pq sempre usei NetBeans e nunca fiz isso em Eclipse.

Hmm, qual o erro que está dando?

Mas o certo não é copiar para dentro do WEB-INF/lib? Pelo menos é assim que uso no meu Eclipse.

Abraços

Ae garcia

O status de erro sumiu depois q eu fechei e abri o eclipse. Mas quando eu dou start no servidor, ele dá esse erro:

13/01/2010 09:45:01 org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:bc' did not find a matching property.
13/01/2010 09:45:01 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Arquivos de programas/Java/jre6/bin/client;C:/Arquivos de programas/Java/jre6/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Arquivos de programas\ATI Technologies\ATI.ACE\Core-Static;C:\Arquivos de programas\Microsoft SQL Server\80\Tools\Binn\;C:\Arquivos de programas\QuickTime\QTSystem\
13/01/2010 09:45:01 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
13/01/2010 09:45:01 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2293 ms
13/01/2010 09:45:01 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
13/01/2010 09:45:01 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20
13/01/2010 09:45:04 org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
java.lang.ClassNotFoundException: br.com.caelum.vraptor.VRaptor
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:249)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3800)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4450)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
13/01/2010 09:45:04 org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
13/01/2010 09:45:05 org.apache.catalina.core.StandardContext start
SEVERE: Context [/bc] startup failed due to previous errors
13/01/2010 09:45:06 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
13/01/2010 09:45:06 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
13/01/2010 09:45:06 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
13/01/2010 09:45:07 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
13/01/2010 09:45:07 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/109  config=null
13/01/2010 09:45:07 org.apache.catalina.startup.Catalina start
INFO: Server startup in 5594 ms

Eu olhei no classpath e a nova versão do vraptor tá lá. Será que tem mais algum jar que eu tenha que atualizar?

vc colocou o jar do vraptor no classpath e não foi? tome cuidado que no site está o zip que tem o jar dentro…

teoricamente não precisaria mudar os outros jars… vc baixou a versão 3.1, né?

Sim, até entrei no classpath pra verificar.
Versão 3.1.
Peguei o jar do blank-project

Oi Bruno!

Essa mensagem de erro realmente indica a falta do JAR do VRaptor. Onde ele foi colocado extamente?

abracos

Está em
nome_do_projeto/lib
nome_do_projeto/WebContent/WEB-INF/lib

Classpath:

Oi Bruno!

Voce esta rodando pelo WTP? Esta definido os containers do tomcat e do WebContet? Esses aqui:

<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>

abracos

o jar do vraptor tem que estar no WEB-INF/lib… abre as propriedades do projeto, e retire do classpath o que está na pasta lib…

E ae galera

Sim


estavam definidos sim.

Eu fiz o seguinte, depois de várias tentivas frustradas de resolver, comecei um projeto novo à partir do vraptor-blank-project, adicionei meus jars restantes, minhas classes, etc, rodei o tomcat e ele apresentou um erro no start em cima de uma biblioteca q eu nem tinha no meu projeto anterior.

16:24:39,859  INFO [VRaptorApplicationContext] Refreshing Root WebApplicationContext: startup date [Sat Jan 16 16:24:39 GMT-03:00 2010]; root of context hierarchy
16:24:40,437  INFO [VRaptorApplicationContext] Scanning WEB-INF/classes: C:\Documents and Settings\bribeiro\Desktop\JAVA\apache-tomcat-6.0.20\wtpwebapps\bc\WEB-INF\classes
16:24:40,828  INFO [VRaptorApplicationContext] Scanning packages from WEB-INF/classes and jars: [bsr.vraptor]
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.AtividadeController
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.CcController
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.ContratoController
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.I18nController
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.LanguageController
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.ProjetoController
16:24:40,875  WARN [ComponentScanner    ] bean already found previously, there is probably no need to declare its package in web.xml:bsr.vraptor.controller.RestanteController
16:24:40,921  INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': replacing [Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [br.com.caelum.vraptor.ioc.spring.InjectionBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
16/01/2010 16:24:41 org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.<init>(Ljava/lang/Class;)V
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:350)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:296)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:787)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:671)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:401)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:63)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:75)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:107)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:100)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3800)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4450)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
16/01/2010 16:24:41 org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
16/01/2010 16:24:41 org.apache.catalina.core.StandardContext start
SEVERE: Context [/bc] startup failed due to previous errors
16/01/2010 16:24:42 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
16/01/2010 16:24:42 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
16/01/2010 16:24:42 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
16/01/2010 16:24:43 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
16/01/2010 16:24:43 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/188  config=null
16/01/2010 16:24:43 org.apache.catalina.startup.Catalina start
INFO: Server startup in 4752 ms

Essa biblioteca veio no blank-project.

de uma olhada se vc não está com duas versões diferentes do spring ao mesmo tempo…

ve se tem um spring-2.5.6.jar e um org.springframework…3.0.0.jar…

se tiver os dois, tira o 2.5.6