项目需求:后台新增功能,直接从服务器推送信息,提示后台人员还有未完成任务。
一直参考网上的代码,今天也做回贡献,把这个礼拜自己写的DWR推送信息给大家分享分享。
1.在web.xml里面增加
<listener>
<listener-class>com.quartz.JobManager</listener-class>
</listener>
监听器,使其跟着项目一起启动。
2.JobManager的类
public class JobManager implements ServletContextListener{
Scheduler scheduler=null;
public void start(){
JobDetail jobDetail=JobBuilder.newJob(Myjob.class).withIdentity("myjob", "job-group").build();
CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity("cronTrigger", "trigger-group")
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")).build();
SchedulerFactory sFactory=new StdSchedulerFactory();
try {
scheduler=sFactory.getScheduler();
scheduler.scheduleJob(jobDetail,cronTrigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JobManager manager=new JobManager();
manager.start();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
try {
if(scheduler!=null) scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
start();
}
}
其中10就是每隔10秒运行一次。
3.Myjob类
public class Myjob implements Job{
private Session session=SessionUtil.getSession();
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//这里就是需要推送的信息。我的是从数据库查询还有未完成的信息,然后自己封装
MessagePush push=new MessagePush();
push.send(getMsg());
}
getMsg()这个方法是我写在这个类里面的私有方法,设计到公司数据,不好写出来。
private Map<String,List<Object[]>> getMsg(){
//查询数据
}
}
以上就是quartz的简单使用。
4.接下来在web.xml上配置
<listener>
<listener-class>org.directwebremoting.servlet.DwrListener</listener-class>
</listener>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>initApplicationScopeCreatorsAtStartup</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jsonpEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>3000</param-value>
</init-param>
<init-param>
<param-name >org.directwebremoting.extend.ScriptSessionManager</param-name>
<param-value >com.dwr.DWRScriptSessionManager</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
有些可能不需要。不过写着也没错,比较是后台嘛,性能什么的没关系。
5.DWRScriptSessionListener类
public class DWRScriptSessionListener implements ScriptSessionListener{
//维护一个Map key为session的Id, value为ScriptSession对象
public static Map<String, ScriptSession> scriptSessionMap = new HashMap<String, ScriptSession>();
@Override
public void sessionCreated(ScriptSessionEvent event) {
WebContext webContext = WebContextFactory. get();
HttpSession session = webContext.getSession();
ScriptSession scriptSession = event.getSession();
scriptSessionMap.put(session.getId(), scriptSession); //添加scriptSession
//System. out.println("[新增]session: " + session.getId() + "> scriptSession: " + scriptSession.getId() + "is created!");
}
@Override
public void sessionDestroyed(ScriptSessionEvent event) {
WebContext webContext = WebContextFactory. get();
HttpSession session = webContext.getSession();
ScriptSession scriptSession = scriptSessionMap.remove(session.getId()); //移除scriptSession
//System. out.println("[删除]session: " + session.getId() + " scriptSession: " + scriptSession.getId() + "is destroyed!");
}
public static Collection<ScriptSession> getScriptSessions(){
return scriptSessionMap.values();
}
}
6.DWRScriptSessionManager类
public class DWRScriptSessionManager extends DefaultScriptSessionManager{
public DWRScriptSessionManager(){
//绑定一个ScriptSession增加销毁事件的监听器
this.addScriptSessionListener(new DWRScriptSessionListener());
}
}
7.MessagePush类
public class MessagePush{
private String sessionTag="tag";
private Session session=SessionUtil.getSession();
private List list=getPromission();
public void onPageLoad(final String tag){
//获取当前的ScriptSession
ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
scriptSession.setAttribute(sessionTag, tag);
}
public void send(Map<String,List<Object[]>> msg){
String content="";
if(msg!=null && msg.size()>0) content=JSONArray.fromObject(msg).toString();
sent(content);
}
public void sent(final String content){
Object teg=null;
Collection<ScriptSession> temp=new ArrayList<ScriptSession>();
Collection<ScriptSession> sessions = DWRScriptSessionListener.getScriptSessions();
if(sessions.size()>0){
for (ScriptSession scriptSession : sessions){
teg=scriptSession.getAttribute(sessionTag);
if(teg==null || "".equals(teg)){
temp.add(scriptSession);
continue;
}
if(!isShow(scriptSession.getAttribute(sessionTag)+"")){
temp.add(scriptSession);
continue;
}
}
sessions.removeAll(temp);
}else return;
if(sessions.size()<=0) return;
ScriptSessionFilter filter = new ScriptSessionFilter() {
@Override
public boolean match(ScriptSession scriptSession) {
if(scriptSession==null) return false;
String tag=null;
try{
Object obj=scriptSession.getAttribute(sessionTag);
if(obj==null || "".equals(obj)) return false;
tag=obj.toString();
}catch(Exception e){
e.getStackTrace();
return false;
}
boolean compale=isShow(tag.trim());
return compale;
}
};
Runnable run = new Runnable(){
private ScriptBuffer script = new ScriptBuffer();
@Override
public void run() {
//设置要调用的 js及参数
script.appendCall("show", content);
//得到所有ScriptSession
Collection<ScriptSession> sessions = DWRScriptSessionListener.getScriptSessions();
//遍历每一个ScriptSession
for (ScriptSession scriptSession : sessions){
scriptSession.addScript(script);
}
}
};
//执行推送
Browser.withAllSessionsFiltered(filter,run);
}
//和需要推送的用户去比对。
public boolean isShow(String tag){
if(list==null) return false;
for(Object obj:list.toArray()){
if(obj.equals(tag)) return true;
}
return false;
}
private List getPromission(){
//此方法是获取某某权限下的所有用户。然后和需要推送的用户去比对。
//和上个方法一样涉及公司数据库就不写了。
}
}
8.然后在和web.xml同目录下新建dwr.xml
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="MessagePush">
<param name="class" value="com.dwr.MessagePush"/>
</create>
</allow>
</dwr>
9.接下来就是页面上引用DWR的JS了,我的是在公共的底部引用的。
<script type="text/javascript" src="${ctx }/dwr/engine.js"></script>
<script type="text/javascript" src="${ctx }/dwr/util.js"></script>
<script type="text/javascript" src="${ctx }/dwr/interface/MessagePush.js"></script>
注意:
A.${ctx }是项目跟路径。如何判断是否引用进来了,直接右击查看源码,然后直接点击链接,如果有JS的内容说明引进来了。
B.MessagePush.js的MessagePush一定要和类MessagePush的名称一样。这三个JS 都是自动生成的不要去下载。
10.最后是在页面上写JS了。
<script>
//这个方法用来启动该页面的ReverseAjax功能
dwr.engine.setActiveReverseAjax(true);
//设置在页面关闭时,通知服务端销毁会话
dwr.engine.setNotifyServerOnPageUnload(true);
//指定用户
var user=jQuery("#dwrUserName").text();
MessagePush.onPageLoad(user);//这个方法是给scriptSession赋值的,用来控制指定给某某用户显示的。
var language=1;//这个是国家化用的。
//这个函数是提供给后台推送的时候 调用的
function show(data){
if(!data){//说明没有信息了,就不执行了。
return;
}
var msg=eval("("+data+")");//转换为json对象
var ary=(msg[0][language]);
msg="";
for(var i=0;i<ary.length;i++){
msg+="<dd id='popIntro'>"+dobylanguage(ary[i][1],ary[i][0])+"</dd>";
}
jQuery("#handle").html(msg);
soundManager.onclick();//这个是右下角弹框的时候,加的提示声音。
}
//注: show()方法是具体内容处理方式。不需要在意细节。
</script>
好了就到此为止了。
可能还需要log4j什么的,那就自己下把。