DWR 中的push技术

在容器里的类都是单态的,如Servlet容器,只被实例化一次。


HttpSession-ID->作用于客户端、服务器请求之间?

ScriptSession-ID->用户访问了哪些页面?



以下是具体代码演示:

login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <s:form action="lgManager!login">
    	<s:textfield name="usName"></s:textfield>
    	<s:submit></s:submit>
    </s:form>
  </body>
</html>

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="TestManager" extends="struts-default">
		<action name="lgManager" class="com.zuxia.yc42.action.LoginAction">
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>    


com.zuxia.yc42.action

public class LoginAction extends ActionSupport:

package com.zuxia.yc42.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
	public String usName;
	
	public String login()
	{
		Map<String,Object> session = ActionContext.getContext().getSession();
		
		session.put("user", usName);
		
		return SUCCESS;
	}
	public String getUsName() {
		return usName;
	}
	public void setUsName(String usName) {
		this.usName = usName;
	}
	
	
}


index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	
	
	
	
	
	
	
	
	
	<script type="text/javascript" src="<%=path%>/dwr/engine.js"></script>
	<script type="text/javascript" src="<%=path%>/dwr/util.js"></script>
	<!-- dwrDemo.js来自dwr.xml配置文件中指向的java类 -->
	<script type="text/javascript" src="<%=path%>/dwr/interface/dwrDemo.js"></script>
	<script type="text/javascript">
		window.οnlοad=function()
		{
			dwr.engine.setActiveReverseAjax(true);
			dwrDemo.showUsers();
		};
		
		function showUsers(data)
		{
			dwr.util.removeAllOptions("usNames");
			dwr.util.addOptions("usNames",data);
		}
	</script>
  </head>
  
  <body>
    <s:select list="#{'':'--清选择--' }" id="usNames" name="usNames"></s:select>
  </body>
</html>

WebRoot/WEB-INF/dwr.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
 <dwr> 
	 <allow> 
	 	<create creator="new" javascript="dwrDemo"> 
		 	<param name="class" value="com.zuxia.yc42.dwr.DwrDemo" /> 
		 </create>
		<convert converter="bean" match="java.lang.StackTraceElement" />
	 </allow> 
 </dwr>


WebRoot/WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>	
  
  <!-- Session监听器 -->
  <listener>
  	<listener-class>com.zuxia.yc42.listener.JsSessionListener</listener-class>
  </listener>



  <!-- DWR配置 -->
  <servlet>
  	<servlet-name>dwr-invoker</servlet-name>
	<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  	<!-- 调试模式 -->
	<init-param>
		<param-name>debug</param-name>
		<param-value>true</param-value>
	</init-param>
  	<!-- 设置是否允许使用dwr推送技术 -->
    <init-param>
  		<param-name>activeReverseAjaxEnabled</param-name>
 		 <param-value>true</param-value>
	 </init-param>
	 <init-param>  
      <param-name>maxWaitAfterWrite</param-name>  
      <param-value>-1</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>
  
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>
  		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping></web-app>


com.zuxia.yc42.dwr

public class DwrDemo :

package com.zuxia.yc42.dwr;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;

import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContextFactory;

public class DwrDemo 
{
	public void showUsers()
	{
		Browser.withCurrentPage(new Runnable() {
			
			@Override
			public void run() {
				//得到上下文对象
				ServletContext context = ServerContextFactory.get().getServletContext();
				Map<String,ScriptSession> map=(Map<String,ScriptSession>) context.getAttribute("ScriptSessionMap");
				
				Collection<ScriptSession> ss = map.values();
				Map<Integer,String> users = new HashMap<Integer,String>();
				
				int key=0;
				for(ScriptSession session :ss)
				{
					users.put(key++, session.getAttribute("user").toString());
				}
				
				for(ScriptSession session :ss)
				{
					ScriptBuffer buffer = new ScriptBuffer();
					buffer.appendScript("showUsers(");
					buffer.appendData(users);
					buffer.appendScript(");");
					session.addScript(buffer);
				}
				
			}
		});
		
	}

}



com.zuxia.yc42.listener


public class JsSessionListener implements HttpSessionListener:

package com.zuxia.yc42.listener;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.directwebremoting.Container;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;
import org.directwebremoting.extend.ScriptSessionManager;

public class JsSessionListener implements HttpSessionListener {

	@Override
	public void sessionCreated(HttpSessionEvent event) 
	{
		//得到容器Container container
		Container container = ServerContextFactory.get().getContainer();
		//如果容器里有ScriptSessionManager对象,则赋值创建ScriptSessionManager 实例化对象
		ScriptSessionManager ssManager = (ScriptSessionManager)container.getBean(ScriptSessionManager.class);
		//添加一个监听
		ssManager.addScriptSessionListener(new ScriptSessionListener() {
			
			@Override
			public void sessionDestroyed(ScriptSessionEvent event) 
			{
				System.out.println("有ScriptSession被销毁了");
				
				
			}
			
			@Override
			public void sessionCreated(ScriptSessionEvent event) {
				//得到上下文对象ServletContext context
				ServletContext context = ServerContextFactory.get().getServletContext();
				Object obj = context.getAttribute("ScriptSessionMap");
				if(obj == null)
				{
					//如果是第一次登录,ScriptSessionMap是没有值得,那么就创建一个
					context.setAttribute("ScriptSessionMap", new HashMap<String,ScriptSession>());
				}
				
				Map<String,ScriptSession> map = (Map<String,ScriptSession>)context.getAttribute("ScriptSessionMap");
				//获取KEY
				HttpSession session = WebContextFactory.get().getSession();
				
				//得到HttpSession对象中的key值user
				Object user = session.getAttribute("user");
				
				//然后把HttpSession中的user添加ScriptSession中
				event.getSession().setAttribute("user", user);
				
				//把HttpSession中session的ID和ScriptSession以key-value形式添加到map集合中
				map.put(session.getId(), event.getSession());
				
				System.out.println("有ScriptSession被创建了");
			}
		});

	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub

	}

}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值