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

JSP
jsp计数器制作
用jsp编写文件上载
基于JSP的动态网站开发技术
JSP由浅入深(3)—— 通过表达式增加动态内容
JSP由浅入深(5)—— Scriptlets和HTML的混合
JSP由浅入深(1)—— 熟悉JSP服务器
JSP由浅入深(12)—— 表单编辑
JSP由浅入深(11)—— 标记库
JSP由浅入深(10)—— Beans and Forms处理
JSP由浅入深(9)—— JSP Sessions
JSP由浅入深(8)—— JSP Tags
JSP由浅入深(6)—— JSP声明
JSP由浅入深(4)—— Scriptlets
JSP由浅入深(2)—— 第一个JSP
JSP由浅入深(7)—— JSP Directives
JSP中的字符替换函数 str_replace() 实现!
把一张图片变形扭曲成各种不同的长宽
用JSP编写通用信息发布程序
Java Servlet及Cookie的使用
Apache+Servlet+Jsp环境设置(上)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 88 ::
收藏到网摘: 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下配置成功通过