Escolar Documentos
Profissional Documentos
Cultura Documentos
http://vraptor.caelum.com.br
ndice
10
13
17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
21
25
27
29
30
31
32
Version: 14.1.10
ii
C APTULO
@Path("produto/{produto.id}")
quando digitava a URI /produto/1/ e o link no funcionava, segue abaixo uma modificao que corrige o
problema.
Nota do editor
Isso no necessariamente um problema... a URL /abc diferente da /abc/ portanto o comportamento de dar 404 o esperado. Mas se voc quiser que sejam urls equivalentes voc pode
escrever a classe abaixo.
import
import
import
import
import
import
import
import
import
br.com.caelum.vraptor.Result;
br.com.caelum.vraptor.core.RequestInfo;
br.com.caelum.vraptor.http.route.ResourceNotFoundException;
br.com.caelum.vraptor.http.route.Router;
br.com.caelum.vraptor.ioc.Component;
br.com.caelum.vraptor.ioc.RequestScoped;
br.com.caelum.vraptor.resource.DefaultResourceNotFoundHandler;
br.com.caelum.vraptor.resource.HttpMethod;
br.com.caelum.vraptor.view.Results;
@Component
@RequestScoped
public class Error404 extends DefaultResourceNotFoundHandler
private final Router router;
private final Result result;
public Error404(Router router, Result result) {
this.router = router;
this.result = result;
}
@Override
public void couldntFind(RequestInfo requestInfo) {
try {
String uri = requestInfo.getRequestedUri();
if (uri.endsWith("/")) {
1
C APTULO
@Component
@SessionScoped
public class UserInfo {
private User user;
}
// getter e setter
e se voc quiser usar ou colocar o usurio na sesso, de dentro de algum Controller, por exemplo, voc
pode receber essa classe que voc acabou de criar no construtor:
@Resource
public class LoginController {
private UserInfo info;
public LoginController(UserInfo info) {
this.info = info;
}
//...
public void login(User user) {
//valida o usuario
this.info.setUser(user);
}
E para acessar esse usurio a partir da view, existe um atributo no HttpSession com o nome userInfo,
assim voc pode usar numa jsp:
${userInfo.user}
C APTULO
@Component
@ApplicationScoped //ou @RequestScoped se fizer mais sentido
public class EnviadorDeEmailFactory implements ComponentFactory<EnviadorDeEmail> {
private EnviadorDeEmail enviador;
public EnviadorDeEmail(ServletContext context) {
if ("producao".equals(context.getInitParameter("tipo.de.ambiente"))) {
enviador = new EnviadorDeEmailPadrao();
} else {
enviador = new EnviadorDeEmailFalso();
}
}
C APTULO
result.use(Results.page()).forward(url);
e tenta passar uma URL que tratada por alguma lgica da sua aplicao, o VRaptor vai lanar uma
exceo falando para voc usar o result.use(logic()) correspondente. Por exemplo:
Se voc quiser desabilitar esta exceo, voc pode criar a seguinte classe:
@Component
public class MyPageResult extends DefaultPageResult {
// delega o construtor
@Override
protected void checkForLogic(String url, HttpMethod httpMethod) {
//nada aqui, ou algum outro tipo de checkagem
}
}
C APTULO
http://www.lucas.hgt.nom.br/wordpress/?p=107
Algum tempo sem atualizar as coisas por aqui, resolvi tirar um tempo para me atualizar no framework que
acompanho j faz algum tempo, VRAPTOR.
Ultimamente tenho utilizado o Maven para controlar as dependncias de Jars das aplicaes que trabalho, e
tem me ajudado bastante. Ento resolvi tirar um tempo para gerar um POM para o VRaptor, j que na estrutura
original dele esse arquivo no o acompanha.
Utilizei o Eclipse com suporte ao Maven para gerar o projeto aps ter gerado o POM do VRaptor.
Alguns passos para se ter sucesso na criao da estrutura:
1) Faa o download do Vraptor e coloque o seu jar numa pasta qualquer.
2) Instale o Maven ou utilize o recurso que est disponvel em sua IDE.
3) Execute o comando abaixo:
repositrio
local
Caelum VRaptor
</dependency>
<dependency>
<groupId>com.thoughtworks.paranamer</groupId>
<artifactId>paranamer</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>com.google.code.google-collections</groupId>
<artifactId>google-collect</artifactId>
<version>snapshot-20080530</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.8.0.GA</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
Captulo 5 - Gerando aplicao com VRaptor3 usando Maven - 7
Caelum VRaptor
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>net.vidageek</groupId>
<artifactId>mirror</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>2.7.3</version>
<exclusions>
<exclusion>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
</dependencies>
</project>
5) Crie um projeto Maven.
6) Edite o pom.xml do mesmo com o seguinte contedo:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>GERALMENTE_ESTRUTURA_DO_PACKAGE</groupId>
<artifactId>ARTIFACT_ID_QUE_DESEJAR</artifactId>
<packaging>war</packaging>
<name>NOME_QUE_DESEJAR</name>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>br.com.caelum</groupId>
<artifactId>vraptor</artifactId>
<version>3.0.0-SNAPSHOT</version>
Captulo 5 - Gerando aplicao com VRaptor3 usando Maven - 8
</dependency>
</dependencies>
</project>
7) Clique com boto direito, opo Maven, update dependecies
Pronto, libs adicionadas ao projeto, tudo organizado para iniciar as atividades.
C APTULO
@Component
public class TilesPathResolver
implements PathResolver {
static final String VIEW_SUFIX = ".tiles";
10
Caelum VRaptor
Se voc no quiser utilizar a classe StringUtils do projeto commons-lang, voc pode alterar o metodo para:
package xpto.admin;
@Resource
public class CustomerController {
public List<Customer> list() {
return myServiceClass.listAllCustomers();
// ser redirecionado para a definio admin.customer.list
}
}
<definition name="admin.customer.list" extends="default">
http://tiles.apache.org/
VRaptor View e PathResolver: http://vraptor.caelum.com.br/documentacao/view-e-ajax/
Apache Tiles:
C APTULO
Tomaz
Lavieri,
no
vraptor3-interceptando-recursos-anotados/
blog
http://blog.tomazlavieri.com.br/2009/
Em primeira lugar, gostaria de tecer meus mais sinceros elogios a equipe VRaptor, a verso 3 esta muito
boa, bem mais intuitiva e fcil de usar que a 2.6
Neste artigo vou mostar como interceptar um mtodo de um Resource especifico, identificando-o a partir de
uma anotao e executar aes antes do mtodo executar, e aps ele executar.
Vamos supor que ns temos o seguinte Resource para adicionar produtos no nosso sistema
@Resource
public class ProdutoController {
private final DaoFactory factory;
private final ProdutoDao dao;
public ProdutoController(DaoFactory factory) {
this.factory = factory;
this.dao = factory.getProdutoDao();
}
public List<Produto> listar() {
return dao.list();
}
public Produto atualizar(Produto produto) {
try {
factory.beginTransaction();
produto = dao.update(produto);
factory.commit();
return produto;
} catch (DaoException ex) {
factory.rollback();
throw ex;
}
}
public Produto adicionar(Produto produto) {
try {
factory.beginTransaction();
produto = dao.store(produto);
factory.commit();
return produto;
} catch (DaoException ex) {
factory.rollback();
throw ex;
}
}
13
Caelum VRaptor
}
Agora nos queremos que um interceptador intercepte meu recurso, e execute a lgica dentro de um escopo
transacional, como fazer isso? s criar um interceptador assim.
import org.hibernate.Session;
import org.hibernate.Transaction;
import
import
import
import
br.com.caelum.vraptor.Intercepts;
br.com.caelum.vraptor.core.InterceptorStack;
br.com.caelum.vraptor.interceptor.Interceptor;
br.com.caelum.vraptor.resource.ResourceMethod;
@Intercepts
public class TransactionInterceptor implements Interceptor {
private final Session session;
public HibernateTransactionInterceptor(Session session) {
this.session = session;
}
public void intercept(InterceptorStack stack, ResourceMethod method,
Object instance) {
Transaction transaction = null;
try {
transaction = session.beginTransaction();
stack.next(method, instance);
transaction.commit();
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
}
}
public boolean accepts(ResourceMethod method) {
return true; //aceita todas as requisies
}
}
Ok, o interceptador vai rodar e abrir transao antes e depois de executar a logica, e os mtodos transacionais da minha lgica iro se reduzir a isto
return dao.update(produto);
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Usado para garantir que um determinado recurso interceptado seja executada em um
* escopo de transao.
* @author Tomaz Lavieri
* @since 1.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Transactional {}
Agora precisamos marcar os pontos onde queremos que o escopo seja transacional com esta anotao.
@Resource
public class ProdutoController {
private final ProdutoDao dao;
public ProdutoController(ProdutoDao dao) {
this.dao = dao;
}
public List<Produto> listar() {
return dao.list();
}
@Transactional
public Produto atualizar(Produto produto) {
return dao.update(produto);
}
@Transactional
public Produto adicionar(Produto produto) {
return dao.store(produto);
}
Ok o cdigo ficou bem mais enxuto, mas como interceptar apenas os mtodos marcados com esta anotao?? para tal basta no nosso accepts do TransactionInterceptor verificarmos se a anotao esta presente
no mtodo, ou no proprio rescurso (quando marcado no recurso todos os mtodos do recurso seriam transacionais).
A modificao do mtodo ficaria assim
method
.getMethod() //metodo anotado
.isAnnotationPresent(Transactional.class)
|| method
.getResource() //ou recurso anotado
.getType()
.isAnnotationPresent(Transactional.class);
Caelum VRaptor
Pronto agora somente os mtodos com a anotao @Transacional so executados em escopo de transao
e economisamos linhas e linhas de cdigos de try{commit}catch{rollback throw ex}
C APTULO
Mrio
Peixoto
no
blog
job-scheduling-com-vraptor3-e-spring3/
http://mariopeixoto.wordpress.com/2009/11/17/
Este artigo tem como objetivo mostrar um caminho simples para fazer job scheduling no vRaptor3 quando o
Spring for o seu container IoC sem que seja necessrio o uso de XML para configurao.
Verses utilizadas:
vRaptor 3.0.2
Spring 3.0.0.RC2
@Component
@ApplicationScoped
public class TaskSchedulerFactory implements ComponentFactory<TaskScheduler> {
private ThreadPoolTaskScheduler scheduler;
@PostConstruct
public void create() {
scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
}
public TaskScheduler getInstance() {
return scheduler;
}
@PreDestroy
public void destroy() {
scheduler.destroy();
}
}
Neste exemplo utilizaremos o ThreadPoolTaskScheduler como implementao para o TaskScheduler, porm
vrias outras classes vem com o Spring e podem ser usadas da mesma maneira (documentao).
17
Caelum VRaptor
8.2- As Tasks/Jobs
Vamos criar interfaces para nossas tasks.
@Component
@ApplicationScoped
public class MyFirstApplicationTask implements ApplicationTask {
public MyFirstApplicationTask(TaskScheduler scheduler) {
//Aqui voc poder receber componentes que no estejam em
//escopo de request ou session
...
this.schedule(scheduler);
}
public void schedule(TaskScheduler scheduler) {
scheduler.schedule(this, new CronTrigger("0 0 23 * * *"));
//Neste caso, a task rodar sempre s 23h0min0s
}
}
Registrando tasks em escopo de request
Para registrar esse tipo de task, basta receber o scheduler no construtor do seu Resource e registrar a task
no mtodo adequado.
@Component
@RequestScoped
public class MyFirstRequestTask implements RequestTask {
public MyFirstApplicationTask() {
//Aqui voc poder receber qualquer componente que precisar
...
}
public void schedule(TaskScheduler schedule) {
Calendar now = GregorianCalendar.getInstance();
now.add(Calendar.MINUTE,5);
scheduler.schedule(this, now.getTime());
//Neste caso, a task rodar apenas uma vez, 5 min depois da
//execuo deste mtodo
}
}
@Resource
public class MyResource {
private MyFirstRequestTask task;
Captulo 8 - Job Scheduling com vRaptor3 e Spring - As Tasks/Jobs 18
Caelum VRaptor
8.3- Observaes
Criamos 3 interfaces, pois deste modo ficar mais fcil injetar diferentes tipos de tasks no construtor, por
exemplo podemos receber todas as tasks em escopo de request dentro de um resource assim:
@Resource
public class MyResource {
private List<RequestTask> tasks;
private TaskScheduler scheduler;
public MyResource(List<RequestTask> tasks, TaskScheduler scheduler) {
this.tasks = tasks;
this.scheduler = scheduler;
}
...
public void tasksInit() {
for (RequestTask task : tasks) {
task.schedule(scheduler);
}
}
...
}
@Component
@PrototypeScoped
public class MyPrototypedDAO extends ... implements ... {
private Session session;
public MyPrototypedDAO(SessionFactory sessionFactory) {
this.session = sessionFactory.openSession();
}
Captulo 8 - Job Scheduling com vRaptor3 e Spring - Observaes 19
...
Deste modo, ser criado uma instncia do seu DAO para cada requisio de instncia (l-se: sempre que
voc receber uma instncia pelo construtor, ser uma nova), assim como uma Session separada.
C APTULO
Tomaz
Lavieri
no
blog
Objetivo: Ao final deste artigo espera-se que voc saiba como poupar recursos caros, trazendo eles de
forma LAZY, ou como prefiro chamar Just-in-Time (no momento certo).
No VRaptor3 a injeo de dependncia ficou bem mais fcil, os interceptadores que eram os responsveis
para injetar a dependncia sumiram e agora fica tudo a cargo do container, que pode ser o Spring ou o Pico.
A facilidade na injeo de dependencia tem um custo, como no mais controlado pelo programador que
cria o interceptor sempre que declaramos uma dependncia no construtor de um @Component, @Resource ou
@Intercepts ele injetado no incio, logo na construo, porm s vezes o fluxo de um requisio faz com que
no usemos algumas destas injees de dependncia, disperdiando recursos valiosos.
Por exemplo, vamos supor o seguinte @Resource abaixo, que cadastra produtos
import java.util.List;
import org.hibernate.Session;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
@Resource
public class ProdutoController {
/**
* O recurso que queremos poupar.
*/
private final Session session;
private final Result result;
public ProdutoController(final Session session, final Result result) {
this.session = session;
this.result = result;
}
/**
* apenas renderiza o formulrio
*/
public void form() {}
public List<Produto> listar() {
return session.createCriteria(Produto.class).list();
}
public Produto adiciona(Produto produto) {
session.persist(produto);
21
Caelum VRaptor
result.use(Results.logic()).redirectTo(getClass()).listar();
return produto;
Sempre que alguem faz uma requisio a qualquer lgica dentro do recurso ProdutoController uma
Session aberta, porem note que abrir o formulrio para adicionar produtos no requer sesso com o banco,
ele apenas renderiza uma pgina, cada vez que o formulrio de produtos aberto um importante e caro recurso
do sistema esta sendo requerido, e de forma totalmente ociosa.
Nota do editor
criada no mximo uma Session por requisio. A mesma coisa para qualquer componente Request scoped.
Como agir neste caso? Isolar o formulrio poderia resolver este problema mais recairia em outro, da mantenabilidade.
O ideal que este recurso s fosse realmente injetado no tempo certo (Just in Time) como seria possvel
fazer isso? A soluo usar proxies dinmicos, enviando uma Session que s realmente abrir a conexo com
o banco quando um de seus mtodos for invocado.
import java.lang.reflect.Method;
import
import
import
import
import
import
import
import
import
import
import
javax.annotation.PreDestroy;
org.hibernate.classic.Session;
org.hibernate.SessionFactory;
net.vidageek.mirror.dsl.Mirror;
br.com.caelum.vraptor.ioc.ApplicationScoped;
br.com.caelum.vraptor.ioc.Component;
br.com.caelum.vraptor.ioc.ComponentFactory;
br.com.caelum.vraptor.ioc.RequestScoped;
br.com.caelum.vraptor.proxy.MethodInvocation;
br.com.caelum.vraptor.proxy.Proxifier;
br.com.caelum.vraptor.proxy.SuperMethod;
/**
* <b>JIT (Just-in-Time) {@link Session} Creator</b> fbrica para o
* componente {@link Session} gerado de forma LAZY ou JIT(Just-in-Time)
* a partir de uma {@link SessionFactory}, que normalmente se encontra
* em um ecopo de aplicativo @{@link ApplicationScoped}.
*
* @author Tomaz Lavieri
* @since 1.0
*/
@Component
@RequestScoped
public class JITSessionCreator implements ComponentFactory<Session> {
private static final Method CLOSE =
new Mirror().on(Session.class).reflect().method("close").withoutArgs();
private static final Method FINALIZE =
new Mirror().on(Object.class).reflect().method("finalize").withoutArgs();
Caelum VRaptor
@PreDestroy
public void destroy() { // *5*
if (session != null && session.isOpen()) {
session.close();
}
}
O Proxfier um objeto das libs do VRaptor que auxilia na criao de objetos proxys ele responsvel por
escolher a biblioteca que implementa o proxy dinmico, e ento invocar via callback um mtodo interceptor,
como falamos abaixo.
Neste ponto temos a implementao do nosso interceptor, sempre que um mtodo for invocado em nosso
proxy, esse intereptor invocado primeiro, ele filtra as chamadas ao mtodo finalize caso a Session real
Captulo 9 - Poupando recursos - LAZY Dependency Injection - 23
ainda no tenha sido criada, isso evita criar a Session apenas para finaliza-la. O mtodo close tambm
filtrado, isso feito para evitar criar uma session apenas para fech-la, e tambm por que o nosso
SessionCreator que o responsavel por fechar a session ao final do scopo, quando a request acabar.
Todos os outros mtodos so repassados para uma session atravs do mtodo getSession() onde
realmente que acontece o LAZY ou JIT.
Aqui onde acontece a mgica, da primeira vez que getSession() invocado a sesso criada, e ento
repassada, todas as outras chamadas a getSession() repassam a sesso anteriormente criada, assim,
se getSession() nunca for invocado, ou seja, se nenhum mtodo for invocado no proxy, getSession()
nunca ser invocado, e a sesso real no ser criada.
O retorno desse ComponentFactory a Session proxy, que s criar a session real se um de seus mtodos
for invocado.
Ao final do escopo o destroy invocado, ele verifica se a session real existe, existindo verifica se esta
ainda esta aberta, e estando ele fecha, desta forma possivel garantir que o recurso ser sempre liberado.
Assim podemos agora pedir uma Session sempre que acharmos que vamos precisar de uma, sabendo que
o recurso s ser realmente solicitado quando formos usar um de seus mtodos, salvando assim o recurso.
Esta mesma abordagem pode ser usada para outros recursos caros do sistema.
Os cdigos fonte para os ComponentFactory de EntityManager e Session que utilizo podem ser encontrados
neste link:
http://guj.com.br/posts/list/141500.java
C APTULO
10
@Intercepts
@RequestScoped
public class NoCacheInterceptor
implements Interceptor {
private final HttpServletResponse response;
public NoCacheInterceptor(HttpServletResponse response) {
this.response = response;
}
@Override
public boolean accepts(ResourceMethod method) {
return true; // allow all requests
}
@Override
public void intercept(InterceptorStack stack, ResourceMethod method,
Object resourceInstance)
throws InterceptionException {
// set the expires to past
response.setHeader("Expires", "Wed, 31 Dec 1969 21:00:00 GMT");
// no-cache headers for HTTP/1.1
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// no-cache headers for HTTP/1.1 (IE)
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// no-cache headers for HTTP/1.0
response.setHeader("Pragma", "no-cache");
stack.next(method, resourceInstance);
Voc pode tambm criar uma anotao para que apenas as classes anotadas evitem o cache.
@Target({ElementType.METHOD, ElementType.TYPE})
25
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface NoCache {
}
E alterar o mtodo accepts do interceptor para o cdigo abaixo:
@Override
public boolean accepts(ResourceMethod method) {
return method.containsAnnotation(NoCache.class);
}
C APTULO
11
@Component
@ApplicationScoped
public class ObjectifyFactoryCreator
implements ComponentFactory<ObjectifyFactory> {
private final ObjectifyFactory instance = new ObjectifyFactory();
@PostConstruct
public void create() {
instance.register(MyFirstEntity.class);
instance.register(MySecondEntity.class);
}
Aps criamos a classe que vai ser responsvel por criar as intncias de Objectify. Como precisamos de
uma nica instncia para cada requisio, o escopo deste componente ser request.
@Component
@RequestScoped
public class ObjectifyCreator
implements ComponentFactory<Objectify> {
private final ObjectifyFactory factory;
private Objectify ofy;
public ObjectifyCreator(ObjectifyFactory factory) {
this.factory = factory;
}
@PostConstruct
public void create() {
ofy = factory.begin();
}
public Objectify getInstance() {
return ofy;
27
C APTULO
12
C APTULO
13
result.use(referer()).redirect();
O problema em usar o Referer que ele no obrigatrio. Ento quando o Referer no vem na requisio,
o VRaptor vai lanar uma IllegalStateException, e assim voc pode especificar uma outra lgica para ir caso o
Referer no seja especificado:
try {
result.use(referer()).redirect();
} catch (IllegalStateException e) {
result.use(logic()).redirectTo(HomeController.class).index();
}
C APTULO
14
http://en.wikipedia.org/wiki/Mod_jk
http://wiki.locaweb.com.br/pt-br/Tomcat_integrado_com_o_Apache
A configurao sugerida pela Locaweb leva em conta que a sua aplicao no usa nenhum framework,
apenas arquivos jsps e servlets configurado pelo arquivo web.xml.
Como o VRaptor no usa o web.xml para definir as urls a configurao sugerida pela Locaweb no funcionar. Para funcionar voc precisa abrir um chamado na Locaweb informando que gostaria de usar o framework e escrever a seguinte regra: JkMount /* [login] >> TOMCAT e a pasta do servidor que deseja aplicar a regra
caso no seja a raiz.
Aguarde a resposta do chamado para saber quando estar funcionando. O procedimento leva +- 24h para
eles realizarem, ento pea com antecedncia.
Aps isso basta enviar a sua aplicao para a Locaweb e reinicar o ambiente que ela estar funcionando. A Locaweb no aceita deploy com arquivos WAR, para enviar os arquivos pelo WAR voc
precisaria envi-lo pelo FTP e depois descompactar pelo SSH. Se voc est usando o eclipse para
desenvolver a sua aplicao e o recurso servers do prprio eclipse, a sua aplicao fica dentro de
workspace/.metadata/.plugins/org.eclipse.wst.server.core. Dentro deve ter algumas pasta tmp isso vai de
acordo com a quantidade de servidores que voc tenha, alguma delas deve ser a sua aplicao. Como a
aplicao est disposta dentro desta pasta, ela poderia ir para a locaweb e ser executada. Essa no a melhor
de fazer o deploy, mas uma das aceitas neste tipo de ambiente na Locaweb.
A Locaweb define um timeout de 15 segundos em suas conexes MySQL, se voc tiver usando este
banco e no atentar para isso ter problemas, para contornar essa problema voc pode seguir a sugesto da Locaweb
ou configurar o c3p0 como descrito nesse post
respeitando o tempo imposto pela Locaweb.
http://wiki.locaweb.com.br/pt-br/Resolvendo_Problemas_Conex%C3%A3o_JAVA_
com_MYSQL
http://blog.caelum.com.br/2009/10/19/
a-java-net-socketexception-broken-pipe/
C APTULO
15
http://www.guj.com.br/posts/list/215206.java#1098196
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>2.2.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
No web.xml:
Caelum VRaptor
TilesPathResolver?
Nessa abordagem, no necessrio criar implementar esse PathResolver, j que essa responsabilidade
continuar sendo do VRaptor. ;D
/WEB-INF/jsp/template.jsp - servir de base para todas as pginas
@Resource
public class HomeController {
private Result result;
public HomeController(final Result result) {
}
}
super();
this.result = result;
Caelum VRaptor
Prontinho! Estamos utilizando o tiles apenas para montar o template das pginas, o redirecionamento
continua sendo cargo do VRaptor! ^^
S tem um detalhe que eu gostaria de compartilhar, pois me deu muito trabalho de descobrir: suponha que
eu queria estender o template.jsp para incluir um outro body. (tive essa necessidade na seo about do site..)
/WEB-INF/jsp/about/about_base.jsp - base que estender a template.jsp para alterar o layout