我有一个JSF页面(使用MyFaces 2.0),它在第一次显示时会收集一些数据.如果找不到某些信息,则应该提供该效果的消息并重定向回另一个页面.我已经尝试使用此处找到的解决方案保存FacesMessage重定向到JSF中的<h:message>(setKeepMessages(true)),但重定向后没有显示消息.我可以选择的唯一区别是我没有使用导航规则,我在外部上下文上调用redirect()调用,因为这不是在正常操作中发生的.
相关代码:
public void redirectToPageWithMessage(String inPage, String message, FacesMessage.Severity severity){
getFlash().setKeepMessages(true);
addMessage(message, severity);
try {
getFacesContext().getExternalContext().redirect(inPage);
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不起作用.重定向发生得很好,但<messages />标签没有显示消息.redirect()发生的方式有什么不同可以防止这种情况发生吗?
我在启动JSF Web应用程序时遇到以下异常:
SEVERE: Error configuring application listener of class org.apache.myfaces.webapp.StartupServletContextListener
java.lang.ClassNotFoundException: org.apache.myfaces.webapp.StartupServletContextListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3786)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Run Code Online (Sandbox Code Playgroud)
这是我的web.xml档案
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
<display-name>J2S</display-name>
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
<context-param> …Run Code Online (Sandbox Code Playgroud) 我们正在将JSF 1.1(MyFaces)项目迁移到JSF 2.我们的想法是通过将JSP和XHTML保持在一起一段时间来定期迁移.我们在JSP页面中使用了许多ajax4jsf-1.1.1标记.我们不使用RichFaces.将系统配置为JSF 2(Balusc教程中提到的所有配置更改)当尝试在类路径中使用ajax4jsf.jar访问JSP页面时,我们得到一个异常:
Caused by: java.lang.IllegalStateException: setViewHandler may not be executed after a lifecycle request has been completed
at org.apache.myfaces.application.ApplicationImpl.setViewHandler(ApplicationImpl.java:853)
at org.ajax4jsf.framework.ajax.InitPhaseListener.beforePhase(InitPhaseListener.java:92)
at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersBefore(PhaseListenerManager.java:76)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:131)
Run Code Online (Sandbox Code Playgroud)
它看起来ajax4jsf.jar与JSF 2不兼容.看起来LifeCycle配置存在一些问题.
有没有什么办法可以让a4j与JSF 2 JSP一起工作?我知道当我们使用XHTML时,我们不需要这一切.
假设我resources/在webroot中有一个文件夹。在其中,我有一个css/文件夹,在其中有一个theme.css文件。
但是我想设置一个Expires:标题。因此,我想对资源库使用一个版本,例如
<h:outputStylesheet library="css" name="theme.css"/>
Run Code Online (Sandbox Code Playgroud)
会变成
<link rel="stylesheet" src="javax.faces.resources/theme.css.xhtml?ln=css"/>
Run Code Online (Sandbox Code Playgroud)
但我想指定类似
<h:outputStylesheet library="css" name="theme.css" version="1.2"/>
Run Code Online (Sandbox Code Playgroud)
并得到
<link rel="stylesheet" src="javax.faces.resources/theme.css.xhtml?ln=css&v=1_2"/>
Run Code Online (Sandbox Code Playgroud)
或类似。我已经了解到JSF2支持资源版本控制,但是如何指定要加载的版本以及将文件放在何处?
我最近遇到了由Rudi开发的JSF(Mojarra)的无状态扩展,声称以更低的内存/ CPU成本和减少的延迟提供了大量的性能改进,具有0个内存开销以节省状态并且还告别陈旧的视图(回发将始终有效).这一切看起来都令人印象深刻!
我是一个天真的JSF开发人员,参与使用JSF进行高性能互联网应用的项目.我想知道在迁移到JSF中的无状态页面之前我应该担心什么问题.我已经使用这个无状态项目测试了我的应用程序(大多数事情除了一些之外无缝地工作)但我想知道在迁移之前我应该考虑的事情.
我知道已经有人建议在官方JSF规范中包含无状态模式功能,但我不确定需要多长时间才会发生,直到这个JSF扩展对我来说有很大帮助.
还有,那里有没有,在生产环境中也使用无状态JSF项目?
-
更新: 对于那些使用Myfaces的人来说,无状态扩展已由Thomas Andraschko重新实现,并且已被提议添加到Myfaces核心项目中.
使用JSF 2.1.3与无状态扩展和Primefaces 3.4快照.
我正在使用MyFaces 2.1.9和PrimeFaces 3.5.我为它实现了一个自定义渲染器<p:inputText>.这在Tomcat的家中运行良好.但这与使用Websphere不起作用.我在自定义渲染器类中放置了断点,但它们从未被击中.我的日志中也没有看到任何内容.但是,当我在标准JSF上注册完全相同的自定义渲染器时<h:inputText>,它工作正常.
我把它注册如下faces-config.xml:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.InputTextRenderer</renderer-type>
<renderer-class>xxx.xxx.xxx.MyInputRenderer</renderer-class>
</renderer>
</render-kit>
Run Code Online (Sandbox Code Playgroud)
如何解决自定义渲染器的注册问题?
我正在尝试在Websphere 8.5.5上部署应用程序我已经为Websphere创建了一个共享库,其中包括myfaces 2.2 jar和其他依赖项,如commons-collections.
我还将我的应用程序的类加载器作为PARENT_LAST.
部署应用程序时,我得到以下异常:
An error occured while initializing MyFaces: Class com.ibm.ws.jsf.config.annotation.WASMyFacesAnnotationProvider is no org.apache.myfaces.spi.AnnotationProvider
java.lang.IllegalArgumentException: Class com.ibm.ws.jsf.config.annotation.WASMyFacesAnnotationProvider is no org.apache.myfaces.spi.AnnotationProvider
at org.apache.myfaces.shared.util.ClassUtils.buildApplicationObject(ClassUtils.java:557)
at org.apache.myfaces.shared.util.ClassUtils.buildApplicationObject(ClassUtils.java:524)
Run Code Online (Sandbox Code Playgroud) 我正在使用*myfaces-api-2.2.3并将javax.faces.STATE_SAVING_METHOD设置为client,
我有以下场景,
1)用户X登录系统并添加用户XXX(使用jsf f:ajax操作),同时检查chrome dev工具,您可以看到与ViewState值一起提交的表单.
2)复制ViewState值(来自chrome dev工具 - >网络选项卡) - >将其放入带有表单的html文件中(模仿我原来的添加用户X)
3)从用户X会话注销(会话在该过程中失效)
4)用户Y登录 - > 在浏览器中打开该 html文件并点击表单的提交按钮 - >你会注意到添加了用户XXX(尽管表格中使用的ViewState值属于其他用户(用户X).
我认为ViewState的价值不能以这种方式被使用,我认为应该阻止这种行为,怎么就可以使用一个的ViewState在拥有自己的一个全新的会话值ViewState的价值,以及如何能我确保用户不能重用ViewState?
请参阅我的另一个问题和BalusC的回答:在客户端状态保存的情况下防止JSF2中的CSRF
我使用JSF poll标签在JSP中重新加载数据表.页脚中还有另一个JSP.它有一个按钮,用新数据重新加载页面.
问题是;
当我单击页脚上的按钮时,它会更改轮询间隔的频率.
贝娄是代码样本;
main.jsp中
<et:partialTriggerGroup id="statusUpdatePoller">
<tr:poll interval="10000" id="statusUpdatePoller" pollListener="#{ServerSideClass.statusUpdate}"/>
<m:dataTable>
...
</m:dataTable>
</et:partialTriggerGroup>
Run Code Online (Sandbox Code Playgroud)
footer.jsp中
<et:partialTriggerGroup id="pageControlTrigger">
...
<tr:commandLink action="#{ServerSideClass.statusUpdate}" partialSubmit="true" />
</et:partialTriggerGroup>
Run Code Online (Sandbox Code Playgroud)
这个实现有什么问题吗?
TIA.
我正在使用Apache MyFaces 2.0.我注意到oam.Flash.RENDERMAP.TOKEN为每个视图创建了一个cookie ,即使我没有使用Flash范围而且我已经设置了org.apache.myfaces.DISABLE_FLASH_SCOPE=true.
我该如何删除oam.Flash.RENDERMAP.TOKENcookie?这是WebSphere特定的问题