当前位置: 首页 > 图文教程 > 网络编程 > JSP > 利用Servlet的上下文环境和会话来实现聊天的程序

JSP
Java 创建cookie和删除cookie
jsp 从web.xml读取连接数据库的参数
jsp 不支持EL表达式,解决办法
jsp 获取客户端的浏览器和操作系统信息
struts2 session 解读
struts2 spring整合fieldError问题
jsp 生成验证码代码
搭建java WEB开发环境和应用
JSP 自定义标签
Java 区分文本中的中英文字符函数
通用JSP页面 jsp入门级文章
jsp struts1 标签实例详解
一个jdbc 测试程序代码
SSH整合中 hibernate托管给Spring得到SessionFactory
jsp SmartUpload 实现上传功能代码
jsp Unsupported encoding: gb2312 错误原因
java Struts2 在拦截器里的跳转问题
jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
Java 项目生成静态页面的代码
jdk与jre的区别 很形象,很清晰,通俗易懂

JSP 中的 利用Servlet的上下文环境和会话来实现聊天的程序


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 80 ::
收藏到网摘: n/a

上下文环境是针对服务器端的数据共享,例如聊天室目录,聊天信息就存在上下文环境中
会话,是针对客户端信息共享,如你登录了那个聊天室

具体代码显示如下,(参考J2EE编程指南)


/////////////////////////////////////////////////////////////
//////////////////////////////////////////

public class ChatEntry {
  private String profileName;
  private String message;

  public ChatEntry(String profileName, String message) {
    this.profileName = profileName;
    this.message = message;
  }

  public String getProfileName() {
    return profileName;
  }

  public void setProfileName(String profileName) {
    this.profileName = profileName;
  }

  public String getMessage() {
    return message;
  }
}




/////////////////////////////////////////
///////////////

import java.util.Stack;

public class ChatRoom extends Stack {
  private String name;
  private String description;
    
  public ChatRoom(String name, String description, int maxEntries) {
    this.name = name;
    this.description = description;

    this.setSize(maxEntries);
  }
    
  public void addChatEntry(ChatEntry entry) {
    push(entry);
  }

  public String getDescription() {
    return description;
  }
    
  public String getName() {
    return name;
  }
}


////////////////////////////////////////////
////////////////////////////////

// Import servlet packages
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Import java packages
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;

public class ChatAdminServlet extends HttpServlet {

  String chatRoomPath;
  String listRoomsPath;
  String chatAdminPath;
    
  public void init() {
    ServletContext context = getServletContext();
    chatRoomPath = context.getInitParameter("CHATROOM_PATH");
    listRoomsPath = context.getInitParameter("LISTROOMS_PATH");
    chatAdminPath = context.getInitParameter("ADMIN_PATH");
  }

  public void doGet(HttpServletRequest req, HttpServletResponse res) 
        throws IOException, ServletException {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    out.println("<HTML>");
    out.println("<HEAD><TITLE>Chat Room Administration</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("<H1>Chat room administration</H1>");
    out.println("<FORM METHOD=\"POST\" ACTION=\"" + res.encodeURL(chatAdminPath) + "\">");
        
    // Check for existing chat rooms
    HashMap roomList = (HashMap) getServletContext().getAttribute("roomList");
    if(roomList != null) {
      Iterator rooms = roomList.keySet().iterator();
            
      if(!rooms.hasNext()) {
        out.println("<p>There are no rooms</p>");
      } else {
        out.println("<p>Check the rooms you would like to remove," + "and press Update List.</p>");

        while(rooms.hasNext()) {
          String roomName = (String) rooms.next();
          ChatRoom room = (ChatRoom) roomList.get(roomName);
          out.println("<INPUT TYPE=CHECKBOX NAME=remove VALUE='" + room.getName() + "'>" + room.getName() + "<BR>");
        }
      }
    }

    // Add fields for adding a room
    out.println("<P>Enter a new room and the description<P>");
    out.println("<TABLE>");
    out.println("<TR><TD>Name:</TD><TD><INPUT NAME=roomname SIZE=50></TD></TR>");
    out.println("<TR><TD>Description:</TD>");
    out.println("<TD><TEXTAREA NAME=roomdescr COLS=40 ROWS=5>");
    out.println("</TEXTAREA></TD></TR>");
    out.println("</TABLE>");
        
    // Add submit button
    out.println("<P><INPUT TYPE=SUBMIT VALUE='Update List'>");
    out.println("<p><A HREF=\"" + listRoomsPath + "\">Chat Now</a>");
    out.println("</FORM>");
    out.println("</BODY></HTML>");
        
    out.close();
  }

  /**
   * Processes POST request for adding new rooms, or deleting existing rooms.
   */
  public void doPost(HttpServletRequest req, HttpServletResponse res) 
              throws IOException, ServletException {
    HashMap roomList = null;
    // Check for existing chat rooms
    synchronized(getServletContext()) {
      roomList = (HashMap) getServletContext().getAttribute("roomList");
      if(roomList == null) {
        roomList = new HashMap();
        getServletContext().setAttribute("roomList", roomList);
      }
    }
        
    // Update the room list
    String[] removeList = req.getParameterValues("remove");
    synchronized(roomList) {
      if(removeList != null) {
        for(int i = 0; i < removeList.length; i++) {
          roomList.remove(removeList[i]);
        }
      }
    }
        
    String roomName = req.getParameter("roomname");
    String roomDescr = req.getParameter("roomdescr");
        
    if(roomName != null && roomName.length() > 0) {
      synchronized(roomList) {
        roomList.put(roomName, new ChatRoom(roomName, roomDescr, 4));
      }
    }
    doGet(req, res);
  }
}


/////////////////////////////////////////
///////////////////////////////////

// Import servlet packages
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Import java packages
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.net.URLEncoder;

public class ListRoomsServlet extends HttpServlet {

  String chatAdminPath;
  String listRoomsPath;
  String chatRoomPath;
    
  public void init() {
    ServletContext context = getServletContext();
    chatAdminPath = context.getInitParameter("ADMIN_PATH");
    listRoomsPath = context.getInitParameter("LISTROOMS_PATH");
    chatRoomPath = context.getInitParameter("CHATROOM_PATH");
  }
    
  public void doGet(HttpServletRequest request, HttpServletResponse response)
              throws IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
        
    String expand = request.getParameter("expand");
    HttpSession session = request.getSession();
    String profileName = (String) session.getAttribute("profileName");
    if(profileName == null) {
      profileName = "";
    }

    out.println("<HTML>");
    out.println("<HEAD><TITLE>Chat rooms</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("<H1>Chat rooms</H1>");
    out.println("<FORM METHOD=POST ACTION=\"" + chatRoomPath + "\">");
    out.println("<p><a href=\"" + chatAdminPath + "\">Create Rooms</a></p>");
        
    // Get the list of rooms
    HashMap roomList = (HashMap) getServletContext().getAttribute("roomList");
    if(roomList == null) {
      out.println("<p>There are no rooms available right now.</p>");
    } else {
      // Add radio boxes for selecting a room
      out.println("Select the room you like to enter " + "or click on a name to see the description:<P>");
            
      Iterator rooms = roomList.keySet().iterator();
      boolean isFirst = true;
      while(rooms.hasNext()) {
        String roomName = (String) rooms.next();
        ChatRoom room = (ChatRoom) roomList.get(roomName);
        String listRoomsURL = listRoomsPath + "/?expand=" + URLEncoder.encode(roomName);
        listRoomsURL = response.encodeURL(listRoomsURL);
                
        out.println("<INPUT TYPE=RADIO NAME=roomName VALUE=\"" + roomName + "\"" +
                            (isFirst ? " CHECKED" : "") + ">" + "<A HREF=\"" + listRoomsURL + "\">" +
                            roomName + "</A><BR>");
        isFirst = false;
                  
          // Show description if requested
          if (expand != null && expand.equals(roomName)) {
            out.println("<BLOCKQUOTE>");
          if(room.getDescription().length() == 0) {
            out.println("No description available.");
          } else {
            out.println(room.getDescription());
          }
          out.println("</BLOCKQUOTE><BR>");
        }
      }

      // Add a field for the profile name
      out.println("<P>Enter your name: ");
      out.println("<INPUT NAME=profileName VALUE='" + profileName + "' SIZE=30>");
            
      // Add submit button
      out.println("<P><INPUT TYPE=SUBMIT VALUE='Enter'>");
      out.println("</FORM>");
    }
    out.println("</BODY></HTML>");
    out.close();
  }
}


/////////////////////////////////////////////////////
///////////////////////////////////////


// Import servlet packages
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Import java packages
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;

public class ChatRoomServlet extends HttpServlet {
  String chatRoomPath;
  String listRoomsPath;

  public void init() {
    ServletContext context = getServletContext();
    chatRoomPath = context.getInitParameter("CHATROOM_PATH");
    listRoomsPath = context.getInitParameter("LISTROOMS_PATH");
  }

  public void doGet(HttpServletRequest req, HttpServletResponse res) 
       throws IOException, ServletException {

    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    ChatRoom room = getRoom(req, res);
    if(room == null) {
      return;
    }

    // Check if it's a request for a message list or a form
    String listPar = req.getParameter("list");
    if(listPar != null && listPar.equals("true")) {    
      writeMessages(out, room, getProfileName(req));
    } else {
      out.println("<HTML>");
      out.println("<BODY>");
      out.println("<FORM METHOD=\"POST\" ACTION=\"" + res.encodeURL(chatRoomPath) + "\" TARGET=\"_top\">");

      out.println("<p>Enter your message:</p>");
      out.println("<INPUT NAME=\"msg\" SIZE=\"30\">");

      // Add a Submit button
      out.println("<P><INPUT TYPE=SUBMIT VALUE='Send Message'>");

      // Add an Exit button
      out.println("</FORM>");
      out.println("<FORM ACTION=\"" + res.encodeURL(listRoomsPath) + "\" METHOD=\"GET\" TARGET=\"_top\">");
      out.println("<INPUT TYPE=SUBMIT VALUE=Exit>");
      out.println("</FORM>");

      out.println("</BODY></HTML>");
    }
    out.close();
  }

  public void doPost(HttpServletRequest req, HttpServletResponse res) 
        throws IOException, ServletException {
    res.setContentType("text/html");

    ChatRoom room = getRoom(req, res);
    if (room == null) {
            return;
    }

    String profileName = getProfileName(req);

    // Save message if any
    String msg = req.getParameter("msg");
    if (msg != null && msg.length() != 0) {
      room.addChatEntry(new ChatEntry(profileName, msg));
    }
    writeFrame(res, room);
  }

  private String getProfileName(HttpServletRequest req) {
    HttpSession session = req.getSession(true);
    String profileName = (String) session.getAttribute("profileName");
    if (profileName == null) {
      // Entered a room for the first time?
      profileName = req.getParameter("profileName");
      if(profileName == null || profileName.length() == 0) {
        profileName = "Anonymous";
      }
      session.setAttribute("profileName", profileName);
    } else {
      // Entered a new room with a new name?
      String newName = req.getParameter("profileName");
      if (newName != null && newName.length() > 0 && !newName.equals(profileName)) {
        profileName = newName;
        session.setAttribute("profileName", profileName);
      }
    }
    return profileName;
  }

  private ChatRoom getRoom(HttpServletRequest req, HttpServletResponse res) 
                   throws IOException {

    HttpSession session = req.getSession(true);
    PrintWriter out = res.getWriter();

    String roomName = (String) session.getAttribute("roomName");
    if(roomName == null) {
      // Just entered?
      roomName = req.getParameter("roomName");
      if(roomName == null || roomName.length() == 0) {
        writeError(out, "Room not specified");
        return null;
      }
      session.setAttribute("roomName", roomName);
    } else {
      // Entered a new room?
      String newRoom = req.getParameter("roomName");
      if (newRoom != null && newRoom.length() > 0 && !newRoom.equals(roomName)) {
        roomName = newRoom;
        session.setAttribute("roomName", roomName);
      }
    }

    HashMap roomList = (HashMap) getServletContext().getAttribute("roomList");
    ChatRoom room = (ChatRoom) roomList.get(roomName);
    if(room == null) {
      writeError(out, "Room " + roomName + " not found");
      return null;
    }
    return room;
  }

  private void writeError(PrintWriter out, String msg) {

    out.println("<HTML>");
    out.println("<HEAD><TITLE>Error</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("<H1>Error</H1>");
    out.println(msg);
    out.println("</BODY></HTML>");
  }

  private void writeFrame(HttpServletResponse res, ChatRoom room) throws IOException {

    PrintWriter out = res.getWriter();

    out.println("<HTML>");
    out.println("<HEAD><TITLE>" + room.getName() + "</TITLE></HEAD>");
    out.println("<FRAMESET ROWS='50%,50%' BORDER=0 FRAMEBORDER=NO>");
    out.println("<FRAME SRC=\"" + res.encodeURL(chatRoomPath) + "?list=true\" NAME=\"list\" SCROLLING=\"AUTO\">");
    out.println("<FRAME SRC=\"" + res.encodeURL(chatRoomPath) + "?list=false\" NAME=\"form\" SCROLLING=\"AUTO\">");
    out.println("<NOFRAMES>");
    out.println("<BODY>");
    out.println("Viewing this page requires a browser capable of displaying frames.");
    out.println("</BODY>");
    out.println("</NOFRAMES>");
    out.println("</FRAMESET>");
    out.println("</HTML>");
    out.close();
  }

  private void writeMessages(PrintWriter out, ChatRoom room, String profileName) {

    StringBuffer sb = new StringBuffer();

    out.println("<HTML>");
    out.println("<HEAD><META http-equiv=\"refresh\" content=\"5\"></HEAD>");
    out.println("<BODY>");
    out.println("<B>Room: " + room.getName() + "</B><BR>" + "<B>Identity: " + profileName + "</B><BR>");

    // List all messages in the room
    if (room.size() == 0) {
      out.println("<FONT COLOR=RED>There are no messages in this room yet</FONT>");
    } else {
      Iterator entries = room.iterator();
      while(entries.hasNext()) {
        ChatEntry entry = (ChatEntry) entries.next();
        if(entry == null) continue;
    String entryName = entry.getProfileName();
        if(entryName.equals(profileName)) {
          out.print("<FONT COLOR=BLUE>");
        }
        out.println(entryName + " : " + entry.getMessage() + "<BR>");
        if(entryName.equals(profileName)) {
          out.print("</FONT>");
        }
      }
    }
    out.println("</BODY></HTML>");
  }
}


////////////////////////////////////
////////////
web.xml配置文件如下
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 1.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
  <context-param>
    <param-name>ADMIN_PATH</param-name>
    <param-value>chatAdmin</param-value>
  </context-param>

  <context-param>
    <param-name>LISTROOMS_PATH</param-name>
    <param-value>listRooms</param-value>
  </context-param>

  <context-param>
    <param-name>CHATROOM_PATH</param-name>
    <param-value>chatRoom</param-value>
  </context-param>

  <servlet>
    <servlet-name>chatAdmin</servlet-name>
    <servlet-class>ChatAdminServlet</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>chatRoom</servlet-name>
    <servlet-class>ChatRoomServlet</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>listRooms</servlet-name>
    <servlet-class>ListRoomsServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>chatAdmin</servlet-name>
    <url-pattern>/chatAdmin/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>chatRoom</servlet-name>
    <url-pattern>/chatRoom/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>listRooms</servlet-name>
    <url-pattern>/listRooms/*</url-pattern>
  </servlet-mapping>
                
                
                
</web-app>


在Weblogic下配置成功通过