Dúvidas com Velocity

14 respostas
oliveirarenan

Pessoal.

Estou aprendendo Velocity. Fiz um exemplozinho bem básico.

Dentro do meu html, eu coloquei o código:

#set($usuario="Renan")
Teste $usuario

Um exemplo bem primário…

Mas eu acho q ele não esta sendo reconhecido…pq quando eu chamo a tela aparece assim:

#set($usuario="Renan") Teste $usuario

Ou seja, ele aparece do mesmo jeito q esta no html.

Onde deveria aparecer:

Será q minhas bibliotecas naum estão setadas corretamente???

Alguem tem alguma sugestão??

Valeuz

Renan

14 Respostas

_fs

Coloque isso no web.xml dentro do diretório WEB-INF da sua aplicação:

<servlet> 
		<servlet-name>velocity</servlet-name> 
		<servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class> 
		<load-on-startup>0</load-on-startup> 
	</servlet> 

...

	<servlet-mapping> 
		<servlet-name>velocity</servlet-name> 
		<url-pattern>*.vm</url-pattern> 
	</servlet-mapping>

E, é claro, cheque se o jar do velocity está no diretório LIB da sua aplicação.

oliveirarenan

Lipe

<servlet> 
      <servlet-name>velocity</servlet-name> 
      <servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class> 
      <load-on-startup>0</load-on-startup> 
   </servlet>

Bem, o meu web.xml acho q esta completo…eu só nao referenciei esse servlet q vc passou, pq naum estou usando WebWork.

Dê uma olhada no meu Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
	<display-name>Velocity Teste</display-name>
	<servlet>
			
		<servlet-name>velocity</servlet-name>
    	<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
    	<load-on-startup>0</load-on-startup> 
				
		<servlet-name>VelocityTeste</servlet-name>
		<servlet-class>com.infoserver.renan.Servlet.VelocityTeste</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>VelocityTeste</servlet-name>
		<url-pattern>/servlet/VelocityTeste</url-pattern>
	</servlet-mapping>
	
   <servlet-mapping> 
      <servlet-name>velocity</servlet-name> 
      <url-pattern>*.vm</url-pattern> 
   </servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

Será q algo esta errado???

E os jar q estao dentro da lib são esses:

:arrow: commons-beanutils
:arrow: commons-collections
:arrow: commons-digester
:arrow: commons-logging
:arrow: commons-validator
:arrow: dom4j
:arrow: servlet
:arrow: struts
:arrow: velocity-1.4
:arrow: velocity-dep-1.3.1
:arrow: velocity-dep-1.4
:arrow: velocity-tools-1.1
:arrow: velocity-tools-generic-1.1
:arrow: velocity-tools-view-1.1

Eu estou usando umas bibliotecas a mais, pq vou usar futuramente, como o structs.jar por exemplo.
Se voces repararem bem, eu tenho uma redundância. Tenho as duas versões do velocity. A 1.3 e a 1.4
Mas se eu tirar um das duas dá pau…por isso estou usando elas juntas…será q tem algum problema???

Não sei o q fazer…

Alguem pode me ajudar???

Lipe, valeu pela dica anterior.

Gotta Go []

Renan

caiofilipini

Você está inicializando o Velocity no seu Servlet?

oliveirarenan

sim…

Template template = Velocity.getTemplate("velocityPages.html");

Naum seria isso???

caiofilipini

“oliveirarenan”:
Template template = Velocity.getTemplate("velocityPages.html");

Naum seria isso???

Não, não. Pra inicializar o VelocityEngine, vc precisa disso:

VelocityEngine ve = new VelocityEngine(); ve.init();

Tem um exemplo no artigo “Introdução ao Velocity”, aqui no GUJ:
http://www.guj.com.br/user.article.get.chain?article.id=18&page=1

[]'s

oliveirarenan

Caio, meu servlet naum seria assim???

package com.infoserver.renan.Servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;

public class VelocityTeste extends HttpServlet {


	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		VelocityContext vc = new VelocityContext();
		ArrayList lista = new ArrayList();
		lista.add("Valor 1");
		lista.add("Valor 2");
		lista.add("Valor 3");
		lista.add("Valor 4");
		lista.add("Valor 5");
		vc.put("lista",lista);
		try {
			Template template = Velocity.getTemplate("velocityPages.html");
			response.setContentType("text/html");
			template.merge(vc,response.getWriter());
		} catch (ResourceNotFoundException e) {
			e.printStackTrace();
		} catch (ParseErrorException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void init(ServletConfig config) throws ServletException {
		Properties properties = new Properties();
		properties.setProperty("file.resource.loader.path",config.getServletContext().getRealPath("/"));
		try {
			Velocity.init(properties);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Bem, aonde eu colocaria essa sua citação?

Código: 
VelocityEngine ve = new VelocityEngine(); 
ve.init();

Valeuz

Renan

caiofilipini

Logo no começo do método doGet(), antes de criar o VelocityContext. :wink:

[]'s

oliveirarenan

Caio, valeu pela dica…

fui…

Renan

_fs

hehe burro eu :smiley:

ao inves de ficar dando init() no velocity não basta colocar o <load-on-startup> = 1?

caiofilipini

No caso dele, acho que não adianta, pq ele é que tá implementando o Servlet. Se bem que, não tenho certeza, mas acho que se o VelocityServlet já faz a inicialização do VelocityEngine, não faz? Se fizer, o Servlet dele pode estender VelocityServlet, e aí sim o <load-on-startup> funcionaria. :wink:

[]'s

leonardom

Acho mais mais vc extender a class VelocityServlet, esta classe vem junto com .jar do velocity, ai vc sobreescreve o método handleRequest:

public Template handleRequest&#40;HttpServletRequest req, HttpServletResponse res, Context context&#41; &#123;

    ArrayList lista = new ArrayList&#40;&#41;;
    lista.add&#40;"Valor 1"&#41;;
    lista.add&#40;"Valor 2"&#41;;
    lista.add&#40;"Valor 3"&#41;;
    lista.add&#40;"Valor 4"&#41;;
    lista.add&#40;"Valor 5"&#41;;
    
    context.put&#40;"lista",lista&#41;;

    Template t = null;

    try &#123;
        t = getTemplate&#40;"velocityPages.html"&#41;;
    &#125;
    catch&#40;Exception e&#41; &#123;
        e.printStackTrace&#40;&#41;;
    &#125;

    return t;
&#125;
oliveirarenan
Acho mais mais vc extender a class VelocityServlet, esta classe vem junto com .jar do velocity, ai vc sobreescreve o método handleRequest&#58;

humm… q método é esse handleRequest???
Na verdade eu não tenho ele no meu servlet…eu teria q substituir pelo doGet???

nossa, acho q não estou entendendo mais nada… :lol: :lol: :lol: :lol:

[]´s

Renan

leonardom

don´t panic Renan!!!

VelocityServlet eh uma Servlet especial que facilita e muito o trabalho para vc. Ela se encarrega de chamar o método handleRequest automaticamente para vc. As alterações que vc deve, fazer é ao inves de extender a class HttpServlet, extenda a classe VelocityServet, esqueça o método doGet e trabalhe no método handleRequest, nele vc coloca os atributos no contexto do velocity e retorna o template desejado. Soh para ficar mais claro seu exemplo ficaria assim:

package com.infoserver.renan.Servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.VelocityServlet;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;

public class VelocityTeste extends VelocityServlet &#123;


   public Template handleRequest&#40;HttpServletRequest request, HttpServletResponse response, Context context&#41; &#123;

      ArrayList lista = new ArrayList&#40;&#41;;
      lista.add&#40;"Valor 1"&#41;;
      lista.add&#40;"Valor 2"&#41;;
      lista.add&#40;"Valor 3"&#41;;
      lista.add&#40;"Valor 4"&#41;;
      lista.add&#40;"Valor 5"&#41;;

      context.put&#40;"lista",lista&#41;;

      Template template = null;

      try &#123;
         template = getTemplate&#40;"velocityPages.html"&#41;;
      &#125; catch &#40;ResourceNotFoundException e&#41; &#123;
         e.printStackTrace&#40;&#41;;
      &#125; catch &#40;ParseErrorException e&#41; &#123;
         e.printStackTrace&#40;&#41;;
      &#125; catch &#40;Exception e&#41; &#123;
         e.printStackTrace&#40;&#41;;
      &#125;

       return template;
   &#125;
&#125;
oliveirarenan

Cara, valeu…

E gostei do “Don´t Panic”…

Agora estou mais aliviado…e menos confuso… :lol:

Criado 25 de agosto de 2004
Ultima resposta 26 de ago. de 2004
Respostas 14
Participantes 4