You are currently browsing the category archive for the 'Tiles' category.
Desde há uns tempos para cá fui ‘forçado’ a deixar o mundo .net para embarcar numa aventura no magnífico mundo Java… Isto, claro, implica (re-)aprender novas ferramentas, técnicas e bibliotecas.
Ultimamente tenho andado a desenvolver uma aplicação numa empresa sediada em Leamington Spa. O trabalho é em Java (JSP’s), usando, entre outros, webflow e tiles.
Ontem, ao implementar uma solução vertical para pesquisa de um dado objecto de negócio (vou poupar os detalhes) reparei que, excepção feita ao evento que deveria ser invocado para que o webflow seguisse a pesquisa por outros caminhos, a interface era pouco mais que mudar uma dezena de linhas de código. Dado que a diferenciação já é definida pelo fluxo de execução presente nos ficheiros de configuração, como é que me posso re-utilizar código presente nas jsp’s, sem usar o padrão ‘copy-paste’? :þ
Bom, vendo a configuração do fluxo tenho qualquer coisa do estilo:
<view-state id="home" view="homeView" >
...
<transition on="search_bar" to="to_action">
<set attribute="toAction" value="searchBar" scope="request"/>
</transition>
<transition on="search_foo" to="to_action">
<set attribute="toAction" value="searchFoo" scope="request"/>
</transition>
</view-state>
<view-state id="searchBar" view="searchBarView" >
...
</view-state>
<view-state id="searchFoo" view="searchFooView" >
...
</view-state>
Até aqui perfeito, com cada evento a seguir o seu caminho, definindo uma view diferente. Agora a primeira abordagem seria fazer as duas views, montando-as com os tiles que acharmos que pertencem a cada uma. Porém, no meu caso, a única diferença que irá existir entre as duas páginas, são os eventos que as várias acções poderão despoletar. Assim, aplicando um pouco de refactoring ao ficheiro de configuração dos tiles, chego ao seguinte resultado:
<definition name=".Standard.Search" extends=".standardPage">
<put name="title" value="Search" type="string" />
<put name="pagebody" value="/tiles/body/search.jsp" />
<put name="pagebottom" value="/tiles/button/search_bottom.jsp" />
</definition><definition name=".Standard.SearchFoo" extends=".Standard.Search">
<put name="searchType" value="foo" type="string" />
</definition><definition name=".Standard.SearchBar" extends=".Standard.Search">
<put name="searchType" value="bar" type="string" />
</definition>
(de notar que há um ficheiro que mapeia de searchBarView para .Standard.SearchBar, e o mesmo para o foo)
Assim temos a definição da página, com uma variável a definir o tipo de procura que pretendemos. Porém, agora chegamos ao problema que me levou a escrever esta entrada.. como, dentro da nossa página ’search.jsp’, é que podemos saber que tipo de procura é que pretendemos para que o controlador da página possa decidir que tipo de eventos disparar?
Bom, eu sou mais do tipo de procurar em código do que em documentação mas decidi tentar.. Após procurar um pouco na documentação do tiles e não ter encontrado nada, achei que andava a dar demasiada importância a isto... certamente algo tão usual como isto deveria estar implementado da forma mais fácil e intuitiva que existe.. o que também levaria a que, como é habitual em muitas frameworks, o seu uso esteja fácilmente presente num pequeno canto da documentação (o que geralmente não acontece quando estamos a ler de código, pois quanto mais rudimentar é uma operação, mais fácilmente a encontramos
Assim, armado com o meu senso comum, parti à descoberta e tentei:
<tiles:importAttribute name="searchType" />
<%
SearchController controller = new SearchController(request, session);
controller.setSearchType(pageContext.getAttribute("searchType"));
%>
e não é que acertei?
