不要被AttributeListener给骗了..
如果添加了servlet上下文属性监听器和Session属性监听器, 当触发相应的属性时,即添加了新的属性和改变值,会触发相应的监听器代码,
但是,只有当显示的调用" application.setAttribute() " 时才能触发监听器,
如果直接使用参数改变属性的值,是不会触发监听器的,
虽然此时不会触发监听器,但是属性值已经改变了,
以下:
public class ChatService {
public static void SendMessage( LinkedList ll ,String msg ){
ll.add(msg);
if (ll.size() > 4 ) ll.removeFirst();
}
}
servlet:
public class MsgServlet extends HttpServlet {
// ChatService cs = new ChatService();
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/xml;charset=UTF-8");
PrintWriter out = response.getWriter();
String message = "<message><![CDATA["+request.getParameter("message")+"]]></message>";
ChatService.SendMessage( (LinkedList)request.getSession().getServletContext().getAttribute("messages") , message );//使用带参数的方法来改变Attribute的值;
//request.getSession().getServletContext().setAttribute("messages" , (LinkedList)request.getSession().getServletContext().getAttribute("messages"));//显式的调用setAttribute()方法;如果不调用,不会触发监听器事件;
String msgs = ChatService.getMsg( (LinkedList)request.getSession().getServletContext().getAttribute("messages"),"" );
// System.out.println( "all: "+(LinkedList)request.getSession().getServletContext().getAttribute("messages") );
try {
out.println( ToXML(msgs) );
// System.out.println(ToXML(msgs));
} finally {
out.close();
}
}