Servlet e Velocity

6 respostas
Bruno_Cardoso

Boas,

Tentei fazer um servlet bastante simples q carregasse um template com o velocity, este codigo n tem nenhuma utilidade pratica mas era apenas um exemplo para eu testar o uso de Velocity com Servlets, infelizmente esta dando um erro e eu nao faço a minima ideia o q estou a fazer de errado, provavelmente será algo nos outputs...

package com.metallum;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import org.apache.velocity.app.*;
import org.apache.velocity.*;

public class UserRegister extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException {
		try {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter(); // Output variable
			//Velocity
			VelocityEngine ve = new VelocityEngine();
			ve.init();
			VelocityContext vc = new VelocityContext();
			Template t = ve.getTemplate("registForm.vm");
     		StringWriter writer = new StringWriter();
			t.merge(vc, writer);
			System.out.println(writer.toString());
			out.print(writer.toString());
		} catch (IOException e) {
			System.out.println(e);
		} catch (Exception e) {
			System.out.println(e); 
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException {
		doGet(request, response);
	}
}

Se alguem me puder ajudar e perceber o q esta errado... Obrigado.

PEACE!

6 Respostas

Rafael_Steil

Tive fora as chamadas a

System.out.println(writer.toString());
out.print(writer.toString());

apenas “t.merge(vc, writer);” ja eh suficiente.

Se voce qusier simplificar, use VelocityServlet ao inves de HttpServlet:

public class UserRegister extends VelocityServlet {
public Template handleRequest(HttpServletRequest request,
		HttpServletResponse response, Context context) throws IOException
{
         Template t = getTemplate("registForm.vm");
         
         return t;
   }

}

Rafael

Bruno_Cardoso

Boas,

Rafael, fiz o que voce disse mas continua a dar erro na mesma...

package com.metallum;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import org.apache.velocity.app.*;
import org.apache.velocity.*;

public class UserRegister extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException {
		try {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter(); // Output variable
			//Velocity
			VelocityEngine ve = new VelocityEngine();
			ve.init();
			VelocityContext vc = new VelocityContext();
			Template t = ve.getTemplate("registForm.vm");
     		StringWriter writer = new StringWriter();
			t.merge(vc, writer);
		} catch (IOException e) {
			System.out.println(e);
		} catch (Exception e) {
			System.out.println(e); 
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException {
		doGet(request, response);
	}
}

o q sera?

Erro:
javax.servlet.ServletException: Error instantiating servlet class com.metallum.UserRegister
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:911)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:666)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
......

java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Class.java:1590)
	at java.lang.Class.getConstructor0(Class.java:1762)
	at java.lang.Class.newInstance0(Class.java:276)
	at java.lang.Class.newInstance(Class.java:259)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper
...............

PEACE!

Rafael_Steil

Veja o erro:

java.lang.NoClassDefFoundError: org/apache/velocity/context/Context

Esta dizendo que nao encontrou esta classe ao rodar o Servlet. Voce esta com o jar do Velocity configurado corretamente na sua aplicacao ( ou seja, ele esta dentro do diretorio WEB-INF/lib ? )

Rafael

Bruno_Cardoso

ok, coloquei os os ficheiros velocity-1.3.jar e velocity-dep-1.3.jar dentro de WEB-INF/lib e agora já não dá erros, o problema agora é q ele não consegue encontrar o ficheiro registForm.vm, já experimentei po-lo em varios sitios… mas n esta a dar, sabe onde é q eles devem ser colocados?

Rafael_Steil

Existe uma diretiva chamada “file.resource.loader.path”. Use ela para especificar o diretorio base de carregamento dos templates. Por exemplo, digamos que voce tenha criado do diretorio “templates” na raiz da tua aplicacao. Para setar ele como base, faca da seguinte maneira:

Properties velocityProperties = new Properties();
velocityProperties.setProperty("file.resource.loader.path", getServletContext().getRealPath("/templates"));
ve.init(velocityProperties);

Rafael

Bruno_Cardoso

Já consegui! Finalmente heh… Rafael, voçê rula! Obrigado pela ajuda :slight_smile:

PEACE!

Criado 14 de fevereiro de 2003
Ultima resposta 15 de fev. de 2003
Respostas 6
Participantes 2