基本问题:
包含一个页面,其中包含具有组件ID的组件,多次无法完成.但是,我如何能够在包含页面的情况下引用该组件?
例:
included.xhtml
....
<h:form id="foo"/>
....
<!-- here i need reference to foo component of this page -->
Run Code Online (Sandbox Code Playgroud)
的index.xhtml
....
<ui:include src="included.xhtml" />
<ui:include src="included.xhtml" />
<ui:include src="included.xhtml" />
Run Code Online (Sandbox Code Playgroud) 我是JSF 2的新手,因为我试图做一个自己熟悉的世界示例,我遇到了这个错误,我已经尝试了很长一段时间.
堆栈跟踪
om.sun.facelets.tag.TagException: /facelets/register/host/registerHostUser.xhtml @9,9 <h:head> Tag Library supports namespace: http://java.sun.com/jsf/html, but no tag was defined for name: head
at com.sun.facelets.compiler.CompilationManager.pushTag(CompilationManager.java:193)
at com.sun.facelets.compiler.SAXCompiler$CompilationHandler.startElement(SAXCompiler.java:194)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:767)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
at com.sun.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:232)
at com.sun.facelets.compiler.Compiler.compile(Compiler.java:105)
at com.sun.facelets.impl.DefaultFaceletFactory.createFacelet(DefaultFaceletFactory.java:218)
at com.sun.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:149)
at com.sun.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:100)
at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:517)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) …Run Code Online (Sandbox Code Playgroud) 我想在EL中声明一个条件方法表达式,如下所示:
<p:dataTable id="#{cc.attrs.datatableId}" var="overview"
rowSelectListener="#{cc.attrs.detailsMode == 'single' ? cc.attrs.bean.onRowSelect : cc.attrs.bean.onRowUrlSelect}">
Run Code Online (Sandbox Code Playgroud)
但是,它抛出一个EL异常:
javax.el.ELException:不是有效的方法表达式:#{cc.attrs.detailsMode =='single'?cc.attrs.bean.onRowSelect:cc.attrs.bean.onRowUrlSelect}
我如何声明条件EL方法表达式?
我想以编程方式设置clientIds来显示不同的FacesMessages.在我看来,我用过
<h:outputText value="warnMessages #{facesContext.getMessageList('warnMessages')}" />
<h:outputText value="validationMessages #{facesContext.getMessageList('validationMessages')}" />
Run Code Online (Sandbox Code Playgroud)
用于调试.消息都在那里.但...
<h:messages for="warnMessages" />
<h:message for="warnMessages" />
Run Code Online (Sandbox Code Playgroud)
不显示任何内容.只要
<h:messages />
Run Code Online (Sandbox Code Playgroud)
作品.但是我希望将不同的消息框一起显示出来.我怎样才能做到这一点?谢谢
马塞尔
这就是我想要生成的:
<div class="marker" style="background:transparent url('/myApp/faces/javax.faces.resource/1.png?ln=images/map') no-repeat center top;"></div>
<div class="marker" style="background:transparent url('/myApp/faces/javax.faces.resource/2.png?ln=images/map') no-repeat center top;"></div>
<div class="marker" style="background:transparent url('/myApp/faces/javax.faces.resource/3.png?ln=images/map') no-repeat center top;"></div>
etc...
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
<ui:repeat value="#{myBean.items}" var="item" varStatus="status">
<h:panelGroup layout="block" styleClass="marker" style="background:transparent url(#{resource['images/map:'+(status.index+1)+'.png']} no-repeat center top;"/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)
这与NumberFormatException失败,因为EL解释器尝试将"images/map"转换为数字.经过相当多的搜索后,我发现+仅用于添加数字.任何想法如何达到预期的效果?
TL; DR:我无法将DOCTYPE标头显示在我的JSF页面上.
我刚刚继承了一个JSF 1.2项目,它在IE下有一些显示问题.我是JSF的新手,但我认为问题源于渲染页面(来自"视图源")不包含正确的事实DOCTYPE.
页面由多个部分组成,使用多个层组合在一起<ui:composition>.典型页面如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
template="../layout/template.xhtml">
<ui:define name="body">
<!-- html content goes here... -->
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
然后../layout/template.xhtml有:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
template="./headertemplate.xhtml">
<ui:define name="menuSelection">
<ui:insert name="menuSelection"/>
</ui:define>
<ui:define name="body">
<ui:insert name="body"/>
</ui:define>
<ui:define name="footer">
<div class="footer">
<ui:include src="footer.xhtml"/>
</div>
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
最后,headertemplate.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
contentType="text/html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" …Run Code Online (Sandbox Code Playgroud) 我想制作一个util方法,从地图转换为列表,以便与EL一起使用,这是我试过的:
1- utils.taglib.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
<namespace>http://mycomp.com/utils</namespace>
<function>
<function-name>mapToList</function-name>
<function-class>com.mycomp.MyClass</function-class>
<function-signature>java.util.List mapToList(java.util.Map)</function-signature>
</function>
</facelet-taglib>
Run Code Online (Sandbox Code Playgroud)
2- web.xml:我添加了它,因为我添加了spring安全标记lib,如下所示:
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>
/WEB-INF/springsecurity.taglib.xml
/WEB-INF/utils.taglib.xml
</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
3- xhtml页面:
xmlns:utils="http://mycomp.com/utils"
<ui:repeat value="#{utils:mapToList(myBean.map)}" var="entry" >
Key = #{entry.key} Value = #{entry.value} <br/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)
4- Util类:
public class MyClass{
public static <T, S> List<Map.Entry<T, S>> mapToList(Map<T, S> map) {
if (map == null) {
return null;
}
List<Map.Entry<T, S>> list …Run Code Online (Sandbox Code Playgroud) 我正在使用Eclipse Juno和JSF 2.1项目。
Facelets文件中的EL表达式自动完成速度非常慢。慢到我尝试使用20种左右的方法自动完成JSF Bean的地步时,Eclipse编辑器将挂起10-15秒,直到看到成员/属性列表。
从我的角度来看,我有2个解决方案,但我既不知道如何实现,因此任何帮助都会有所帮助。(优先于第一个)
解决速度慢的问题。我的猜测是,当我按ctrl-space时,Eclipse正在做很多我不需要的事情,并且如果可以禁用那些可以使其运行更快的东西。(有根据的猜测)
完全禁用El Expressions的自动完成功能并安装JBoss Tools(我必须说,它可以正常工作,但是当与本机自动完成功能结合使用时,它仍然挂在每个ctrl空间上)。
因此,任何一种解决方案都将有所帮助-解决缓慢问题或一起禁用自动完成功能。
提前致谢!!
我在f:metadata元素中使用prerender视图事件调用另一个页面.
如果我使用<h:link>它导航到页面工作并调用侦听器方法.
但是,如果我使用属于调用页面的托管bean的操作方法的结果导航到页面,则不会调用prerenderview中指定的侦听器(如果通过链接调用它).它会导航到第二页,只是没有监听器调用.
我真的更喜欢从action方法调用,因为我使用它来做一些工作并在会话映射中放置一个变量来使用.我不确定如何使用链接实现相同的功能.对象可能相当大...... kb不是Mb,但仍然不是我想要放在请求中的东西.
我已经尝试使调用页面请求的托管bean作用域并查看作用域.
如果从托管bean结果调用它,是不是可以获取prerenderview?正如我所说,我从一个链接开始工作.
<body>
<ui:define name="metadata">
<f:view>
<f:metadata>
<f:event type="preRenderView" listener="#{businessBean.init}" />
</f:metadata>
</f:view>
</ui:define>
<ui:composition template="#{navigationprops.soulard_2col_uprefs_template}">
Run Code Online (Sandbox Code Playgroud) 这是我的Facelets文件:
<!DOCTYPE html>
<html lang="en"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Simple JSF Facelets page</title>
</h:head>
<h:body>
Place your content here!
<dialog>
<dt>Sam</dt>
<dd>Knock, Knock.</dd>
<dt>Eric</dt>
<dd>Who's there?</dd>
<dt>Sam</dt>
<dd>Justin.</dd>
<dt>Eric</dt>
<dd>Justin who?</dd>
<dt>Sam</dt>
<dd>Justin time for dinner!</dd>
</dialog>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
我在浏览器中看到的只是
将您的内容放在这里!
当我检查此文件的来源时,我在chrome中看到:
<!DOCTYPE html>
<html lang="en"><head>
<title>Simple JSF Facelets page</title></head><body>
Place your content here!
<dialog>
<dt>Sam</dt>
<dd>Knock, Knock.</dd>
<dt>Eric</dt>
<dd>Who's there?</dd>
<dt>Sam</dt>
<dd>Justin.</dd>
<dt>Eric</dt>
<dd>Justin who?</dd>
<dt>Sam</dt>
<dd>Justin time for dinner!</dd>
</dialog>
<ul id="javax_faces_developmentstage_messages" title="Project Stage[Development]: Unhandled Messages"></ul></body>
</html>
Run Code Online (Sandbox Code Playgroud)
那么,从源代码来看,它看起来应该是一个有效的html5文件?但是目前,我看不到对话框标签中的内容?
facelets ×10
jsf ×8
jsf-2 ×5
el ×2
eclipse ×1
eclipse-juno ×1
glassfish ×1
html5 ×1
java ×1
java-ee ×1
managed-bean ×1
maven ×1
message ×1
performance ×1
taglib ×1