O Action base ganha o método id_produto() — pré-requisito do Update. Enquanto o proBean() (que já existia do CREATE) lê dados do request, o id_produto() lê o ID do produto da sessão.
package br.xt.app.departamento.produto;
import br.xt.AppsRootAction;
import br.xt.app.departamento.DepartamentoManager;
public abstract class DepartamentoProdutoAction extends AppsRootAction {
private DepartamentoProdutoWBean wbean = null;
public DepartamentoProdutoWBean proWBean() throws Exception {
if (wbean == null)
wbean = (DepartamentoProdutoWBean) getManager().getInstance(DepartamentoProdutoWBean.class);
return wbean;
}
private DepartamentoProdutoBean bean = null;
public DepartamentoProdutoBean proBean() throws Exception {
if (bean == null)
bean = (DepartamentoProdutoBean) getManager().getInstance(DepartamentoProdutoBean.class);
return bean;
}
// ADICIONAR
public Integer id_produto() throws Exception {
return getSession().getInteger(ROOT.concat(DepartamentoProdutoBean.ID_PRODUTO));
}
// FIM
public static final String ROOT = DepartamentoManager.F_ACESSO_MODULO.concat("__PRODUTO/");
}
Mudança nesta sequência: somente o método id_produto() (verde). O proWBean(), proBean() e a constante ROOT já existiam das sequências anteriores.
O proBean() e o id_produto() parecem fazer coisas parecidas — ambos dão acesso ao ID do produto. Mas usam fontes diferentes:
| Método | Fonte | Quando usar |
|---|---|---|
proBean().getId_produto() | Request (dados do formulário) | Quando os dados ACABARAM de chegar do browser (Insert, Update) |
id_produto() | Sessão (ficha permanente) | Quando o ID foi guardado num request anterior (Update) |
Por que a sessão? No fluxo de edição, o ID chega no request do ShowUpdate (quando o usuário clica na linha da lista). O ShowUpdate guarda esse ID na sessão. Depois, quando o usuário clica "Salvar", o request NÃO traz o ID de novo — o Update precisa buscá-lo na sessão via id_produto().
Fluxo:
id_produto()A sessão funciona como um "lembrete entre requests" — o agente do ShowUpdate anota, e o agente do Update lê a anotação.
ROOT.concat(ID_PRODUTO)
A sessão é um mapa de chave/valor compartilhado por todo o módulo. Pra evitar colisão entre entidades diferentes (ex: um id_produto de Produto vs um id_produto de outro módulo), a chave usa o prefixo ROOT:
ROOT.concat(DepartamentoProdutoBean.ID_PRODUTO)
// Resultado: "XT.PAINEL_CONTROLE.ACESSO_MODULO.DEPARTAMENTO__PRODUTO/id_produto"
Essa string longa e única identifica sem ambiguidade "o ID do produto que está sendo editado no módulo Departamento". Mesmo padrão usado pelo FORM (ROOT.concat("__FORM")) e pelo FILTRO na List.