[Logo] Mentawai Recipes
  [Search] Search   [Recent Topics] Recent Topics   [Hottest Topics] Hottest Topics   [Members]  Member Listing   [Groups] Back to home page 
[Moderation Log] Moderation Log   [Register] Register / 
[Login] Login 
Messages posted by: rodrigo.avila
Forum Index » Profile for rodrigo.avila » Messages posted by rodrigo.avila
Author Message
If you don't have any i18n file, follow this link:
http://www.mentaframework.org/i18n.jsp

if you want create your own DisplayTags, follow this link:
http://recipes.mentaframework.org/posts/list/34.page

To use internationalization in DisplayTags, do the following:

1) Create your taglib. For example:



2) Flaunt your taglib where are the i18n files. To do that, use



inside your getStringToPrint() method. After that, use



to get the internationalized text.

The first string is the path to your master file, from the application root. loc is the user localeé o locale do usuário, available automagically inside the class.

See the code:



Master file:

/i18n/master_pt_BR.i18n


/i18n/master_en_US.i18n
The Mentawai logging system is very simple and non-intrusive. To use it, follow these steps:

1) Activate the logging system in ApplicationManager:


2) Use:


3) See the logged text in
O sistema de logging do Mentawai é os mais simples possível e não-intrusivo. Para usá-lo, siga os passos a seguir:

1) Ative o sistema de logging no ApplicationManager:


2) Use:


3) Veja o conteúdo logado em
Se você não tiver nenhum arquivo i18n, veja este link:
http://www.mentaframework.org/i18n.jsp

Se você quiser criar suas próprias DisplayTags, veja este post:
http://recipes.mentaframework.org/posts/list/34.page

Para usar internacionalização nas suas DisplayTags, faça o seguinte:

1) Crie a sua taglib. Um exemplo:



2) Mostre para a sua taglib onde está os seus arquivos i18n. Para isto, use o método



dentro do seu método getStringToPrint(). Depois, use



para pegar os textos internacionalizados.

A primeira string é o local onde está seu arquivo master, a partir do root de sua aplicação. loc é o locale do usuário, disponível automagicamente dentro de sua classe.

Veja como fica o código:



Arquivos master:

/i18n/master_pt_BR.i18n


/i18n/master_en_US.i18n
O suporte do Mentawai a POJO Actions , junto com seus poderosos filtros, permite que você escreva a sua aplicação web com desacoplamento total do framework.

Para um exemplo completo, sinta-se à vontade para baixar as duas implementações da aplicação MyBooks: (use o arquivo mybooks.sql, incluso no arquivo zip, para criar o database MySQL do MyBooks).

MyBooks-ACTION.zip - As Actions e modelos de negócio estão separados. As Actions estão acopladas ao Mentawai. O modelo de negócio não está acoplado.

MyBooks-POJO.zip - As Actions e modelos de negócio estão todos juntos em uma única classe, totalmente desacoplada do framework Mentawai.

Dê uma olhada nos códigos abaixo:

ACTION version:

MyBooks-ACTION ApplicationManager.java

MyBooks-ACTION BookAction.java

MyBooks-ACTION BookService.java


Agora, a versão com POJO Actions:

MyBooks-POJO ApplicationManager.java

MyBooks-POJO BookService.java
Com o Mentawai você pode escrever POJO Actions simples sem acoplar nada ao framework.

Quando falo em contexto da action me refiro a: Application, Session, Input, Output, Cookies, Locale, Headers, Method (POST ou GET), Messages, Errors e Field Errors. Para cada um desses, existe um filtro que é usado para injetar o valor correspondente ou a estrutura de dados dentro do modelo.

Aqui temos um exemplo com todos os filtros:


Agora, dentro do seu POJO Action, você pode fazer o seguinte:

Fique à vontade para adicionar todos estes filtros em sua aplicação, mesmo se suas actions nunca precisem dele. Isto porque todos esses filtros são PULL, ou seja, os objetos serão instanciados e criados se, e apenas se, a action precisar/depender deles.

Uma outra opção é usar um ActionContextFilter, que tem um único Map<String, Object> com tudo dentro. Dê uma olhada:

Agora dentro de sua action você pode:

Note que, com isto, a sua action fica totalmente desacoplada do framework.
Pelo fato do Scala ser compilado em Java bytecode, você pode criar a sua aplicação web usando o Scala ao invés de Java.

Veja abaixo um exemplo de action do mentawai escrito em Scala:

Compile a sua classe Scala com o seginte comando:

Isto vai criar um arquivo HelloScala.class dentro do seu diretório org\mentablank\action. Agora você pode usar esta classe da mesma forma como usa qualquer outra classe Java. Só não se esqueça de colocar o scala-library.jar dentro do seu diretório WEB-INF/lib.

Vamos usar o javap, que vem com o Scala, para ver a nossa classe Scala do ponto de vista de um programa Java:

Isto nos dá algumas dicas sobre a classe Java, mas não há nada como decompilar a classe usando o JAD (Java Decompiler):

Fique à vontade para usar o Scala com o Mentawai!

Para aprender mais sobre o Scala, consulte os seguintes sites:

http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-1
http://alblue.blogspot.com/2007/10/scala-introduction-to-scala-interpreter.html
http://www.ibm.com/developerworks/java/library/j-scala01228.html
Você pode usar o org.mentawai.core.PrettyURLController ao invés de org.mentawai.core.Controller no seu web.xml.

Com isto, ao invés de ter a URL:

http://www.mysite.com/MyContext/Topic.show.mtw?id=233&title=Welcome+to+Mentawai

http://www.mysite.com/MyContext/Topic.mtw?id=233&title=Welcome+to+Mentawai

Você vai usar:

http://www.mysite.com/MyContext/mtw/Topic.show/233/Welcome-to-Mentawai

http://www.mysite.com/MyContext/mtw/Topic/233/Welcome-to-Mentawai

Note que, com isto, você vai perder os nomes dos parâmetros (quando vindos por GET), e terá de usar mtw/ na frente das actions em todas as URLs.

O trecho mtw/ se faz necessário para que todas as requisições possam ser mapeadas para o PrettyURLController, conforme especificado no web.xml. Veja como configuramos o PrettyURLController:

OBS: Caso você não queira utilizar o prefixo mtw você pode mapear suas actions de alguma outra maneira, como por exemplo /Users/*.


Tenha em mente que os parâmetros da URL serão colocados no input da action com os nomes "0", "1", "2", etc. Dessa forma, você pode acessá-los através de:

Por último (mas não somenos importante) você pode usar o filtro PrettyURLParamFilter para dar nomes aos parâmetros. Assim você pode por exemplo usar o InjectionFilter para injetá-los dentro da action.

Com o uso de PrettyURLParamFilter, você poderá usar o PrettyURLController sem precisar migrar nenhuma de suas actions.

E sinta-se à vontade para, se quiser, continuar usando o formato antigo de URLs (http://www.mysite.com/UserAction.show.mtw?id=23&category=34), mesmo com o novo controller. Eles também funcionam, desde que você mantenha o mapeamento *.mtw dentro no web.xml.
O Mentawai, por padrão, suporta as seguintes convenções para a camada view:

Pelo fato de nós não termos definido uma conseqüência para a action HelloAction, a conseqüência usada por padrão será um forward para /HelloAction/sayHello.jsp, não importa o resultado (SUCCESS, ERROR, etc.) que a action retornar.

Você pode usar ainda mais convenções, simplificando ainda mais a sua configuração:

O nome da action vai ser o mesmo nome da classe (HelloAction), e você não precisa especificar o nome do método (inner action), a não ser que você queira criar uma configuração específica para este método.

E você também não precisa especificar toda e qualquer action que você vai usar. Vamos supor que suas actions estejam distribuídas dentro dos pacotes com.mysite.actions e com.mysite.actions.user. Então, o que você vai precisar fazer é:

E por último (mas não somenos importante) você pode criar as suas próprias convenções, bastando implementar a interfaceConsequenceProvider:

Então você pode configurar o ApplicationManager assim:

E não esqueça de que você pode sempre configurar as suas actions na mão:
Com o Mentawai você pode transformar qualquer classe java (POJO) em uma Action. Você também pode chamar qualquer método sem nenhuma restrição. Veja os exemplos abaixo:

No ApplicationManager você deve registrar o POJO Action da mesma forma como você registraria qualquer outra action:

Os parâmetros do input da action serão automaticamente ordenados pela ordem alfabética. De qualquer forma, se você quiser determinar explicitamente quais os valores serão usados nos parâmetros do método, você pode configurar um MethodParamFilter. Por exemplo, vamos supor que você tem o seguinte request:

http://www.mysite.com/HelloPojo.mtw?a=23&a=3&b=5&x=9&y=4

Se você quiser ter certeza que o método addTwoNumbers pegue os valores x e y do input da action, e não a e b (o que seria o padrão, pois a e b vêm antes pela ordem alfabética), então você deve fazer o seguinte dentro de seu ApplicationManager:
Se você tem uma action que coleta uma lista grande de registros da base de dados, e você quer paginar essa coleção, o PaginatorFilter vai fazer isso para você:

Na Action:

No ApplicationManager:

O número padrão de itens em cada página é 20, e o parâmetro padrão para informar o número da página é "p".

http://www.mysite.com.br/UserAction.listAll.mtw?p=3

Você pode alterar isto no contrutor do PaginatorFilter :

Agora, no JSP, para mostrar a página com a paginação:

OBS: A primeira página começa em 1 e não 0 como arrays.
Considerando o seguinte modelo:

Beans:

No ApplicationManager:

Carregando os beans:

Inserindo beans:

Adicionando beans com relacionamentos (um-para-um):

Adicionando beans com relacionamentos (um-para-muitos):

Removendo beans com relacionamentos (um-para-muitos):

Atualizando um bean:

Deletando um bean:

Carregando listas:
Vamos supor que você tem um formulário HTML que envia um nome de usuário, email, senha, idade, etc; e você quer instanciar um objeto User com os parâmetros deste formulário. Tudo o que você precisa fazer é usar o VOFilter e todos os valores do input da action serão usados para criar um objeto User .

No ApplicationManager:

E é isso! O Mentawai vai tentar fazer de tudo para converter e injetar todos os valores do input da action para dentro de um objeto User . Então, dentro da sua Action, você pode fazer o seguinte para usar o objeto User :

Mas, se você não quiser usar o VOFilter você ainda pode usar o método input.getObject. Este método permite que você passe para ele um objeto User já existente.

Agora, para transformar um POJO em dados de formulário você deve usar o OVFilter, que faz exatamente o oposto do VOFilter: ele pega todos os atributos de um POJOe coloca dentro do output da action, de forma que ele pode ser facilmente exibido dentro de um FORM HTML.

No ApplicationManager:

O POJO deve ser colocada no output da action com a chave "user". Com isto, todos os atributos serão extraídos e colocados no output da action.

Na sua página JSP, use as tags de formulário do Mentawai para que os valores apareçam automaticamente no formulário:

Atualmente, você não precisa do OVFilter. Se você tiver apenas o objeto User no output da action, você pode usar a tag mtw:bean para colocar o bean no contexto da página:

Outra forma de fazer a mesma coisa é:

Você decide!
O Mentawai usa o JGroups para implementar um cache distribuído. Isto pode ser útil quando você tem vários web servers com balanceamento de carga, e precisar que os mesmos sejam tolerantes a falhas.

E é isto! Apenas se certifique que os objetos que você colocar no cache sejam serializáveis, e todas as instâncias do cache que estão rodando em várias máquinas diferentes irão compartilhar os mesmos dados!

A implementação padrão do cache é a LRU (Least Resource Usage), onde o último objeto acessado é removido quando o cache se enche. Se você quiser, pode usar o FIFOCache (first in, first out), onde o objeto mais antigo é removido. Use o FIFOCache desta forma:


Se você adicionar um novo servidor ao balanceamento de carga, lembre-se de que primeiro ele terá que carregar todos os objetos do cluster antes de começar a funcionar. Isto pode levar algum tempo se o seu cache for muito grande.

Uma outra opção é usar o SynchronizedCache que vai sincronizar apenas os novos objetos com os outros nós (e não tudo no startup), eliminando demoras na inicializacão.
O Mentawai já vem de fábrica com suporte aos pools de conexões C3P0 e ao DBCP. Tudo o que você precisa para utilizá-los são duas linhas.

No ApplicationManager.java:


Agora, dentro de sua action você pode fazer o seguinte:

Você não precisa se preocupar em retornar esta conexão para o pool. O ConnectionFilter vai fazer isto para você automaticamente.

Você também pode criar um C3P0ConnectionHandler para manipular o pool de conexões. Apenas se certifique que os JARs do pool e do driver de JDBC estejam no diretório WEB-INF/lib.
 
Forum Index » Profile for rodrigo.avila » Messages posted by rodrigo.avila
Go to:   
Powered by JForum 2.1.8 © JForum Team