-
1. Re: With which version of JSF 2 are seam faces tested?
lincolnthree May 31, 2011 2:12 PM (in response to piklos)The Mojarra JSF implementation is extremely buggy. You can always try MyFaces.
-
2. Re: With which version of JSF 2 are seam faces tested?
piklos Jun 2, 2011 4:17 AM (in response to piklos)I tried with myfaces 2.0.6 and 2.1.0 and s:viewAction just doesn't work. I tried messing with it arround, but it never seeems to fire.
This is my template:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:rich="http://richfaces.org/rich" xmlns:s="http://jboss.org/seam/faces" xmlns:ui="http://java.sun.com/jsf/facelets"> <h:head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <h:outputStylesheet name="brand/default/style/netxpert.css" /> <h:outputStylesheet name="brand/default/style/navmenu.css" /> <link rel="shortcut icon" type="image/x-icon" href="../../resources/brand/default/images/icons/favicon.ico" /> <h:outputScript name="jsf.js" library="javax.faces" /> <h:outputScript name="jquery.js" /> </h:head> <f:metadata> <f:viewParam name="a" value="#{loginAction.a}"/> <s:viewAction action="#{loginAction.redirectIfLoggedIn('/pages/private/viewSystem.xhtml?faces-redirect=true')}" /> </f:metadata> <h:body styleClass="main "> <div style="width: 100%; height: 100%; overflow: hidden; position: absolute; z-index: 1"> <ui:insert name="header"> <ui:include src="header/header.xhtml" /> </ui:insert> <div id="maincontent"> <ui:insert name="maincontent"> <ui:insert name="navbar" /> <div id="navcontent"> <ui:insert name="navcontent" /> </div> </ui:insert> </div> </div> </h:body> </html>
this is my page:
<?xml version="1.0" encoding="UTF-8"?> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:s="http://jboss.org/seam/faces" template="/WEB-INF/templates/default.xhtml"> <ui:define name="navcontent"> <div id="page"> <span class="paragraphtitleshadow"> Please enter your username and password <span class="paragraphtitlefront">Please enter your username and password</span> </span> <br /> <h:form> <h:panelGrid columns="2" styleClass="reports_table container-login-controls"> <h:outputText value="Username:" /> <h:inputText value="#{credentials.username}" /> <h:outputText value="Password:" /> <h:inputSecret value="#{credentials.password}" /> </h:panelGrid> <h:commandButton styleClass="btnenabled" action="#{loginAction.login('/pages/private/viewSystem.xhtml?faces-redirect=true')}" value="Login" /> </h:form> </div> </ui:define> </ui:composition>
I must add that
<s:validateForm />
works.
-
3. Re: With which version of JSF 2 are seam faces tested?
bleathem Jun 2, 2011 9:24 AM (in response to piklos)The specification requires that the f:metadata tag:
must be a child of the <f:view>. This tag must reside within the top level XHTML file for the given viewId, not in a templateSo try moving the f:metadata tag into the page itself, rather than having it in your template.
Note: you can put the <s:viewAction> in a separate file and use a <ui:include> tag to include it the page's <f:metadata> tag
-
4. Re: With which version of JSF 2 are seam faces tested?
piklos Jun 2, 2011 10:20 AM (in response to piklos)Thanks that seemed to be the problem. i must add that i tried messing arround with it for hours, but i haven't succeded in finding out what's wrong.
This post on myfaces mail list confused me even more:
This actually is a very common mistake people make with JSF 2. The
problem is the following:
As you correctly pointed out, f:metadata needs to be a direct child of
f:view. However, with facelets f:view is handled very differently then
with JSP. In JSP you need f:view as the root tag for every other JSF
tag, but in facelets the UIViewRoot is always the xml root tag (the
most outer tag with the xmlns attributes). Thus in JSF 2 when using
facelets, UIViewRoot is most certainly created by the following code:<html xmlns="http://www.w3.org/1999/xhtml"; xmlns:ui="http://java.sun.com/jsf/facelets"; xmlns:h="http://java.sun.com/jsf/html"; xmlns:f="http://java.sun.com/jsf/core";>
This means that you have to place f:metadata as a direct child of the
above root element, for example:<html xmlns="http://www.w3.org/1999/xhtml"; xmlns:ui="http://java.sun.com/jsf/facelets"; xmlns:h="http://java.sun.com/jsf/html"; xmlns:f="http://java.sun.com/jsf/core";> <f:metadata>....</f:metadata> </html>
This will make it work ;)
Also, as an explanation why there still is a f:view tag for facelets
also: Since you need some kind of way to set the attributes of f:view
(like e.g. locale), you still need the f:view tag. However, it does
not create an additional UIViewRoot, but only pass through the
attributes to the already existing UIViewRoot. Thus you will use it in
this way:<html xmlns="http://www.w3.org/1999/xhtml"; xmlns:ui="http://java.sun.com/jsf/facelets"; xmlns:h="http://java.sun.com/jsf/html"; xmlns:f="http://java.sun.com/jsf/core";> <f:metadata>....</f:metadata> <f:view locale="...." /> <h:head>...</h:head> <h:body>...</h:body> </html>
I hope this helps ;)Because of this post i figured out that you actually need to put the metdata tag on the root page. The guy actually states that (or am i wrong???) you need to put metadata as a direct child of the root element.
I must admit that is one of biggest gotchas i've seen in years. I think there will be a lot more people with the same problem (me, the myfaces guy, and the guy who asked a question on myfaces mailing list were confused about it), so i think it would be advisable to mark this as a possible gotcha in the documentation. I think the red colour would be appropriate:). It will save other people some headache.
Thanks.
-
5. Re: With which version of JSF 2 are seam faces tested?
bleathem Jun 2, 2011 11:24 AM (in response to piklos)I'm glad it solved your problem. Would you mind checking if it also fixed your Mojarra problems, and posting back your results?
And yes, this behavior does need to be better documented.
Thanks
-
6. Re: With which version of JSF 2 are seam faces tested?
piklos Jun 3, 2011 3:23 AM (in response to piklos)OK, i tested this without chaning the code, but only switching to mojarra and changing the versions.
1) with mojarra 2.0.3 the tag works.
2) with mojarra 2.1.0 i get the error messageJun 3, 2011 9:03:20 AM com.sun.faces.application.ApplicationImpl createComponentApplyAnnotations SEVERE: JSF1068: Cannot instantiate component with component-type org.jboss.seam.faces.ViewAction
The page doesn't get rendered.
The whole stack trace:
javax.faces.FacesException: Expression Error: Named Object: org.jboss.seam.faces.ViewAction not found. at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1881) at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1152) at org.jboss.weld.environment.servlet.jsf.ForwardingApplication.createComponent(ForwardingApplication.java:122) at javax.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:594) at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:503) at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:157) at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) at com.sun.faces.facelets.tag.jsf.core.MetadataHandler.apply(MetadataHandler.java:104) at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86) at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152) at com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:116) at org.jboss.seam.faces.view.SeamViewMetadata.createMetadataView(SeamViewMetadata.java:47) at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:230) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at biz.netdialog.web.filter.SecurityFilter.doFilter(SecurityFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:110) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
3) with mojarra 2.1.1-b04 i get some message on the page that 'form needs to be enclosed' when I am in development mode. However action gets called and the page is rendered.