package com.hoo.entity;
import java.util.Date;
public class Message {
private int id;
private String msg;
private Date time;
// Getter/Setter 省略
}
package com.hoo.chat;
import org.springframework.context.ApplicationEvent;
public class ChatMessageEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
public ChatMessageEvent(Object source) {
super(source); // source 為 Message 實例
}
}
ApplicationEvent,攜帶 source (Message) 傳遞給監聽器;ApplicationContext.publishEvent() 發布 → 所有 ApplicationListener 接收。package com.hoo.chat;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import com.hoo.entity.Message;
public class ChatService implements ApplicationContextAware {
private ApplicationContext ctx;
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}
public void sendMessage(Message msg) {
// 發布業務事件,觸發 ChatMessageClient.onApplicationEvent()
ctx.publishEvent(new ChatMessageEvent(msg));
}
}
[瀏覽器 chat.jsp]
│ sendMessage(msg)
▼
[DWR Servlet] → [ChatService.sendMessage(Message)]
│
▼
[ApplicationContext.publishEvent(ChatMessageEvent)]
│
▼
[ChatMessageClient.onApplicationEvent] (ApplicationListener)
│
├─ 獲取所有 ScriptSession (chat.jsp)
└─ session.addScript(showMessage(...)) → 推送至瀏覽器
ChatService;Message,避免 Map/JSON 解析錯誤;ChatService 以 POJO 形式暴露,DWR 自動生成 JS Stub,前端調用如本地函數。下一篇將展示監聽器實現與 Spring/DWR 容器整合配置。