由于本人对于java没有接触过,但是项目现在需要一点java哈希表的知识,特向高手请教。
需求:
前台通过GET方式请求一个Servlet,传递一个参数userName,Servlet接受这个参数,查找哈希表,如果在哈希表没有找到userName的话(userName为Key),则将userName当做Key存放在哈希表中,当前系统时间作为这个Key的Value;如果哈希表中已经有了userName,则找到这个userName的Value,也就是当时存放这个Key时的系统时间,与当前时间比较,如果当前时间减去2分钟大于当时的系统时间(userName的Value),则将该userName的key和value从哈希表中清除。最后将这个哈希表的key以一个数组的形式返回前台。(我前台是用javascript方式,xmlhttp的get方式请求的,不知道怎么能接收到Servlet返回的值)问题解决另开100分相送。谢谢。

解决方案 »

  1.   

    JSP EL标签轻松解析Servlet response获得属性即可。
      

  2.   

    可以将值放进session中,在前台获得
      

  3.   

    我说一下思路: 在一个jsp提交一个userName;在servlet中这么写: public class Number extends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException
    {
                  String a = request.getParameter("userName");//获得username 的值
           long time = System.currentTimeMillis();//获得系统当前时间
                  //和hash表比较,执行应有的操作
           
           PrintWriter out = response.getWriter();
           out.println(你的hash表);
          

    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
      {
          doGet(request, response);

      }}
      

  4.   

    如何在哈希表中清除一对key value 呢?
      

  5.   

    public synchronized object remove(object key)
      从哈希表中删除关键字key所对应的对象。
      public synchronized void clear()
      清除哈希表
      

  6.   

    比如你的是Set <String> set = new HashSet <String>();
    set.remove(a);
      

  7.   

    //工程名Test
    package com;import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;public class Test extends HttpServlet
    {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    HttpSession session =request.getSession();
    PrintWriter out = response.getWriter();
    response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    // 从session中得到Map,如果没有,则创建新的Map
    //LZ的user信息应该登陆是在别的地方以 session.setAttribute("userNameMap", Object);
    Map nameMap = (Map)session.getAttribute("userNameMap");

    if (null == nameMap)
    {
    nameMap = new HashMap();
    }

    //业务逻辑{
    //传递一个参数userName,Servlet接受这个参数,查找哈希表,
    /**
     * 获得从页面传过来的?username = "";
     */
    String username =(String)request.getAttribute("username");
    //如果在哈希表没有找到userName的话(userName为Key),
    if(!nameMap.containsKey(username)){
    // 则将userName当做Key存放在哈希表中,当前系统时间作为这个Key的Value; 
    nameMap.put(username, getSysDate());
    }
    //如果哈希表中已经有了userName,则找到这个userName的Value,
    else{
    //也就是当时存放这个Key时的系统时间,与当前时间比较,
    int nameDate = (Integer)nameMap.get(username);
    //如果当前时间减去2分钟大于当时的系统时间(userName的Value),
    if(nameDate - getSysDate()>2){
    //则将该userName的key和value从哈希表中清除。
    nameMap.remove(username);
    }

    }
    //最后将这个哈希表的key以一个数组的形式返回前台。
    //(我前台是用javascript方式,xmlhttp的get方式请求的,不知道怎么能接收到Servlet返回的值) 
    out.println(getuserString(nameMap));
    out.flush();
    out.close();

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    this.doGet(request, response);
    }
    /**
     * 获得系统时间 格式自己根据需求定义
     * @return
     */
    public static int getSysDate(){
    Calendar  day = Calendar.getInstance();

    SimpleDateFormat  dateFormat = new SimpleDateFormat("yyyyMMddhh24MMss");
    return Integer.parseInt((String)dateFormat.format(day.getTime()));
    }

    /**
     * 最后将这个哈希表的key以一个name,name,name的String形式返回前台。
     * 在JS中用nameString.split(,)获得数组
     * @param nameMap
     * @return
     */
    public static String  getuserString(Map nameMap ) {
    String nameString = null;
    if (nameMap.size() > 0) {
    Iterator itor = nameMap.keySet().iterator();

    while (itor.hasNext()) {

    nameString = (String) itor.next()+",";
    }
    }
    return nameString; }
    } //web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <servlet>
        <description>Test</description>
        <display-name>Test</display-name>
        <servlet-name>Test</servlet-name>
        <servlet-class>com.Test</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/Test</url-pattern>
      </servlet-mapping>
    </web-app>
    //页面
    <html>
    <head>
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
    var httpRequest;
      function connectToAjax(){
     
      if(window.XMLHttpRequest){
      httpRequest = new XMLHttpRequest();
      if(httpRequest.overrideMimeType){
      httpRequest.overriderMimeType("text/xml");
      }
      }
      else if (window.ActiveXObject){
     
      try{
      httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      }catch(e){
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
      }
      }
      if(!httpRequest){
      alert("httpRequest 创建异常!");
      }
     
      httpRequest.onreadystatechange=getjsp;
     
      httpRequest.open("GET", "/Test/Test", true);
      httpRequest.send(null);
      }
      function getjsp(){
      if(httpRequest.readyState==4){
     
      if(httpRequest.status==200){
      //返回值根据需要自己处理此处只弹出
      alert(httpRequest.responseText);
      }
      }
      }
      </script>
    </head>
    <body>
    <input type="button" value="提交" alt="TEST" onclick="connectToAjax()" />
    </body>
    </html>
      

  8.   

    返回前台我不知道该怎么写,其他的应该满足你的需求public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException
    {
    String userName = request.getParameter("userName");//获得username 的值
    long currentTime = System.currentTimeMillis();//获得系统当前时间HashMap<String, long> map = new HashMap<String, long>();//哈希表
    if (map.containsKey(userName))//用户名是否存在于当前哈希表中
    {
    if (currentTime - 120000 > map.get(userName))//当前时间减去2分钟大于当时的系统时间
    {
    map.remove(userName);//将该userName的key和value从哈希表中清除
    }
    }
    else
    {
    map.put(userName, currentTime);//将userName当做Key存放在哈希表中,当前系统时间作为这个Key的Value
    }
    String[] userNames = map.keySet().toArrays();//哈希表的key以一个数组的形式
    }
      

  9.   

    //写错了一个小地方更正
    if(nameDate - getSysDate()>200){ 
      

  10.   

    仔细想了下时间比较用parInt有问题
    用10楼那位大侠的比较好
      

  11.   

    HashMap<String, long> map = new HashMap<String, long>();这行报错啊,提示是5.0以上的写法我的是1.4版本的jdk,该怎么写呢?1.4.2jdk下定义一个hashmap key是string类型的 value是long的,该怎么定义。
      

  12.   

    1.4不支持范型,这样写HashMap map = new HashMap();
    取出来的都是Object型的,需要强制转化一下。(Long)map.get("username");
      

  13.   

    吐血,竟然是1.4.2.....这句改一下
    HashMap<String, long> map = new HashMap<String, long>();//哈希表

    HashMap map = new HashMap();//哈希表还有这句
    if (currentTime - 120000 > map.get(userName))

    if (currentTime - 120000 > Long.parseLong(map.get(userName)))这句可能需要改
    String[] userNames = map.keySet().toArrays();

    Object[] userNames = map.keySet().toArrays();然后取的时候在强转成String类型的
    String user1 = (String)userNames[0];
      

  14.   

    后台逻辑判断完成之后,以json字符串的形式返回:
    response.getWriter.println("[key1,key2,key3...keyn]");
    然后在页面就可以用解析服务器传回来的json串了:
    var key_arr = t.responseText.evalJSON();