Definindo o Layout

O layout a ser herdado para a página principal é a definição do tile layout.wizard, implementado em /layouts/wizard-layout.jsp.
Além disso é necessário a definição do tile dos passos do seu wizard em Tiles-definition.xml, que será inserido na página principal. Este deve estender de layout.wizard.definition (implementado em /jsp/layouts/wizard-definitions.jsp), e ter alguns parâmetros setados, como demonstrado abaixo:

<!-- ############ Livro Wizard ########### -->
<definition name="livro.cadastro.wizard" extends="layout.wizard">
<put name=content value="livro.wizard"/>
</definition>

<definition name="livro.wizard" path="/jsp/livro/wizard/cadastro.jsp">
<put name="wizard" value="livro.wizard.definition"/>
</definition>

<definition name="livro.wizard.definition" extends="layout.wizard.definition" >
<putList name="steps">
<item icon="step1" tooltip="livro.wizard.step1" value="/jsp/livro/wizard/titulo.jsp" link="#"/>
<item icon="step2" tooltip="livro.wizard.step2" value="/jsp/livro/wizard/autor.jsp" link="#"/>
<item icon="step3" tooltip="livro.wizard.step3" value="/jsp/livro/wizard/genero.jsp" link="#"/>
<item icon="step4" tooltip="livro.wizard.step4" value="/jsp/livro/wizard/idioma.jsp" link="#"/>
</putList>
</definition>

estes parâmetros definem quais os passos compõem o assistente.
Na tag item, a propriedade icon é uma chave única para cada passo, enquanto tooltip indica a descrição e a propriedade value, descreve a jsp que implementa o referido passo.
Estas descrições (icon) serão apresentadas na área da tela reservada para a indicação dos passos atuais, já vencidos ou que ainda faltam na execução do assistente.

Escrevendo as Jsps

Para implementarmos um assistente temos dois tipos de jsp:
  • jsp principal que controlará as demais;
  • jsp's que implementam os passos;

Jsp Principal

Neste jsp configuramos os parâmetros necessários ao funcionamento de todo o assistente, onde:

<%-- Definição dos parâmetros do assistente --%>
<c:set var="wizardFormName" value="livroCadastroForm" scope="request"/>
<c:set var="wizardFormURL" value="/livro/cadastro/wizard/nextStep.do" scope="request"/>
<c:set var="wizardCancelURL" value="/livro/pesquisaFilter.do" scope="request"/>

Onde:
  • wizardFormName é o formulário do próprio jsp principal;
  • wizardFormURL é a action que controla o fluxo dos passos do assistente;
  • wizardCancelURL é o caminho acionado quando o assistente deve ser cancelado;

Além dessas variáveis, é também necessária a importação do tile que contém os passos do wizard, no ponto exato em que se deseja que estes apareçam:

<tiles:insert attribute="wizard"/>
 

Jsp's – Passos

Cada passo deve ser implementado em uma jsp que será carregada à medida que o assistente for avançando.
Aqui, a parte mais importante em cada arquivo, é a que se refere a validação:

<%-- Validações e estado atual do wizard --%>
<html:hidden property="page" value="2"/>

O código acima disponibiliza um campo page, cujo valor indica a página que deve ser validada neste ponto do assistente, de acordo com a validação já programada em validation.xml.

Configurando o Fluxo

O fluxo de um assistente é definido através do mapeamento de uma ação no arquivo struts-config.xml, como uma action comum.
No exemplo, esta foi definida com uma FowardAction que apenas chama o próximo passo:

<action path="/livro/cadastro/wizard/nextStep"
type="org.apache.struts.actions.ForwardAction"
scope="session"
name="livroCadastroForm"
input="/livro/cadastro/wizard.do?actionType=carregar"
validate="true"
parameter="/livro/cadastro/wizard.do?actionType=carregar">
<!-- flag for indicating that resource security isn't required -->
<set-property property="checkPermission" value="false"/>
</action>

A ordem das jsps que serão carregadas é definida no arquivo tiles-definitions.xml, como já mostrado no item Definição de Layout. Com esta definição, a jsp wizard-definitions.jsp (importado pelo jsp principal), se encarrega de chamar a jsp correspondente ao passo atual, não havendo necessidade de se configurar mais nenhum fluxo em qualquer outro lugar.
No exemplo implementado pelo projeto de interface, o assistente sempre é remetido para uma action responsável por carregar os dados necessários à próxima tela. Esta realiza as operações necessárias e remete à mesma jsp principal que sabe qual passo deve ser carregado. Fica a cargo da aplicação definir tantas ações quantas forem necessárias entre um passo e outro, apenas lembrando que este encadeamento deve terminar sempre no jsp principal.