直到在什么时间点不JSF UI保存组件的状态在服务器端和什么时候被删除的UI组件的状态信息从服务器内存?当应用程序中的登录用户浏览页面时,组件的状态是否会继续在服务器上累积?
我不明白在服务器上保持UI组件状态有什么好处?是不是直接将经过验证/转换的数据传递给托管bean?我可以或者应该尽量避免它吗?
如果有数千个并发用户会话,那么在服务器端是否会消耗太多内存?我有一个应用程序,用户可以在某些主题上发布博客.这个博客的规模非常大.当有回复或请求查看博客时,这些大页面数据是否会被保存为组件状态的一部分? 这会耗费太多记忆.这不是一个问题吗?
现在,在使用JSF时不再需要保存状态.可以使用高性能无状态JSF实现.有关详细信息和讨论,请参阅此博客和此问题.此外,JSF规范中还包含一个未解决的问题,即为JSF提供无状态模式的选项.(PS考虑的问题投票这个和这个,如果这对你是一个非常有用的功能.)
一个好消息,Mojarra 2.1.19是无状态模式!
看这里:
http://weblogs.java.net/blog/mriem/archive/2013/02/08/jsf-going-stateless?force=255
托管bean状态和组件树状态之间似乎存在差异.您可以使用@RequestScoped和@SessionScoped等注释来控制托管bean状态,但似乎您无法选择是否保存组件树状态(尽管您可以选择是否保存在服务器或客户端上) ).
似乎只有在单个请求的持续时间内才需要组件树状态作为临时数据结构来帮助处理请求.它应该从头开始为每个请求重建.使用JSF 2.0,部分状态保存使情况更好,因为只保存表单数据,但我不明白为什么甚至从前一个请求中形成数据是有用的.
如果您的应用程序仅使用请求范围托管bean,那么在请求之间保存组件树状态尤其没有意义.即使您的应用程序具有会话范围托管bean,我也会假设托管bean将保持状态,组件树仍然不需要在请求之间具有任何状态.
我正在评估在高流量网站上使用JSF的可能性.我被告知在JSF 2.0中,组件树不存储在会话中,并且只有在修改组件树时才存储增量.
这是我正在查看的页面:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<body>
<h:form>
hello, world
</h:form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
每次查看此页面时,都会为会话分配近1K.如果我删除<form>标记,则会话中不会存储任何内容.
知道组件树存储在会话中的原因吗?我认为这将在回发请求上计算.
我有一个JSF 2.1.21应用程序与客户端状态保存方法.我也使用PrimeFaces 3.5 + Tomcat 7.0.37.
我使用OmniFaces完整的ajax异常处理程序来显示自定义错误页面,并在出现问题时通过堆栈跟踪向我发送电子邮件.
每天我都会收到至少一封带有java.lang.IndexOutOfBoundsException的电子邮件.它似乎与重新部署应用程序有关,但我无法重现它.
这是堆栈跟踪:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165)
at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1566)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy$2.visit(FaceletPartialStateManagementStrategy.java:380)
at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1612)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreView(FaceletPartialStateManagementStrategy.java:367)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:138)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:569)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:141)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:301)
at org.omnifaces.viewhandler.RestorableViewHandler.restoreView(RestorableViewHandler.java:59)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:192)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at br.com.spdata.tecnico.filter.MobileFilter.doFilter(MobileFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) …Run Code Online (Sandbox Code Playgroud) 在我发现的关于加密ViewState的所有参考页面中,对密码的唯一评论是"您的密码在这里".
是否有关于我们应该使用的密码长度/复杂性的建议?
我需要编写一个程序,在可能的状态的大空间中执行并行搜索,在此过程中发现新区域(并开始探索),并且在其他地方获得的中间结果的早期终止的某些区域的探索消除了可能性在其中发现新的有用结果.使用彼此密切协作运行的多个线程来执行搜索,以避免重新计算中间数据.
在整个过程中必须维护和更新复杂的内部状态(包括它们使用的多个线程和状态同步原语的调用堆栈),并且没有明显的方法将计算分成可以顺序执行的隔离块,每个节省并将一个小的中间结果传递给下一个.此外,没有办法将计算分成不相互通信的独立并行线程,而不会由于重新计算大量中间数据而产生过高的开销.
由于搜索域较大,该程序可能会在产生最终结果之前运行数月.因此,在程序执行期间存在电源,硬件或操作系统故障的重大风险,这可能导致完成当前已完成的所有工作的丢失.在这种情况下,程序将需要从头开始重新启动所有计算.
我需要一种能够防止在这种情况下完全丢失数据的解决方案.我想到了一个执行引擎/平台,它可以将进程的当前状态持续保存到像冗余磁盘阵列或数据库这样的防故障存储中.但是我理解这种方法可以显着减慢过程,甚至可以达到与预期的计算时间相比没有任何好处的程度,包括由于可能的故障导致的重启.
事实上,我不需要一个能够持续保存程序状态的理想解决方案,而且我可以轻松承担数小时甚至数天的工作损失.我想到的一个可能的重量级解决方案是在虚拟机内运行程序,不时保存其快照,并在最近的快照可能发生主机故障后恢复计算机.此方法还可以帮助在随机或可预防的客户操作系统故障后恢复程序状态.
是否有类似但更轻量级的解决方案仅限于保留单个进程的状态?或者你能建议任何其他可以解决我问题的方法吗?
我正在创建一个复合组件,它将包装数据表以实现非常简单的分页.我需要在ajax请求之间保存状态(当前页码).
我尝试在FacesComponent中创建字段,但我发现它们在JSF生命周期中被删除了:
@FacesComponent(value = "bfTableComponent")
public class BFTableComponent extends UIComponentBase implements NamingContainer {
private int currentPageNumber;
...
Run Code Online (Sandbox Code Playgroud)
我似乎无法在任何地方找到这样做的简明指南!在创建复合组件时,如何在请求之间保存状态?
是否有任何状态保存方法允许JSF应用程序在服务器上初始保存状态数据但在会话到期时间间隔后,该状态将转移到客户端,以便即使在服务器和内存上的会话超时更好之后,应用程序也始终响应在服务器上管理?
或者任何可以实现的方式?但我希望这应该是JSF规范的一部分!
在BalusC提出建议之后,我对Stateless JSF原则及其当前的实现印象深刻.如果此处的其他任何人也对将无状态JSF添加到JSF规范感兴趣,请考虑查看或投票此问题.
无状态JSF为某些支付提供了巨大的性能提升,例如无法动态创建视图(例如通过绑定,JSTL标记等)或修改它.
无状态JSF操作模式对于高负载应用程序和体系结构非常有用:
雅各布此前曾提出过这一点:http: //weblogs.java.net/blog/jhook/archive/2006/01/experiment_goin.html
这将有助于JSF放弃"慢速和记忆力"的耻辱,并帮助跟上当前的技术趋势(无状态架构).
我有一个带有表的jsp和两个按钮"home"和"back",并在其中导入了jquery.datatable.js.
单击"主页"时,页面应加载,不保存任何分页或过滤器.并且在单击"返回"时,表格应该保存所有过滤器和分页.
我在初始化数据表时尝试将"bStateSave"标志设置为true.这总是使用过滤器和分页加载表.
有没有什么办法可以点击"返回"按钮加载具有保存状态的表格,点击"主页"按钮时可以加载原始状态
我按照本教程完成了测试应用程序
我尝试在不使用Storyboard的情况下做同样的事情,但这不起作用.我在AppDelegate中启用了状态保存和恢复.我已经为我的所有控制器及其视图分配了restorationIdentifier.我想我必须在AppDelegate中实现一些额外的代码来恢复rootviewcontroller,但我找不到正确的方法来做到这一点.
-(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
return YES;
}
-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
UIViewController *viewController1 = [[[StateTestFirstViewController alloc] initWithNibName:@"StateTestFirstViewController" bundle:nil] autorelease];
UIViewController *viewController2 = [[[StateTestSecondViewController alloc] initWithNibName:@"StateTestSecondViewController" bundle:nil] autorelease];
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.restorationIdentifier = @"TabBarController";
self.tabBarController.viewControllers = @[viewController1, viewController2];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Glassfish 3.2.2和JSF 2.1.11
我正在尝试创建一个复合组件,它将字符串和最大字符数作为参数,然后只显示最大字符数,但它旁边会有一个"更多"链接,单击时会显示将文本扩展为完整长度,然后在其旁边显示"less"链接,将其恢复为最大字符数.
我看到一些奇怪的行为,所以我想知道我做错了什么.
这是我的复合组件定义:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:p="http://primefaces.org/ui">
<composite:interface componentType="expandableTextComponent">
<composite:attribute name="name" required="true"/>
<composite:attribute name="maxCharacters" required="true"/>
<composite:attribute name="value" required="true"/>
</composite:interface>
<composite:implementation>
<h:panelGroup id="#{cc.attrs.name}">
<h:outputText value="#{fn:substring(cc.attrs.value, 0, cc.attrs.maxCharacters)}" rendered="#{fn:length(cc.attrs.value) le cc.attrs.maxCharacters}"/>
<h:outputText value="#{fn:substring(cc.attrs.value, 0, cc.attrs.maxCharacters)}" rendered="#{fn:length(cc.attrs.value) gt cc.attrs.maxCharacters and !cc.expanded}" style="margin-right: 5px;"/>
<h:outputText value="#{cc.attrs.value}" rendered="#{fn:length(cc.attrs.value) gt cc.attrs.maxCharacters and cc.expanded}" style="margin-right: 5px;"/>
<p:commandLink actionListener="#{cc.toggleExpanded()}" rendered="#{fn:length(cc.attrs.value) gt cc.attrs.maxCharacters}" update="#{cc.attrs.name}">
<h:outputText value="#{__commonButton.more}..." rendered="#{!cc.expanded}"/>
<h:outputText value="#{__commonButton.less}" rendered="#{cc.expanded}"/>
</p:commandLink>
</h:panelGroup>
</composite:implementation>
</html>
Run Code Online (Sandbox Code Playgroud)
这是Java组件:
@FacesComponent("expandableTextComponent")
public class ExpandableTextComponent extends UINamingContainer
{
boolean expanded; …Run Code Online (Sandbox Code Playgroud) state-saving ×11
jsf-2 ×6
jsf ×4
java ×3
java-ee ×2
client-side ×1
ios6 ×1
javascript ×1
mojarra ×1
pagination ×1
passwords ×1
recovery ×1
resume ×1
storyboard ×1
tomcat7 ×1
xib ×1