[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

11 ) Como suportar de forma simples CoC (Convention over Configuration) para a camada view?  XML
Forum Index -> F.A.Q. Go to Page: 1, 2 Next 
Author Message
boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

11 ) Como suportar de forma simples CoC (Convention over Configuration) para a camada view, de forma que você não precise configurar as páginas de destino da sua action?

Apesar de acreditarmos que CoC para a camada view só é viável em projetos pequenos e muitos simples, o Mentawai oferece essa funcionalidade de maneira bastante fácil.

Se você esquecer ou propositalmente não especificar uma consequência para uma action, o Mentawai criará uma consequência do tipo Forward automaticamente seguindo a convenção abaixo:

Code:
 
 Action sendo executada = HelloMentawai.mtw
 
 - Action retornou SUCCESS: new Forward("/HelloMentawai/ok.jsp");
 
 - Action retornou ERROR: new Forward("/HelloMentawai/error.jsp");
 
 - Action retornou qualquer resultado X: new Forward("/HelloMentawai/X.jsp");
 
 
 InnerAction sendo executada = HelloMentawai.sayhello.mtw
 
 - Action retornou SUCCESS: new Forward("/HelloMentawai/sayhello.ok.jsp");
 
 - Action retornou ERROR: new Forward("/HelloMentawai/sayhello.error.jsp");
 
 - Action retornou qualquer restulado X: new Forward("/HelloMentawai/sayhello.X.jsp");
 
 


Caso vc queira alterar essa convenção do Mentawai para algo que melhor atenda o seu gosto ou necessidade, você pode usar a implementação de CoCActionConfig e criar o seu próprio CoCConsequenceProvider, ou seja, até as convenções do Mentawai podem ser configuradas, se assim vc desejar.

Observação: Essa funcionalidade está ativada por default. Entretanto se você preferir que o controlador jogue uma exception ao invés de tentar usar o esquema acima, você pode desativar esse CoC através do método do ApplicationManager setAutoView(false);

http://www.boaglio.com
[WWW]
YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

Notei um detalhe ao usar o CoC. No artigo é dito que o encaminhamento ocorre na URL do seguinte formato (por padrão):

${contextPath}/${actionName}/${innerActionName}.${consequenceResult}.jsp

Mas ocorre que tive erro de URL não encontrada aqui porque o encaminhamento ocorreu para um ${actionName}.toLowerCase()

Ou seja, eu tenho a action Clients, mas o encaminhamento foi feito para: myContext/clients/${page}.jsp

Essa característica de estar colocando o nome em lower case está incorreta ou é assim mesmo e houve um pequeno equívoco no artigo?

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Equivoco no artigo....

Nada te impede de implementar o seu próprio ConsequenceProvider para fazer isso do jeito que vc quiser...

(CoCConsequenceProvider mudou para ConsequenceProvider)

Sergio Oliveira

YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

saoj wrote:
... 


Sim, sim, foi o que pensei.

E, como eu estou usando template, tive que implementar mesmo, já que por padrão vai extensão JSP, não é?

Code:
 //package ...;
 
 import org.mentawai.core.Consequence;
 import org.mentawai.core.Forward;
 
 public class CoCConsequenceProvider implements org.mentawai.coc.CoCConsequenceProvider
   {
    public Consequence getConsequence(String actionName, String result, String innerActionName)
      {
       String url = "/view/" + actionName + "/";
 
       if (innerActionName != null && !innerActionName.trim().equals(""))
         { url += innerActionName + "."; }
 
       url += result + ".page";
 
       return (new Forward(url));
      }
   }
 


Então tentei redefinir o ConsequenceProvider no método init do ApplicationManager, fazendo assim:

Code:
 CoCActionConfig.setConsequenceProvider(new CoCConsequenceProvider());
 


Mas não funcionou. Tentei então colocar no loadActions(), mas não adiantou. Não acusa erro, mas a URL continua sendo redirecionada para a URL padrão montada pelo ForwardCoCConsequenceProvider Default.

Cara, quando que mudou para ConsequenceProvider? Estou acessando a API aqui e só há a CoCConsequenceProvider.

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Tem que botar JSP sim...

Jar beta mudou... 1.10.1 ainda está com CoC....

Sergio Oliveira

YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

saoj wrote:

Tem que botar JSP sim...

Jar beta mudou... 1.10.1 ainda está com CoC.... 


Mas com essa implementação que fiz não deveria funcionar?

Code:
 //package ...;
  
  import org.mentawai.core.Consequence;
  import org.mentawai.core.Forward;
  
  public class CoCConsequenceProvider implements org.mentawai.coc.CoCConsequenceProvider
    {
     public Consequence getConsequence(String actionName, String result, String innerActionName)
       {
        String url = "/view/" + actionName + "/";
  
        if (innerActionName != null && !innerActionName.trim().equals(""))
          { url += innerActionName + "."; }
  
        url += result + ".page";
  
        return (new Forward(url));
       }
    }
 

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Parece que sim.... Manjo pouco de templates... Liga o debug mode e veja qual a consequencia que ele está retornando...

Sergio Oliveira

YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

saoj wrote:

Parece que sim.... Manjo pouco de templates... Liga o debug mode e veja qual a consequencia que ele está retornando... 


Fiz o seguinte:
adicionei a seguinte linha ao meu Applicationmanager:

Code:
 public void init(Context app)
   {
    ...
    CoCActionConfig.setConsequenceProvider(new CoCConsequenceProvider()); // onde CoCConsequenceProvider é a Minha implementação
    ...
   }
 


Resultado: continuou tudo na mesma, quando eu acesso /Clients.list.mtw ele redireciona para /clients/list.ok.jsp

Então eu alterei meu ApplicationManager fazendo-o extender CoCApplicationManager ao invés de ApplicationManager padrão.

Tentei colocar o código setConsequenceProvider(new CoCConsequenceProvider()); tanto no init quanto no loadActions(), mas em ambos os lugares que eu coloquei sempre que eu acessava Clients.list.mtw era lançada uma excessão no ActionConfig.getDirFromClass()

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Tem um FAQ sobre CoC... Dá uma olhada aí... Eu realmente não sei o que acontece aí...

Se não estiver funcionando vc vai ter que debugar o código do menta para entender o que vc está fazendo de errado...

Pra mim sempre funcionou sem problemas...

Sergio Oliveira

YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

saoj wrote:
Tem um FAQ sobre CoC... Dá uma olhada aí... Eu realmente não sei o que acontece aí...

Se não estiver funcionando vc vai ter que debugar o código do menta para entender o que vc está fazendo de errado...

Pra mim sempre funcionou sem problemas... 


Eu já li o FAQ, tudo o que havia sobre CoC eu jpa li, hehehe.

Mas cara, alguma vez tu jpa precisastes implementar teu próprio CoCConsequenceProvider?

Quando será que o Boaglio vai acessar o fórum? Espero que seja logo, pq foi ele que redigiu a FAQ neh. oO

No final das contas ou vou ter que criar todos os Forward's manualmente ou deixar de usar template, hehe.

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Cara, te sugiro o seguinte:

- Baixa o jar beta e usa ele...

- Implementa ConsequenceProvider e faz os seus testes...

- Veja que eu uso direto InnerActionConsequenceProvider no MentaNews no FAQ....

- Implementar o seu próprio ConsequenceProvider é ridículo e funciona perfeitamente. O seu problema é outro, provavelmente relacionado com templetes...

- Faz a coisa devagar para assumir o controle da sua aplicação... Muita mágica tem vantagens e desvantagens: vantagem = produtividade / objetividade / pragramatismo ; desvantagem = vc pode querer que as coisas funcionem sem entende-la...

- Não foi o Boaglio que fez o CoC...


Sergio Oliveira

YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

saoj wrote:

Cara, te sugiro o seguinte:

- Baixa o jar beta e usa ele...

- Implementa ConsequenceProvider e faz os seus testes...

- Veja que eu uso direto InnerActionConsequenceProvider no MentaNews no FAQ....

- Implementar o seu próprio ConsequenceProvider é ridículo e funciona perfeitamente. O seu problema é outro, provavelmente relacionado com templetes...

- Faz a coisa devagar para assumir o controle da sua aplicação... Muita mágica tem vantagens e desvantagens: vantagem = produtividade / objetividade / pragramatismo ; desvantagem = vc pode querer que as coisas funcionem sem entende-la...

- Não foi o Boaglio que fez o CoC...

 


Beleza cara, vou dar uma olhada em InnerActionConsequenceProvider. Só vou discordar com você no que diz respeito a querer que as coisas funcionem sem entedê-las, pois eu procuro sempre tentar entender as classes que estou trabalhando, tanto que tenho salvas todas as páginas da FAQ e os artigos, além de estar com todo o source do Menta à mão, cujo acesso freqüentemente, pois gosto de saber como algumas coisas estão sendo implementadas.

Vou testar mais algumas possibilidades e alternativas e assim que tiver algum resultado posto novamente.

Mais uma vez obrigado pela atenção.

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

YkyMatt wrote:

Beleza cara, vou dar uma olhada em InnerActionConsequenceProvider. Só vou discordar com você no que diz respeito a querer que as coisas funcionem sem entedê-las, pois eu procuro sempre tentar entender as classes que estou trabalhando, tanto que tenho salvas todas as páginas da FAQ e os artigos, além de estar com todo o source do Menta à mão, cujo acesso freqüentemente, pois gosto de saber como algumas coisas estão sendo implementadas.
 


Eu entendo o seu lado, pois tem coisas que vc quer simplesmente que funcione. Essa é a filosofia do menta que nesse caso aqui falhou.

O que eu posso te garantir é que o ConsequenceProvider funciona perfeitamente. Agora quando vc mistura ele com templates (algo com o que eu não trabalho, não gosto e não entendo), aí eu já não sei o que pode acontecer...

Sergio Oliveira

YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

Cara, já estou utilizando o jar beta, já notei que foi passado o CoCAplicationManager de org.mentawai.core para org.mentawai.coc

Mas agora o ConsequenceProvider não tem mais o métiodo com assinatura:

getConsequence(String action, String result, String innerAction)

Agora é:
getConsequence(String, Class<? extends Object>, String, String)

Poderia me explicar o que são os parâmetros, por favor?

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
Lupos


[Avatar]

Joined: 19/04/2007 11:53:00
Messages: 75
Offline

Eu to usando CoC e template. Se eu não estou enganado acho q vc tá querendo o mesmo , pra mim tá funcionando legal, dá uma sacada no codigo.....

coloca Controller.setConsequenceProvider(new ConsequenceProvider()

ApplicationManager
Code:
  public void init(Context application) {
          
        Controller.setConsequenceProvider(new ConsequenceProvider() {
 
             public Consequence getConsequence(String action, Class<? extends Object> actionClass, String result, String innerAction) {
                  
                StringBuffer sb = new StringBuffer(128);
         
                sb.append("/").append("WEB-INF/jsp/").append("/");
         
                sb.append(result).append(".page");
         
                return new Forward(sb.toString());
                 
             }
         } );
 
        /////// etc ....
    }
 
  public void loadActions() {
     ActionConfig ac = new ActionConfig("/MenuAction",MenuAction.class);
     ac.addConsequence(SUCCESS,fwd("WEB-INF/jsp/template/body.page"));
     ac.addConsequence(ERROR,fwd("WEB-INF/jsp/template/sempag.page"));
     ac.addFilter(common);
     addActionConfig(ac);
  }
 
 
 
 




Sergio senão substitui jsp por page o template não funciona. , essa mistura ficou muito flexível, agora q entendo não vejo complicação alguma. tá muito simples. como é de praxe no menta



valeu.



 
Forum Index -> F.A.Q. Go to Page: 1, 2 Next 
Go to:   
Powered by JForum 2.1.6 © JForum Team