Controles
Controles são responsáveis pela interação com o usuário e geração de front-end para interface de serviço.
Para implementar controles, é necessário implementar IControl
ou alguma interface que a estende. Controles podem armazenar um valor IDataControl
, e também podem estar vinculados a um campo de um source IDataBoundControl
. Há controles cuja função é especificamente validar dados entrados pelo usuário IValidatorControl
.
Ao invés de implementar diretamente alguma dessas interfaces citadas, pode-se estender uma de suas implementações, o que facilita a criação de um controle. Por exemplo, classes como Control
, DataControl
, DataBoundControl
e ValidatorControl
podem ser estendidas. Dessa forma, toda a lógica genérica do controle já estará implementada e o desenvolvedor pode focar apenas nos aspectos específicos do controle.
Portanto, os controles podem ser divididos em:
- Control: Controles de layout apenas;
- Data Control: Controles de layout, mas também são responsáveis pela persistência de dados trocados entre o cliente (browser) e o servidor;
- Data Bound Control: Controles que acessam um ou mais sources e disparam processes actions. Os controles de formulário fazem parte desta classificação, pois manipulam dados.
As etapas principais no ciclo de vida de um controle são:
- Execução do método
init
; - Execução do método
buildSubControls
; - Execução do método
loadFromRequest
caso oIDataControl
esteja implementado, - Execução do método
serverValidate
caso oIValidatorControl
seja implementado e a requisição for um process action; - Execução do método
setRenderData
se for uma requisição de renderização; - Execução do método
setProcessActionHandlerParameters
se for uma requisição de process action.
Além disso, na implementação em DataBoundControl
, o controle se registra como um observador de seu source. Sempre quando os dados do source são carregados, essa implementação executa o método setValueFromSource
, que atribui ao controle o valor que está no campo a que ele está associado. Um override nesse método permite a customização de como o valor de um controle é lido do source.
Quando o método setRenderData
de um controle é executado, o controle deve acrescentar em seu XML os dados que deseja disponibilizar para o XSL, que é responsável por gerar o código HTML que será renderizado no navegador.
Outros XSLs podem ser criados, para que o controle possa ser renderizado com diferentes designs, enquanto que a implementação da funcionalidade do controle continua a mesma, implementada na classe Java.