柯侧耳倾听者 - 云代码空间
—— 翱翔在Java世界的海洋之上
一、实验目的 熟悉监听器的主要功能 了解监听器的类型 掌握监听器的编程方法 掌握监听器的配置方法
二、预习内容及要求(要求写出预习内容) Listener创建方法、Listener配置方法
三、实验内容、操作过程及实验结果记录 1.使用监听器技术,当每个用户登录系统主页面时,在页面左上角显示网站的访问次数,并显示当前在线用户列表,如图1所示。希望用户访问应用时,只有在关闭应用时,最新的访问次数才保存到数据库中,可以使用监听器监听ServletContext的启动和关闭。
图1 页面访问次数和在线用户列表 实验步骤: (1) 在数据库bookmgs下新建一个数据库表access_count,其中设置一个字段count,用于存放网站的访问次数。 (2) 在src目录下新建一个包cs.javaee.listener,在此包下新建一个监听器类ContextListener,此类中contextInitialized()方法可以监听到服务器的启动,此时,读取数据库表access_count中的count字段,contextDestroyed()方法可以在服务器关闭时将最新的访问次数更新到数据库中。ContextListener的代码如下: package cs.javaee.listener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListener implements ServletContextListener { Connection cn=null; @Override public void contextDestroyed(ServletContextEvent arg0) { //当服务器关闭时,把ServletContext中网站访问次数的属性写入数据库 ServletContext ctx=arg0.getServletContext(); String driver=ctx.getInitParameter("driver"); String url=ctx.getInitParameter("url"); String user=ctx.getInitParameter("user"); String password=ctx.getInitParameter("password"); int count=0; if (ctx.getAttribute("access_count")!=null){ count=Integer.parseInt(ctx.getAttribute("access_count").toString()); } //update access_count set count='1'; String sqlStr="update access_count set count=\'"+count+"\'";// 修改数据库中count字段的数值 try { Class.forName(driver); cn=DriverManager.getConnection(url,user,password); Statement st=cn.createStatement(); int affectedRows=st.executeUpdate(sqlStr);//修改数据库中的记录 if (affectedRows==1){ System.out.println("修改数据库数据成功!"); } st.close(); cn.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} @Override public void contextInitialized(ServletContextEvent arg0) { //当服务器启动时,从数据库中读取当前网站的访问次数 ServletContext ctx=arg0.getServletContext(); String driver=ctx.getInitParameter("driver"); String url=ctx.getInitParameter("url"); String user=ctx.getInitParameter("user"); String password=ctx.getInitParameter("password"); String sqlStr="select count from access_count"; try { Class.forName(driver); cn=DriverManager.getConnection(url,user,password); Statement st=cn.createStatement(); ResultSet rs=st.executeQuery(sqlStr); if (rs.next()){ int count=Integer.parseInt(rs.getString("count").toString()); ctx.setAttribute("access_count",count); }else{ ctx.setAttribute("access_count",0); System.out.println("ServletContext init...."); } rs.close(); st.close(); cn.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } (3) 修改mainPage.jsp页面的代码,使其能在页面上显示当前页面访问的次数。mainPage.jsp文件中的<body>标签的代码如下: <body> <center> <h2>学生信息管理系统</h2> </center> <hr/> <% int count=Integer.parseInt(application.getAttribute("access_count").toString()); count++; %> 当前访问次数:<%=count %> <% application.setAttribute("access_count",count); %> <%-- 在服务器启动之时,读取数据库存储的数据, 只要访问主页,就需要将ServletContext中的access_count作加1操作, 再显示在页面上 退出Web应用时,将access_count写入到数据库表中 --%> <br> 欢迎您,<%=session.getAttribute("userName") %> <br><br> 当前用户列表<br> <% List list=(List)application.getAttribute("userList"); for (Object o:list){ out.println((String)o); out.println("<br/>"); } System.out.println(session.getAttribute("userName")); %> <hr/> <a href="LogoutAction" >退出</a> </body>
四、实验过程中所遇问题思考与讨论(可写个人体会,或相关理论知识,根据个人具体情况选做) 通过这次的学习与实验,我进一步掌握了JavaWeb中有关JavaBean和Servlet技术的一些方法,也更加了解了JavaBean和Servlet技术的概念,为今后更好的学习JavaWeb做好铺垫,在学习的过程中,我更加深刻的体会到与老师和同学间的交流与合作是多么的重要,所以在今后的学习与实验当中,我们要善于发现问题,更要及时与老师反馈问题所在,并与老师和同学交流学习经验,共同解决问题,这样才能更好的学好JavaWeb这门课程。
|