23
任务一 application实现在线会员统计

任务一 application实现在线会员统计course.rzpt.cn/uploads/resources/112/2019-09-14/...2019/09/14  · 项目经理要求小刘统计一下成功登陆网站的成员,来方便做好系统维护工作。管理员可以查看已经登陆的会员,并能够查看其详细信息,本任务通过内置对象application

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • 任务一 application实现在线会员统计

  • 项目经理要求小刘统计一下成功登陆网站的成员,

    来方便做好系统维护工作。

  • 管理员可以查看已经登陆的会员,并能够查看其详细信息,本任务通过内置对象application的数据共享机制实现在线人员的显示,如果没有会员登陆则显示“还没有用户登录”。

  • 知识目标: 掌握application对象的常用方法; 掌握HashMap集合类型的常用方法;

  • 技能目标: 能够应用application对象实现数据的共享 能够应用HashMap实现数据的存储与遍历

  • 在线会员统计功能的实现需要三个部分的实现: 用户登录:用户登录时,将个人信息存入application; 显示在线会员:在onlineUser.jsp页面,显示application中的都在线会员。 用户登出:用户登出时,将个人信息从application中删除;

    注册用户1

    管理员

    注册用户2

    注册用户N

    userMap

    application

    登陆LoginServlet

    添加用户信息

    显示在线用户

    登出LogoutServlet 删除用户

    信息

    ……

    onlineUser.jsp

  • 用户登录成功将用户信息存入application。 在任务4.2中已经实现简单的用户登录与登出,通过session保存个人信息,但session只能记录当前会话用户的信息,无法记录其他会话用户的信息,因此需要在登陆成功时,用application全局对象保存登录成功的用户列表。

    打开doLogin.jsp,在登陆成功的分支添加如下代码:

    1.HashMap userMap = (HashMap) application.getAttribute("userMap"); 2.if(userMap==null){ 3. userMap = new HashMap(); 4.} 5.userMap.put(name, user); 6.application.setAttribute("userMap", userMap);

    行号 程序说明

    1 从application中获取在线的用户列表userMap

    2-4 如果userMap为空,表示没有用户登录,将userMap初始化

    5 将用户存入userMap,按照格式存储

    6 将userMap存入application中

  • onlineUser.jsp视图页显示在线用户信息 新建JSP页面:onlineUser.jsp,在页面中从application中取出userMap,如果为null或者无元素,则显示“还没有用户登录”,否则,将用户以表格形式输出。 1. 9. 10.……

    行号 程序说明

    2 从application中获取在线的用户列表userMap

    3-4 如果userMap为空,表示没有用户登录,显示“没有用户登录”

    6 建立遍历userMap的迭代器iterator

  • 用户退出时删除application中的信息

    1. User user = (User)session.getAttribute("user"); 2. HashMap userMap = (HashMap) application.getAttribute("userMap"); 3. if(userMap!=null&&userMap.size()!=0){ 4. userMap.remove(user.getUserName); 5. }

    行号 程序说明

    1 从session中取出个人信息user对象

    2 从application中取出在线用户列表userMap

    3-5 如果userMap不为空并且有元素,从userMap中根据关键字进行删除

    用户登录后,将个人信息存入到application全局变量中,因此,用户登出时,需要将个人信息从application中删除掉,以免产生数据不同步的异常。 打开doLogout.jsp,在从session中删除user对象之前,先从application中将用户信息删除。添加如下代码:

  • 1. 内置对象application

    application是javax.servlet.ServletContext类型的隐含变量,实现了用户间数据的共享,可存放全局变量。

    返回值类型 方法 说明

    Object getAttribute(String key) 通过指定的关键字返回用户所需要的信息,类似于session中的getAttribute(String key)方法。

    void setAttribute(String name,Object value)

    设置属性名与属性值。

    Enumeration getAttributeNames() 返回所有可能的属性名。 void removeAttribute(String key) 通过关键字来删除一个对象信息。 String getServletInfo() 返回JSP引擎的相关信息。 String getRealPath(String path) 返回虚拟路径的真实路径。 String getMineType(String file) 返回指定文件的MIME类型。 String getResourse(String path) 返回指定资源的URL路径。

  • 1. 内置对象application——简易网站访问人数计数

    1.

    2. 3. 4. 网页计数 5. 6. 11.访问次数为: 12. 13.

    注: 值得一提的是,application作为JSP的内置对象,可

    以直接在JSP页面中使用,但是在Servlet中需要通过以下方法才能获得: ServletContext application= (ServletContext)session.getServletContext();

  • 2. HashMap的应用

    1. public static void main(String[] args) { 2. HashMap map = new HashMap (); 3. map.put("1001","杰克"); 4. map.put("1002","汤姆"); 5. map.put("1003","露西"); 6. System.out.println(map.isEmpty()); 7. System.out.println(map.containsKey("1001")); 8. System.out.println(map.containsValue("露西")); 9. System.out.println(map.get("1002")); 10. System.out.println(map.entrySet()); 11. System.out.println(map.keySet()); 12.}

    HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

    (1) HashMap的常用方法

  • 2. HashMap的应用

    1.Iterator iter = map.entrySet().iterator(); 2.while(iter.hasNext()){ 3. Map.Entry entry = (Map.Entry) iter.next(); 4. System.out.println(entry.getKey()+"-"+entry.getValue()); 5.}

    (2)HashMap的遍历

    第一种方式:遍历entrySet,这也是任务实现时所采用的方式,代码如下:

    第二种方式:先遍历keySet,再根据keySet中的关键字获取值进行遍历,代码如下

    1. Iterator iter = map.keySet().iterator(); 2. while(iter.hasNext()){ 3. String key = (String)iter.next(); 4. System.out.println(key +"-"+map.get(key)); 5. }

    对比两种方式,方式一比方式二高效很多,这是因为方式二对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而方式一中,entryset只是遍历了一次,他把key和value都放到了entry中,所以就快了,因此对于HashMap的遍历推荐使用方式一。

  • 1. JSP内置对象:page、pageContex、config、exception

    JSP有9个内置对象:request、response、session、out、application、page、pageContex、config、exception,按照作用进行分类:

    第一类:与Servlet有关:page和config; 第二类:与Input/Output有关:out,request和response; 第三类:与Context有关:application,session和pageContext; 第四类:与Error有关:exception。

  • 1. JSP内置对象:page、pageContex、config、exception

    (1)page:代表JSP转译后的Servlet,通过page对象可以调用Servlet类中定义的方法。page对象就是指向当前JSP页面本身,它是java.lang.Object类的实例序号方法说明。

    1. 2. 3. 4. page对象 5. 6. 7. 8. 9. 10.

    行号 程序说明

    2 在page指令中定义info属性为“this is the page Object Practice”

    14 通过page对象获得转译为Servlet后的信息

    15 输出info

  • (2)pageContext:可以用来设置page范围的属性,还可以设置其他范围属性,不过需要指定范围参数,同时还可以获取其他内置对象。

    返回值类型 方法 说明 Exception getException() 获取当前的exception内置对象 JspWriter getOut() Object getPage() ServletRequset getRequest() ServletResponse getResponse() ServletConfig getServletConfig() ServletContext getServeltContext() HttpSession getSession() Object getAttribute(String name,int scope) 获取指定范围的name属性值 Enumeration getAttributeNamesInScope(int scope) 获取指定范围所有属性名称 int getAttributesScope(String name) 获取属性名称为name的属性范围 void removeAttribute(String name) 移除属性名称为name的 属性 void removeAttribute(String name,int scope) 移除指定范围的属性名称为name的 属性 void setAttribute(String name,Object value,int

    scope) 设置指定范围的name属性

    Object findAttribute(String name) 寻找所有范围的属性名称为name的属性

  • (3)config:在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。

    返回值类型 方法 说明

    String getInitParameter(name) 获取Servlet初始化参数 Enumeration getInitParameterNames() 获取Servlet所有初始化参数名称 ServletContext getServletContext() 获取当前Application context String getServletName() 获取Servlet名称

  • (4) exception:用来处理错误异常,如果要用exception对象,必须指定page中的isErrorPage属性值为true。

    1. 2. 3.错误页面 4. 5. 6. 7.

    1.

    2. 3. 4. 处理错误异常 5. 6.
    7.
    8.
    9. 10. 11.

    页面1:包含错误的页面:error.jsp 页面2:异常处理页面:exception.jsp

  • 2. Java中的集合对象

    Object

    Map接口

    HashMap TreeMap

    Collection接口

    Set接口 List接口

    HashSet TreeSet ArrayList LinkedList

  • 2. Java中的集合对象

    (1)、List 这个接口下的类特点是对象的顺序是按照插入的顺序进行排列的。并且允许有多个重复的对象。这个接口有两个比较常用的实际类,ArrayList和LinkedList。 ArrayList:这个容器类非常类似于数组,因为他的存储方式是在内存中分配一段连续的空间存储数据。使用这个类的优势在于随机访问数据速度非常快,并且在最后添加数据时也能获得更高的效率。 LinkedList:这个容器是由链表的方式存储数据,也就是说在内存中数据也许不是连续的,而是分布在不同的地方,LinkedList则是通过链表的形式将他们连接起来。它随机访问数据的速度和在最后添加数据的速度比ArrayList慢,但是如果需要在中间插入或者删除数据,那么它的效率比ArrayList快。

  • 2. Java中的集合对象

    (2)、 Set Set和List都是继承于Collection接口的子接口,也就是说实现Set接口的类应该具有Collection接口的所有方法,这个和List是一样的。但是Set和List的区别在于,存入Set的对象是用散列法来计算的,这个是和Map容器一样的,也就是说存入的对象不允许有相同的对象。在Set中添加对象的方法也是使用add()方法,但是它没有get()方法来获取其中的对象,而是使用迭代器进行遍历数据,后面会介绍关于迭代器的使用。Set常用的类包括HashSet、LinkedHashSet、TreeSet。其中HashSet和LinkedHashSet区别是HashSet是在内存中连续存储数据,而LinkedHashSet是使用链表的方式存储数据,这和刚才说的ArrayList和LinkedList形式是一样的。 TreeSet则是排序的方式不同,前两者默认有采用的是自己内置的排序方式,往往这种排序方式我们并不需要关心。而TreeSet则是采用自然的顺序进行排序。并且TreeSet可以通过SortedSet这个接口来改变他的排序方式,比如反自然的顺序。其他的add()添加、clear()清除所有、contains()比较,这些方法的用法大致和List差不多。下面介绍一下关于TreeSet这个类的用法,他是按照自然顺序进行排序。并且还可以使用SortedSet接口来定义排序的方式。

  • 2. Java中的集合对象

    (3)、 Map Map这个接口不属于Collection,它相当于一个独立存在的接口。那么他就不具有象set里面的一些方法。Map是根据一种映射关系来储存数据。其中key不能有重复,value则可以重复。Map接口也有许多实现了的子类。比较常用的是HashMap,LinkedHashMap,TreeMap,Hashtable。前三者的区别和Set中一样,HashMap和LinkedHashMap在内存中存储方式不一样,当然效率也就不相同,TreeMap则是按照自然顺序进行排列。

  • 在项目5中学习过数据库访问后,尝试实现会员信息列表时,在线用户显示 ,离线用户显示

    幻灯片编号 1幻灯片编号 2幻灯片编号 3幻灯片编号 4幻灯片编号 5幻灯片编号 6幻灯片编号 7幻灯片编号 8幻灯片编号 9幻灯片编号 10幻灯片编号 11幻灯片编号 12幻灯片编号 13幻灯片编号 14幻灯片编号 15幻灯片编号 16幻灯片编号 17幻灯片编号 18幻灯片编号 19幻灯片编号 20幻灯片编号 21幻灯片编号 22幻灯片编号 23