>> Mais documentação do Visual Web Pack
Noções básicas sobre Beans gerenciados e de escopo
Escrito pela equipe dos tutoriais do Visual Web Pack
| Abril de 2007 [Número da revisão: V1-4] |
|
|
Neste tutorial, você usa o NetBeans Visual Web Pack para criar um aplicativo que demonstra como usar os escopos aplicativo, sessão e solicitação para gerenciar os objetos do aplicativo. O escopo é a disponibilidade (ou o contexto) de um objeto e seu tempo de vida desejado em um aplicativo da Web.
O aplicativo da Web criado neste tutorial usa um objeto no escopo de aplicativo para registrar os votos e usa um objeto no escopo de sessão para garantir que o usuário vote somente uma vez por sessão. O aplicativo usa um objeto no escopo de solicitação para exibir a hora em que o usuário enviou o voto. A hora é armazenada no escopo de solicitação porque o aplicativo não precisa do valor depois que a resposta for enviada ao navegador do cliente. |
Conteúdo
|
|
 |
Este tutorial funciona com as tecnologias e os recursos seguintes
Componentes JavaServer Faces/ Plataforma Java EE |
1.2 com Java EE 5* 1.1 com J2EE 1.4
|
| Banco de dados Viagem |
Não é necessário |
| Biblioteca de componentes BluePrints Ajax |
Não é necessário |
* Na data da publicação deste tutorial, somente o servidor de aplicativos Sun Java System oferecia suporte ao Java EE 5.
Este tutorial foi adaptado para ser usado com o Servidor de aplicativos Sun Java System PE 9.0, versão atualizada 1 e posterior, e o Tomcat 5.5.17. Se você estiver usando um servidor diferente, consulte as Notas de versão e as Perguntas freqüentes para obter informações sobre problemas conhecidos e soluções sugeridas. Para obter informações detalhadas sobre os servidores suportados e a plataforma Java EE, consulte as Notas de versão.
Sobre escopos
Enquanto o usuário estiver em uma página, os valores do componente serão lembrados mesmo quando a página for reexibida, como quando o usuário clica em um botão que retorna nulo. No entanto, quando o usuário sai da página, os valores do componente desaparecem.
Para tornar os valores disponíveis para outras páginas, ou para a mesma página, caso o usuário retorne à página, você precisa armazenar os valores. Quando você cria um projeto a partir do IDE, ele cria três Beans gerenciados para armazenar os valores:
RequestBean1
SessionBean1
ApplicationBean1
A figura abaixo mostra a janela Esboço com os Beans gerenciados padrão.
Figura 1: Beans gerenciados padrão |
Um Bean gerenciado é um objeto JavaBeans que um aplicativo da Web JavaServer Faces instancia e armazena nos escopos de solicitação, de sessão e de aplicativo. O aplicativo da Web armazena RequestBean1 no escopo de solicitação, SessionBean1 no escopo de sessão e ApplicationBean1 no escopo de aplicativo.
Para adicionar uma propriedade a um desses Beans gerenciados, clique com o botão direito do mouse na janela Esboço e escolha Adicionar > Propriedade no menu pop-up. Depois que você completar a caixa de diálogo e clicar em OK, o IDE adiciona a propriedade e os métodos getter e setter apropriados ao código-fonte. Você pode acessar um valor da propriedade do Bean vinculando a propriedade de um componente a ele ou chamando os métodos getter e setter da propriedade do Bean. Os dois métodos de acesso são usados neste tutorial.
Antes de criar a propriedade do Bean para armazenar um valor, você deve determinar o escopo apropriado para o valor da propriedade. Uma vez que vários usuários podem acessar um aplicativo da Web ao mesmo tempo, é necessário usar o menor escopo possível para fazer a melhor utilização dos recursos do servidor. A figura abaixo ilustra a duração de cada tipo de escopo.
- O escopo de aplicativo dura até o servidor parar o aplicativo. Os valores que você armazena em um Bean do aplicativo estão disponíveis em cada sessão e em cada solicitação que usa o mesmo mapa de aplicativo.
- O escopo de sessão começa quando o usuário acessa pela primeira vez uma página no aplicativo da Web e termina quando a sessão do usuário expira devido à inatividade, ou quando o aplicativo da Web invalida a sessão, como, por exemplo, chamando
session.invalidate().
- O escopo de solicitação começa quando o usuário envia a página e termina quando a resposta é totalmente processada, qualquer que seja a página.
Figura 2: Escopos de aplicativos da Web |
Por exemplo, o aplicativo da Web tem uma lista suspensa de tipos de medidas (pixels, centímetros e polegadas). Talvez você queira armazenar a lista de opções em ApplicationBean1, para que a lista seja compartilhada por todas as sessões de usuário simultâneas. Por outro lado, você pode querer armazenar o nome de logon do usuário em SessionBean1, para que o nome esteja disponível para todas as páginas que o usuário acessar em tal sessão. Se você não precisar de outras informações além da duração da solicitação atual, você pode economizar espaço colocando a propriedade em RequestBean1.
Aviso: Você não poderá usar o Bean de solicitação caso tenha incluído o elemento <redirect> dentro do elemento <navigation-case> de uma regra de navegação. (Veja essas regras ao clicar no botão XML no editor de navegação de página). Quando a página é enviada, o elemento <redirect> redireciona a página e termina a solicitação antes que uma página subseqüente possa usar qualquer dos valores armazenados no Bean de solicitação.
Quando você cria uma página a partir do IDE, o código-fonte Java do Bean de página contém os métodos para acessar os objetos RequestBean1, SessionBean1 e ApplicationBean1. Para acessar as propriedades nesses Beans gerenciados, você usa um código semelhante às instruções do seguinte fragmento de código.
| Amostra de código 1: Acessando a propriedade de um Bean do aplicativo |
ApplicationBean1 appBean = getApplicationBean1();
Option[] choices = appBean.BallotOptions(); |
O aplicativo da Web instancia um Bean gerenciado, dentro do escopo de tal Bean, na primeira vez que uma página acessar uma propriedade no Bean gerenciado. Por exemplo, uma instância de um objeto SessionBean1 não existe para a sessão do usuário o usuário acessar uma página que faça referência a uma propriedade de SessionBean1. Uma instância de um objeto ApplicationBean1 é criada na primeira vez que uma página de qualquer sessão acessa o Bean do aplicativo, e persiste enquanto o aplicativo da Web está em execução.
Dica: Para adicionar Beans gerenciados extras, expanda o nó Pacotes de fontes na janela Projetos, clique com o botão direito do mouse no nó do pacote, escolha Novo > Arquivo/Pasta, selecione a categoria Beans gerenciados, selecione o escopo em Tipos de arquivos e complete as etapas restantes do assistente.
Adicionando propriedades a Beans gerenciados
As páginas neste aplicativo da Web requerem acesso aos seguintes valores, que você cria nesta seção:
ballotOptions. Uma propriedade de matriz que contém a lista de opções de cédula. Uma vez que a lista permanece igual para todas as sessões, esta propriedade é colocada no escopo de aplicativo.
tally. Uma propriedade de mapa de hash que acumula todos os votos da sessão. Uma vez que deve ser preservado nas sessões, vai no escopo do aplicativo.
hasVoted. Uma propriedade booleana que controla se o usuário votou. Por precisar preservar o valor no decorrer de várias solicitações em uma única sessão, o aplicativo armazena o valor no escopo de sessão.
timestamp. Uma propriedade Date em que o aplicativo registra a data/hora em que o usuário envia um voto, para ser usada por outra página. Por não precisar do valor depois que a próxima página for processada, o aplicativo armazena o valor no escopo de solicitação.
Complete as etapas seguintes para adicionar as propriedade aos Beans gerenciados:
- No menu principal, escolha Arquivo > Novo arquivo.
- No assistente para Novo projeto, selecione Web na lista Categorias e selecione Visual Web Application na lista Projetos.
- Clique em Próximo.
- Nomeie o projeto de
Escopos e clique em Finalizar.
-
Na janela Esboço, clique com o botão direito do mouse no ApplicationBean1 e escolha Adicionar > Propriedade no menu pop-up.
Observação: Se o menu Adicionar estiver desativado quando você clicar com o botão direito do mouse pela primeira vez no nó, pressione a tecla Escape e clique com o botão direito novamente.
Uma caixa de diálogo Novo padrão de propriedade é exibida, como mostrado na figura seguinte.
Figura 3: Caixa de diálogo Novo padrão de propriedade |
-
Defina o Nome e o Tipo da propriedade como segue abaixo e clique em OK.
| Campo de texto |
Valor |
| Nome |
ballotOptions |
| Digite |
Option[] |
|
-
Use etapas semelhantes para adicionar outra propriedade ao Bean do aplicativo. Defina o Nome e o Tipo da propriedade como segue abaixo e clique em OK.
| Campo de texto |
Valor |
| Nome |
tally |
| Digite |
HashMap |
|
- Na janela Esboço, clique com o botão direito do mouse no ApplicationBean1 e escolha Editar fontes Java no menu pop-up.
-
Clique com o botão direito do mouse no código-fonte e escolha Fixar importações no menu pop-up.
Por haver mais de um pacote que contém a classe Option, a caixa de diálogo Fixar importações é exibida.
As classes de Opção na lista suspensa Nome totalmente qualificado dependem da versão de Java EE que você está usando no projeto.
- Para um projeto de Java EE 5, selecione
com.sun.webui.jsf.model.Option.
- Para um projeto de J2EE 1.4, selecione
com.sun.rave.web.ui.model.Option.
- Clique em OK.
-
Efetue rolagem até o método init e adicione o código abaixo mostrado em negrito na parte inferior do método.
Amostra de código 2: Código a adicionar ao método init do Bean do aplicativo |
// TODO - adicione o seu código de inicialização aqui
// preencher os itens da cédula
ballotOptions = new Option[] {
new Option("java", "Linguagem de programação Java"),
new Option("cpp", "C++"),
new Option("fortran", "Fortran")
};
// inicializar contadores das opções da cédula
tally = new HashMap();
for (int i=0; i < ballotOptions.length; i++) {
this.tally.put(ballotOptions[i].getValue(), "0");
} |
-
Adicione os seguintes métodos no final do arquivo, antes da última chave final.
| Amostra de código 3: Métodos de contagem de voto do Bean de aplicativo |
/**
* Contador de voto da propriedade tally.
*/
public void incrementTallyFor(String category) {
int count = getTallyFor(category);
count++;
this.tally.put(category, Integer.toString(count));
}
/**
* Getter do valor na propriedade tally.
* @param chave de HashMap de category
* @return Valor para o qual a chave especificada é mapeada
*/
public int getTallyFor(String category) {
String stringCount = (String) this.tally.get(category);
if (stringCount == null) {
return 0;
} else {
int count = Integer.valueOf(stringCount).intValue();
return count;
}
}
|
- Pressione Ctrl-S para salvar as alterações e Ctrl-F4 para fechar o arquivo.
-
Na janela Esboço, clique com o botão direito do mouse no SessionBean1 e escolha Adicionar > Propriedade no menu pop-up.
Observação: Se a janela Esboço não estiver aberta, clique na guia Page1 na área de edição e clique em Design na barra de ferramentas de edição. A janela Esboço é exibida quando o IDE estiver no modo design.
-
Defina o Nome e o Tipo da propriedade como segue abaixo e clique em OK.
| Campo de texto |
Valor |
| Nome |
hasVoted |
| Digite |
booleano |
|
- Na janela Esboço, clique com o botão direito do mouse no SessionBean1 e escolha Editar fontes Java na janela pop-up.
-
Efetue rolagem até o método init e adicione o código abaixo mostrado em negrito na parte inferior do método.
Amostra de código 4: Código a adicionar ao método init do Bean de sessão |
// TODO - adicione o seu código de inicialização aqui
setHasVoted(false); |
- Pressione Ctrl-S para salvar as alterações e Ctrl-F4 para fechar o arquivo.
- Na janela Esboço, clique com o botão direito do mouse no RequestBean1 e escolha Adicionar > Propriedade no menu pop-up.
-
Defina o Nome e o Tipo da propriedade como segue abaixo e clique em OK.
| Campo de texto |
Valor |
| Nome |
timestamp |
| Digite |
java.util.Date |
|
-
Verifique a janela Esboço para certificar-se de que as propriedades no Bean de solicitação, de sessão e de aplicativo correspondam à figura abaixo. Você pode precisar abrir e salvar o código-fonte Java de RequestBean1 para que a propriedade timestamp seja exibida.
Figura 4: Propriedades do Bean de solicitação, de sessão e de aplicativo |
Criando a página inicial
Siga as etapas nesta seção para criar a página na figura abaixo, mostrado na exibição de um navegador quando o aplicativo é executado. Se o usuário clicar no botão Enviar voto, a página envia o voto do usuário. Depois de o usuário ter votado, o botão fica desativado para impedir que o usuário vote novamente nessa sessão.
Figura 5: Page1 |
- Arraste o componente Rótulo da seção Básico da Paleta, solte-o na parte superior central da página e defina o texto do rótulo como
Pesquisa do leitor: Qual é a sua linguagem de programação preferida?.
- Solte o componente Grupo de botões de opção debaixo do componente Rótulo.
- Na janela Propriedades, defina o
id do componente como voteRBGroup.
-
Clique com o botão direito do mouse no componente Grupo de botões de opção e escolha Vincular aos dados no menu pop-up.
A caixa de diálogo Vincular aos dados é exibida.
- Na guia Vincular a um objeto da caixa de diálogo, selecione ApplicationBean1 > ballotOptions e clique em OK.
- Solte um Botão no componente Grupo de botões de opção e defina o texto como
Visualizar resultados.
- Na janela Propriedades, defina o
id do componente como viewButton.
-
Clique no botão de reticências (...) da propriedade action, selecione viewButton_action na lista suspensa e clique em OK.
O IDE adiciona o manipulador de eventos viewButton_action, que retorna nulo.
- Solte um componente Botão à direita do botão Visualizar resultados e defina o texto como
Enviar voto.
- Na janela Propriedades, defina o
id do componente como voteButton.
-
Clique no botão de reticências (...) da propriedade disabled.
Uma caixa de diálogo se abre.
-
Na caixa de diálogo, selecione Usar vinculação, clique em Vincular a um objeto, selecione SessionBean1 > hasVoted, como mostrado na figura abaixo, e clique em OK.
Figura 6: Vinculando a propriedade disabled |
-
Clique duas vezes no botão Enviar voto.
O IDE adiciona o manipulador de ações voteButton_action, abre o código-fonte Java da página e exibe o método.
-
Substitua o corpo do método pelo código que aparece abaixo em negrito.
Amostra de código 5: Método voteButton_action |
public String voteButton_action() {
if (voteRBGroup.getSelected() == null) {
return null;
}
// Os cômputos são mantidos em todas as sessões de usuário
String votedFor = voteRBGroup.getSelected().toString();
getApplicationBean1().incrementTallyFor(votedFor);
// O usuário pode votar somente uma vez por sessão
getSessionBean1().setHasVoted(true);
// Não é necessário carimbo de data/hora depois que a próxima solicitação terminar
Date now = new Date();
getRequestBean1().setTimestamp(now);
return null;
} |
- Clique com o botão direito do mouse no código-fonte e escolha Fixar importações no menu pop-up.
- Selecione
java.util.Date na lista suspensa Nome totalmente qualificado e clique em OK.
Criando a página de resultados
Siga estas etapas para criar a página que é mostrada em execução no navegador na figura abaixo. Esta página exibe o cômputo atual. O usuário pode clicar no botão Atualizar resultados para obter o cômputo mais recente, que inclui os votos enviados por outros usuários desde o momento em que a página foi exibida pela última vez.
Figura 7: Resultados |
- Na janela Projetos, clique com o botão direito do mouse no nó Páginas da Web no projeto Escopos, escolha Novo > Página, nome da página
Resultados e clique em Concluir para criar a página.
- Solte um componente Rótulo na parte central superior da página Resultados e defina o texto como
Resultados.
- Solte um componente Botão à esquerda do componente Rótulo e defina o texto como
Início.
- Defina o
id do componente Botão como homeButton.
- Clique no botão de reticências (
...) da propriedade action, selecione homeButton_action na lista suspensa e clique em OK.
- Solte um componente Botão à direita do componente Rótulo e defina o texto como
Atualizar resultados.
- Defina o
id do componente Botão como refreshButton.
- Clique no botão de reticências (
...) da propriedade action, selecione refreshButton_action na lista suspensa e clique em OK.
- Arraste um componente Painel de grade da seção Layout da Paleta e solte-o abaixo do componente Rótulo.
- Na janela Propriedades, defina a propriedade
cellspacing como 10 e a propriedade columns como 1.
-
Arraste um componente Texto estático para dentro do componente Layout de grade. Quando o contorno do componente Layout de grade se tornar uma linha azul sólida, solte o componente Texto estático, como mostrado na figura abaixo.
Figura 8: Soltando um componente dentro de um componente Painel de grade |
- Na janela Propriedades, defina o
id do componente Texto estático como resultsST. Deixe a propriedade text em branco.
-
Desmarque a caixa de seleção da propriedade escape.
Depois, você adiciona o código para inserir HTML na propriedade text do componente. Ao definir a propriedade escape como falso, o código HTML será passado sem alteração para o navegador.
- Arraste outro componente Texto estático para o componente Painel de grade e, quando o contorno do componente Layout de grade se tornar uma linha azul sólida, solte o componente Texto estático.
- Defina o
id do componente Texto estático como messageST. Deixe a propriedade text em branco.
- Clique em Java na barra de ferramentas de edição para exibir o código-fonte Java da página.
-
Na janela Esboço, clique duas vezes no método prerender para abri-lo no editor de Java e, em seguida, adiciona o código abaixo mostrado em negrito.
Amostra de código 6: Método prerender |
public void prerender() {
// Exibir os resultados mais recentes da votação
ApplicationBean1 appBean = getApplicationBean1();
Option[] choices = appBean.getBallotOptions();
String str = "<table border=\"0\" cellpadding=\"5\">";
for (int i = 0; i < choices.length; i++) {
int count =
appBean.getTallyFor(choices[i].getValue().toString());
str = str + "<tr><td>" +
choices[i].getLabel() +
"</td><td>" +
count +
"</td></tr>";
}
str = str + "</table>";
resultsST.setText(str);
RequestBean1 reqBean = getRequestBean1();
Date timestamp = (Date) reqBean.getTimestamp();
if (timestamp != null) {
messageST.setText("Seu voto foi registrado em " +
(String)DateFormat.getTimeInstance(DateFormat.LONG).format(
timestamp));
}
} |
Este código cria uma tabela HTML que contém o cômputo de cada voto e coloca esta tabela na propriedade text do primeiro componente Texto estático. Se o usuário acabou de votar, o segundo componente Texto estático exibe a data e a hora em que o voto foi registrado.
- Clique com o botão direito do mouse no código-fonte e escolha Fixar importações no menu pop-up.
- Em Nome da classe para data, selecione
java.util.Date na lista suspensa Nome totalmente qualificado.
Em Nome da classe para opção, os nomes na lista suspensa Nome totalmente qualificado dependem da versão de Java EE que você está usando no projeto.
- Para um projeto de Java EE 5, selecione
com.sun.webui.jsf.model.Option.
- Para um projeto de J2EE 1.4, selecione
com.sun.rave.web.ui.model.Option.
Especificando a navegação de página
Siga estas etapas para especificar a navegação de página dos botões, como mostrado na figura abaixo.
Figura 9 : Editor de navegação de página |
- Na área de edição, clique na guia Resultados e clique em Design para exibir a página no Visual Designer.
- Clique com o botão direito do mouse em um lugar vazio da página e escolha Navegação de página no menu pop-up.
- Clique no ícone de Page1.jsp para ampliá-lo.
- Clique na porta do conector ao lado de viewButton e arraste para Results.jsp para criar um conector entre o botão e a página Resultados.
- Clique duas vezes no rótulo do conector a fim de alterar para o modo de edição, clique duas vezes para selecionar o texto, digite
exibir resultados e pressione Enter.
- Clique no ícone de Page1.jsp para ampliá-lo novamente, clique na porta do conector ao lado de voteButton e arraste para Results.jsp.
- Clique duas vezes no rótulo do conector a fim de alterar para o modo de edição, clique duas vezes para selecionar o texto, digite
votar e pressione Enter.
- Clique no ícone de Results.jsp para ampliá-lo.
- Clique na porta do conector ao lado de homeButton e arraste para Page1.jsp.
- Clique duas vezes no rótulo do conector a fim de alterar para o modo de edição, clique duas vezes para selecionar o texto, digite
início e pressione Enter.
Executando o aplicativo
Para permitir várias sessões do mesmo navegador, configure o aplicativo para finalizar cada sessão depois de um minuto de inatividade. Em seguida, implante e execute o aplicativo.
-
Na janela Arquivos, expanda Escopo > Web >WEB-INF, como mostrado na figura abaixo.
Figura 10: Janela Arquivos |
- Clique com o botão direito do mouse em web.xml e escolha Abrir no menu pop-up.
-
Digite 1 na caixa de texto Tempo-limite da sessão, como mostrado na figura abaixo.
Figura 11: Definindo o tempo-limite da sessão no editor visual web.xml |
- Feche e salve o arquivo.
- Clique no botão Executar projeto principal na barra de ferramentas principal.
-
Quando a página inicial for exibida, selecione um botão de opção e clique em Enviar voto.
O navegador exibe a página de resultados. Observe que a página de resultados mostra a hora em que você enviou o voto.
-
Clique em Início para voltar à página de resultados.
O botão Enviar voto está desativado porque você já votou.
-
Clique em Exibir resultados.
Observe que a página de resultados já não mostra a hora em que você votou. Isto ocorre porque o Bean de solicitação anterior está fora do escopo e um novo Bean de solicitação foi instanciado.
- Espere um minuto para que a sessão expire. Em seguida, digite a seguinte URL na caixa de texto de endereço do navegador e pressione Enter para iniciar uma nova sessão:
http://localhost:8080/Scopes. Talvez você tenha que alterar 8080 por outra porta se não estiver usando a configuração de servidor padrão.
- Vote novamente e verifique os resultados. Os resultados devem incluir seu primeiro voto.
- Se tiver outro aplicativo no navegador, inicie este navegador, digite
http://localhost:8080/Scopes na caixa de texto de endereço e pressione Enter. Envie outro voto.
-
No primeiro navegador, clique em Atualizar resultados na página de resultados.
Os resultados devem incluir o voto enviado a partir do segundo navegador.
Fazendo mais
Usando o que você aprendeu neste tutorial, construa um aplicativo que solicite um nome de logon. Adicione uma página que exiba o número de usuários exclusivos que acessaram o aplicativo da Web.
Resumo
Você usa o Bean de aplicativo, o Bean de sessão e o Bean de solicitação para armazenar informações a serem usadas por outras páginas.
- Use o Bean de aplicativo para informações que se aplicam a todas as sessões do usuário, tal como uma lista de opções estática de um componente Lista suspensa.
- Use o Bean de sessão para armazenar informações a serem usadas por outras páginas durante a sessão do usuário, tal como o nome de logon do usuário.
- Se você precisar de informações que serão usadas apenas pela próxima página, use o Bean de solicitação.
Aviso: Você não poderá usar o Bean de solicitação caso tenha incluído o elemento <redirect> dentro do elemento <navigation-case> de uma regra de navegação.
Os Beans de solicitação, de sessão ou de aplicativo são instanciados assim que a página acessa uma de suas propriedades. O Bean é destruído quando o seu escopo termina.
Para adicionar uma propriedade ao Bean de sessão, clique com o botão direito do mouse no nó Bean de sessão na janela Esboço e escolha Adicionar > Propriedade. Use etapas semelhantes para adicionar uma propriedade ao Bean de solicitação ou ao Bean de aplicativo.
>> Mais documentação do Visual Web Pack
Esta página foi modificada pela última vez em 16 de abril de 2007