在本文中,我们将为您详细介绍DWR2.0引用ScriptSession的一些介绍的相关知识,并且为您解答关于dw如何引用js的疑问,此外,我们还会提供一些关于OpenSession和getCurren
在本文中,我们将为您详细介绍DWR2.0 引用 ScriptSession的一些介绍的相关知识,并且为您解答关于dw如何引用js的疑问,此外,我们还会提供一些关于
- DWR2.0 引用 ScriptSession的一些介绍(dw如何引用js)
OpenSession 和getCurrentSession 的一些区别 - bootstrap description dt wrap issue
- c# – JavaScript – 如何在Javascript中将值设置为Session
- Cas srpingsecurity 在setSession,容易session getSession取值的时候没有值
DWR2.0 引用 ScriptSession的一些介绍(dw如何引用js)
1 关于ScriptSession
ScriptSession不会与HttpSession同时创建
当我们访问一个页面的时候,如果是第一次访问,就会创建一个新的HttpSession,之后再访问的时候,就会保持当前的Session,即使是刷新,也能保持当前的HttpSession。
但是,ScriptSession不同,第一次访问,会创建一个ScriptSession,但是,如果你刷新,就会创建一个新的ScriptSession.
2 如何得到ScriptSession
在DWR中,我们可以通过WebContextFactory.get()来取得一个WebContext对象,进而通过WebContext的getScriptSession()取得ScriptSession对象。
但是要注意,在我们自定义的Servlet中,我们也可以通过WebContextFactory.get()来取得一个WebContext,但是这种方法却不能取得ScriptSession对象。因为,此WebContext对象其实不是通过DWR的上下文环境得到的,所以,就根本没有创建ScriptSession对象。
假设这种方式也能得到ScriptSession的话,那么我们实现“推”也就可以不局限在DWR的上下文环境中了,那么其灵活性就会大很多了。
所以,这就是我们不能在Servlet中实现推的原因。
3 关于刷新就创建一个新的ScriptSession问题
当你刷新的时候,同样的一个HttpSession,却会创建一个新的ScriptSession,然后绑定到对应的URI上。
4 向所有的页面访问者推送
当我们想向所有的页面访问者推送的时候,我们只需要,取得所有的页面访问者,就可以“推”了。
如何取得所有的页面访问者?可以通过
//
来取得/SynMap/map/map.jsp的所有访问的ScriptSession
如何推送,
Util util = new Util(pages);
util.addFunctionCall("syningMap",new Double(x),new Double(y),new Integer(zoom));
通过此方法,就可以实现调用客户端的javascript函数,实现对客户端的操作。
5 在上面的推送中产生的问题
上面的方法已经可以实现向所有的访问者推送。但是问题是,在客户端,如果用户刷新一次或多次,那么,Collection里面可能就保存了很多的无用的ScriptSession,所以不仅仅会影响性能问题,更重要的是,可能就不能实现你想要的功能。
比如,你想取得当前再现的有效用户,那么你就需要知道那些ScriptSession是有效的。
6 如何管理有效的ScriptSession
由于上面的问题,我们就需要自己管理ScriptSession.其实,有效地HttpSession,就是那个和当前的HttpSession匹配的ScriptSession.
所以,我们就可以自己维护一个Map,在这个Map里面,我们定义key就是HttpSession的Id,其值就是ScriptSession对象。
在每一次页面载入的时候,都去注册此ScriptSession,那么就会把新的ScriptSession绑定到httpSession上面了。
// session and scriptSession map
Map sm = g.getSessions();
// hs is HttpSession
// ss is ScriptSession object
sm.put(hs.getId(),ss);
7 如何实现有效推送
通过上面的Map取得所有的有效ScriptSession集合
Collection pages = g.getSessions().values();
然后再推送,就可以了。
8 上面问题的新的解决方案 上面的技术问题和解决方案都是在DWR2.0的环境下遇到的。 昨天看了一下,即将正式发布的DWR3.0的文档,里面对AJAX Reverse技术增加了不少功能。 其中新加了一个象HttpSessionListener的东西,叫ScriptSessionListener 所以,我想,可以通过这个Listener实现上面的功能,也就是说,在监听到一个ScriptSession创建的时候,我们就直接判断,并把此ScriptSession绑定到httpSession上,就可以了。同样用上面的那个map来管理就可以了。 这个是我的思路,我还没有实践,如果你需要的话,可以自己去试一下。
OpenSession 和getCurrentSession 的一些区别
转载自:http://blog.csdn.net/fishrui/article/details/5285488
测试1:openSession在不开启事务的情况下执行操作
Session session= SessionFactoryUtil.openSession();
(1):session.get(UserInfo.class,14L); //执行成功,得到数据
(2):session.delete(new UserInfo(16L)); //执行成功 但数据库数据不变(符合逻辑)
session.close();
追溯了下源码发现:
在不开启事务的情况下,session得到数据库连接是在执行查询语句的时候从连接池中获得。
private PreparedStatement getPreparedStatement(
final Connection conn,
String sql,
boolean scrollable,
final boolean useGetGeneratedKeys,
final String[] namedGeneratedKeys,
final ScrollMode scrollMode,
final boolean callable) ;在调用这个方法时传入了从连接池中拿到的连接。
在执行完数据操作后调用
afterOperation(boolean success);
发现是非事务型的session直接调用
connectionManager.aggressiveRelease();
释放连接。
测试2:getCurrentSession()在不开启事务的情况下执行操作
Session session= SessionFactoryUtil.getCurrentSession();
(1):session.get(UserInfo.class,14L); //抛出异常get is not valid without active transaction
(2):session.delete(new UserInfo(16L));// 抛出异常get is not valid without active transaction
//session.close(); //线程绑定session会自动关闭
说明: 线程绑定session必须开启事务,此时的session已经加载了拦截器,在执行数据操作时必须在活动的事务范围中。
测试3:openSession在开启事务的情况下执行操作
Session session= SessionFactoryUtil.openSession();
session.getTransaction().begin();
(1):session.get(UserInfo.class,14L); //执行成功,得到数据
(2):session.delete(new UserInfo(16L)); //执行成功
session.getTransaction().commit();
session.close(); //如若配置hibernate.transaction.auto_close_session=true可省去
分析:
(a):session.getTransaction().begin()-->Transaction result = getTransaction()
-->result.begin()-->jdbcContext.connection()
{
if ( owner.isClosed() ) {
throw new SessionException( "Session is closed" );
}
return connectionManager.getConnection();
}
见到connectionManager有点熟悉了吧,这就是管理数据库连接的连接池.
(b):session.getTransaction().commit()-->connectionManager.aggressiveRelease() 释放连接。
此时的数据库连接是在准备开启事务的时获得,事务提交的时候释放连接。
测试4:getCurrentSession()在开启事务的情况下执行操作
Session session= SessionFactoryUtil.getCurrentSession();
session.getTransaction().begin();
(1):session.get(UserInfo.class,14L); //执行成功
(2):session.delete(new UserInfo(16L)); //执行成功
session.getTransaction().commit();
说明: 线程绑定session已经加载了拦截器,提交的时候释放连接关闭session。
总结:
(1)openSession()得到得session可以在显式开启事务的环境中使用,也可以在不开启事务的环境中使用(进行查询);getCurrentSession()必须在显式开启事务环境中使用。
(2)openSession()是否显式开启事务决定了session得到连接的时机不同。不开启事务的情况下数据库连接是在创建Statement时获得。因此在配置二级缓存的情况get()对象时,如果二级缓存中有需要的对象时,不会占用数据库连接。相反开启事务的情况下,无论二级缓存中是否有对象,多会占用数据库连接。
(3)getCurrentSession()总会占用数据库连接。
bootstrap description dt wrap issue
总结
以上是小编为你收集整理的bootstrap description dt wrap issue全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
c# – JavaScript – 如何在Javascript中将值设置为Session
<%session["Test"] = "Welcome Mamu";%> var session_value='<%=Session["Test"]%>'; alert(session_value);
以上工作很好.请注意,我已分配静态值(欢迎Mamu).但对于Dynamatic,
var strTest=document.getElementById('DropDownList1').value; <%session["Test"] = "'+ strTest +'";%>
它在客户端工作正常.但是我的服务器端(Code Behind),Session [“Test”]值是’strTest’.
是否有任何其他方式为Session分配值?
解决方法@H_301_23@
无法通过javascript直接分配会话值.
我找到了其他方法.调用函数后面的代码并分配会话值.
Javascript功能:
function InitializeRequest(path)
{
// call server side method
PageMethods.SetDownloadpath(path);
}
[System.Web.Services.WebMethod]
public static string SetDownloadpath(string strpath)
{
Page objp = new Page();
objp.Session["strDwnPath"] = strpath;
return strpath;
}
必须启用页面方法设置为true
< asp:ScriptManager EnablePageMethods =“true”ID =“MainSM”runat =“server”ScriptMode =“Release”LoadScriptsBeforeUI =“true”>< / asp:ScriptManager>
我找到了其他方法.调用函数后面的代码并分配会话值.
Javascript功能:
function InitializeRequest(path) { // call server side method PageMethods.SetDownloadpath(path); } [System.Web.Services.WebMethod] public static string SetDownloadpath(string strpath) { Page objp = new Page(); objp.Session["strDwnPath"] = strpath; return strpath; }
必须启用页面方法设置为true
< asp:ScriptManager EnablePageMethods =“true”ID =“MainSM”runat =“server”ScriptMode =“Release”LoadScriptsBeforeUI =“true”>< / asp:ScriptManager>
Cas srpingsecurity 在setSession,容易session getSession取值的时候没有值
Cas srpingsecurity 在setSession之后,容易session getSession取值的时候没有值。 spring security有什么地方会销毁session中的数据吗?看了一下,注销成功的时候有一个使session失效,但是使用的时候基本上没有点注销,web容器的web.xml setTimeout为3600 分钟! 就不知道web容器设置全局session过期时间,局部web.xml设置,与程序中设置session最大过期时间那个优先
今天关于DWR2.0 引用 ScriptSession的一些介绍和dw如何引用js的分享就到这里,希望大家有所收获,若想了解更多关于
本文标签: