如何将数据放入会话变量并在vaadin中的不同页面中获取数据?

Kur*_*t X 7 cookies session response request vaadin

我想我应该使用应用程序范围会话来处理它.但我对此没有任何经验.我尝试了从互联网上获得的不同方式:

HttpServletRequest request;
HttpSession sess = request.getSession();
sess.setAttribute("name", name);

later in other page
HttpServletRequest request;
String=(String)request.getAttribute(name); 
//or HttpSession sess = request.getSession();
// sess.getAttribute(name);
Run Code Online (Sandbox Code Playgroud)

一切都行不通.我认为vaadin处理这个问题可能有些特别之处.请帮我.

Bas*_*que 14

两个范围的范围

请参阅此张贴有关Vaadin 7的范围级别由罗兰克鲁格VaadinSessionUI类.他包括与Vaadin 6的比较.好的文章,除了手动锁定的讨论已经过时了Vaadin 7.1(请参阅我对该页面的评论,并查看对类似问题的回答).

了解尽管Vaadin 6和Vaadin 7的大部分相似或相同,但在这个主题上,6和7完全不同,涉及不同的架构和不同的类.

请注意,我们正在讨论VaadinSession,而不是HTTP或Servlet会话.VaadinSession包装或包含Servlet会话,因此我们不必关心Servlet级别.

此VaadinSession表示单个用户的工作会话.用户打开一个或多个窗口/标签(UI实例).

该图显示了您的整个Vaadin应用程序如何与VaadinSession实例捆绑在一起,并且VaadinSession拥有一个或多个UI实例. 状态可以放在两个范围内(应用程序范围或一个浏览器窗口/选项卡).

上面的图表有点过分简化了.这是一个更详细的.

Servlet和Vaadin会话的类层次结构的详细图表

多个Windows

Vaadin 7支持在同一个Vaadin应用程序上打开多个浏览器窗口/标签.这是Vaadin 6对建筑的重大改变.

每个浏览器窗口/选项卡的内容是您的UI子类的实例.所有这些实例都属于同一个实例VaadinSession.如果用户单击浏览器窗口/选项卡上的重新加载功能,UI则会销毁该实例并实例化一个新实例.但是VaadinSession忍受了.添加@PreserveOnRefresh注释会更改该行为以保留相同的UI实例,但这不是重点.

关键是Vaadin 7有两个范围:

  • VaadinSession (你的整个应用程序)
  • UI (每个浏览器窗口/选项卡).

您可能希望在任一级别存储数据.例如,用户登录/身份验证信息应该包含在VaadinSession中.

把国家放在上面 UI

要在UI上存储数据,请将字段或集合添加到UI子类.简单而明显.

把国家放在上面 VaadinSession

要在VaadinSession上存储数据,请调用setAttributegetAttribute.你必须投射结果.简单,除了一个捕获:线程安全.

线程安全

您可以手动管理锁定以同时保护VaadinSession.但是,如果遵循记录的规则,Vaadin将为您提供线程安全保护.

主线程

如果从通常的主用户界面线程修改VaadinSession,没问题.你在主线程中在Vaadin中做的大多数事情都已经影响了VaadinSession对象.这就是你的应用程序所在的位置.因此,Vaadin已经自动提供了线程安全锁定.

其他主题

如果从另一个线程使用VaadinSession,请在Runnable中调用您传递给accessUI或VaadinSession对象上的方法.如果除了会话之外还影响任何用户界面布局或窗口小部件,请access在UI方法上调用该方法.如果仅影响会话而不影响用户界面,请access在VaadinSession上传递Runnable 方法.

第三级范围:应用程序范围

仅供参考,您可以使用更广泛的范围.如果您有"全局"数据或对象在所有用户的会话中共享应用程序范围,则可以访问该ServletContext对象."上下文"表示您的Web应用程序的世界,即您的Web应用程序可以访问的内容.您的Vaadin应用程序有一个ServletContext由Servlet容器自动实例化的对象.调用这对方法,getAttribute然后setAttribute存储Object你拥有的任何方法.

有关更多信息,请参阅我的问题和答案,如何ServletContext从Vaadin 7应用程序中访问?.

总结一下文本(和下图):一个Servlet容器,如Tomcat或Jetty,可以运行一个或多个Vaadin Web应用程序.每个Web应用程序都有一个ServletContext由容器自动管理的对象,其中get/setAttribute方法可以存储您选择的任何对象.每个Vaadin Web应用程序都VaadinSession为每个用户的当前工作会话提供一个对象.每个VaadinSession对象包含一个或多UI个子类实例,表示在Web浏览器的窗口/选项卡(或Portlet视图区域)中看到的内容.每个UI子类实例都可以包含任意数量的成员变量,就像任何POJO一样.

带有一个或多个Vaadin应用程序的Servlet容器图,每个应用程序都有一个ServletContext实例


提示:如果需要,您的Runnable可以在Java 8中使用新的更短的Lambda语法.NetBeans 8甚至会建议这样做.


emr*_*mre 1

您可以使用 ThreadLocal 变量来保存数据。然后,您从变量中获取数据并清理它。不要忘记将变量设为公共和静态,以便从另一个类访问它。