1. pacote livraria; 2. importar javax.servlet.http.HttpSessionBindingListener; 3. importar javax.servlet.http.HttpSessionBindingEvent; 4. importar java.sql.*; 5. importe o formulário java.text.SimpleDate em; 6. importar java.util.Date; 7. 8. Classe pública User implementa HttpSessionBindingListener 9. { 10.… 11. private String loginDatetime; //Hora de login do usuário 12.… 13. public void valueBound (evento HttpSessionBindingEvent) 14. { 15. Conexão conn = nulo; 16. String sqlStr = "inserir em T_LOGIN_LOG(ID, USER_ID, DT_LOGIN)" + 17. "valores(SEQ_LOGIN_LOG_ID.NEXTVAL,?,? )"; 18. tente 19. { 20. conexão = DBConnection.getConnection(); 21. PreparedStatement pStat = conn.prepareStatement(sqlStr); 22. loginDatetime = getCurrDatetimeStr(); //Sequência de horário atual 23. pStat.setString(1, userId); 24. pStat.setString(2, loginDatetime); 25. pStat.executeUpdate(); 26. 27.} capturar (SQLException e) 28. { 29. lance new RuntimeException( 30. "Erro ao gravar log de login do usuário"); 31.} finalmente 32. { 33. tente 34. { 35. if (conn! = nulo) 36. { 37.conn.close(); 38.} 39.} catch (SQLException ex) 40. { 41. ex.printStackTrace(); 42.} 43.} 44.} 45. 46. public void valueUnbound (evento HttpSessionBindingEvent) 47. { 48. Conexão conn = nulo; 49. String sqlStr = " atualizar T_LOGIN_LOG definir DT_LONOUT = ? " + 50. "onde USER_ID=? e DT_LOGIN = ?"; 51. tente 52. { 53. conexão = DBConnection.getConnection(); 54. PreparedStatement pStat = conn.prepareStatement(sqlStr); 55. pStat.setString(1, getCurrDatetimeStr()); 56. pStat.setString(2, userId); 57. pStat.setString(3, loginDatetime); 58. pStat.executeUpdate(); 59. 60.} capturar (SQLException e) 61. { 62. lance new RuntimeException( 63. "Erro ao gravar log de saída do usuário"); 64.} finalmente 65. { 66. tente 67. { 68. if (conn! = nulo) 69. { 70.conn.close(); 71.} 72.} catch (SQLException ex) 73. { 74. ex.printStackTrace(); 75.} 76.} 77.} 78. 79. //Obtém a string de hora atual e retorna-a no formato yyyyMMddHHmmss, como 20050505010101 80. String estática privada getCurrDatetimeStr() 81. { 82. Formulário SimpleDate em sdf = novo formulário SimpleDate em("yyyyMMddHHmmss"); 83. retorne o formulário sdf em(nova data()); 84.} 85.} |
O método valueBound() insere um log de login na tabela T_LOGIN_LOG e atualiza o horário de saída da tabela de log no método valueUnbound(). Além disso, as linhas 80 a 84 fornecem um método getCurrDatetimeStr() para obter a string de hora atual. Este método é usado para obter o login e a sequência de tempo do ponto de tempo de saída.
A seguir, descrevemos como o programa registra o tempo de login e logout do usuário, descrevendo as etapas pelas quais um usuário passa até fazer logout:
1. Após o usuário inserir a senha para efetuar login através do login.jsp, o programa muda para a página de controle switch.jsp.
2. No switch.jsp, vinculamos o objeto userBean da classe User.java à sessão através do método session.setAttribute("ses_userBean", userBean).
3. Neste momento, o método de interface HttpSessionBindingListener valueBound() do objeto userBean é chamado e um log de login é inserido na tabela T_LOGIN_LOG.
4. switch.jsp alterna para a página Welcome.jsp.
5. Quando o usuário clica no link da página Welcome.jsp para sair do sistema, ele é redirecionado para a página quit.jsp.
6. quit.jsp chama o método session.invalidate() e o objeto userBean é limpo da sessão.
7. Neste momento, o método valueUnbound() do método de interface HttpSessionBindingListener do objeto userBean é chamado, o horário de saída do log é atualizado e a janela do navegador é fechada.
A interface HttpSessionBindingListener é a interface de eventos do contêiner da Web. A classe que implementa a interface é chamada automaticamente quando ocorre um evento. O contêiner da Web possui várias dessas interfaces de eventos.
·Interface ServletContextListener: interface de processamento de eventos para inicialização e destruição de contêineres web. Dois métodos são definidos na interface.
·Interface ServletContextAttributeListener: interface de processamento de eventos quando os atributos do contexto Web mudam.
·Interface HttpSessionListener: interface de processamento de eventos para criação e destruição de sessões.
·Interface HttpSessionAttributeListener: A interface de processamento de eventos para alterações de objetos de atributo na sessão Session. Esta interface é semelhante à interface HttpSessionBindingListener que usamos anteriormente.
Além disso, duas outras interfaces de processamento de eventos são fornecidas no J2EE1.4, são elas:
·Interface ServletRequestListener: Interface de processamento de eventos de criação e destruição de objetos de solicitação.
·Interface ServletRequestAttributeListener: interface de processamento de eventos ao alterar o objeto de atributo em Request.
Implantação do programa
Após a conclusão do desenvolvimento do programa Web, começamos a trabalhar na implantação do programa. Esperamos implantar este aplicativo Web no servidor de aplicativos Web Tomcat5.0.
Primeiro, definimos a página inicial padrão do aplicativo Web e, em seguida, empacotamos todo o programa Web em um arquivo WAR.
1. Defina a página de acesso padrão, clique duas vezes no nó webModule no painel do projeto, o JBuilder exibe a seguinte página no painel de conteúdo:
Figura 26 Definir a página padrão acessada pelo programa web
Clique no botão Adicionar... no lado direito da lista de arquivos de boas-vindas, digite login.jsp na caixa de diálogo pop-up e pressione o botão OK para definir a página login.jsp como a página padrão. A seguinte implantação em negrito será adicionada às informações de descrição da implantação web.xml:
Listagem de código 19 Página padrão do aplicativo Web
1.…
2. <aplicativo web>
3. <nome de exibição>webModule</nome de exibição>
4. <lista de arquivos de boas-vindas>
5. <arquivo de boas-vindas>login.jsp</arquivo de boas-vindas>
6. </lista de arquivos de boas-vindas>
7.…
8. </web-app>
Quando o usuário não especifica um nome de arquivo de acesso específico na URL, o contêiner da web verifica automaticamente se há um arquivo login.jsp no URI e, em caso afirmativo, chama esse arquivo diretamente.
2. Clique com o botão direito do mouse no nó webModule na árvore de recursos no painel do projeto, Propriedades...->Build->No painel Build settings, defina Build Web archive para a opção Ao construir projeto ou módulo, conforme mostrado na figura a seguir:
Figura 27 Define o arquivo WAR a ser criado ao reconstruir o projeto ou módulo da Web
3. Clique com o botão direito em Chapter13.jpx no painel do projeto e selecione Reconstruir no menu pop-up para compilar o projeto inteiro.
4. Após a conclusão da compilação, um arquivo webModule.war será gerado no diretório raiz do projeto.
5. Copie o arquivo webModule.war para o diretório <diretório de instalação do JBuilder2005>/thirdparty/jakarta-tomcat-5.0.27/webapps.
Isso conclui a implantação do aplicativo web. Em seguida, iniciamos o servidor de aplicativos web Tomcat 5.0 e acessamos o aplicativo webModule.war recém-implementado.
1. Clique duas vezes em startup.bat em <diretório de instalação do JBuilder2005>/thirdparty/jakarta-tomcat-5.0.27/bin para iniciar o servidor de aplicativos Web Tomcat 5.0 (certifique-se de que nenhum aplicativo Web esteja em execução no JBuilder neste momento para evitar conflitos) .
2. Abra o IE, digite http://localhost:8080/webModule e você acessará corretamente a aplicação web que acabou de implantar, conforme mostrado na figura a seguir:
Figura 28 Efeito de acesso de login.jsp após implantação
O servidor Tomcat funciona na porta 8080 por padrão, então você precisa adicionar o número da porta após o nome da máquina. Você pode alterar esse número de porta alterando o arquivo de configuração server.xml do Tomca localizado no diretório conf.
Como o arquivo WAR de nosso aplicativo web é denominado webModule.war, após o servidor web ser iniciado, o arquivo WAR será automaticamente descompactado no diretório webModule, portanto deve ser acessado através de http://localhost:8080/webModule . Além disso, como a página de acesso padrão é login.jsp, quando nenhuma página específica é especificada, a página login.jsp é chamada.