这个真的很伤脑筋..。我有许多命令链接,它们的样式都是按钮,因此为了便于维护,我编写了一个html片段,可以包含一些参数来呈现一个风格良好的命令链接。
现在,这是伟大的工作,除非行动的结果是改变观点,在这一点上,“包括”版本坚决拒绝服从点击导航,我不知道为什么!如果操作导致验证错误,则会显示错误,因此肯定会调用该操作--而我的日志证实了这一点,但是,如果没有验证错误,原始版本(不使用包含)将导航到下一页,但是使用include的版本不会导航。我尝试了一个非常简单的"hello.xhtml“页面作为第二个页面,所以我知道它不可能与新视图的内容有任何关系。
为了清晰起见,我在页面上使用了几个按钮,其中大多数只是修改当前页面的状态,这些按钮都很好。只有当结果是改变观点时,“包含”版本才会出错。
我在PortalServer6.1/WAS7.0上运行JSF1.2
我花了很长时间想办法让你们看看你们有没有什么想法.
Update:为了保存对注释的涉猎,答案是我在导航规则中使用from-action,它只匹配commandLink中使用的字符串,因此导航处理程序将#{bean[action]}视为from-action,而不是#{applicationPage.doContinue}。
一些密码。
我的按钮模板:
<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xml:lang="en" lang="en">
<ui:remove>
Functional Button with arrow icon.
Parameters:
linkId = The id for the commandLink.
linkText = The text to display on the button.
linkTitle = title text to display
bean = The bean name containing the action handler.
action = The action handler to call.
</ui:remove>
<div class="btn functionalButton">
<h:commandLink id="#{linkId}" action="#{bean[action]}" title="#{linkTitle}" styleClass="functional">
#{linkText}
<span class="arrow icon" />
<span class="tl" />
<span class="tr" />
<span class="bl" />
<span class="br" />
</h:commandLink>
</div>
</ui:composition>还有一个页面上使用的例子:
<ui:include src="/WEB-INF/facelets/content/functionalButton.xhtml">
<ui:param name="linkId" value="applicationSubmit" />
<ui:param name="bean" value="#{applicationPage}" />
<ui:param name="action" value="doContinue" />
<ui:param name="linkText" value="#{msg['button_FF060_continue']} " />
</ui:include>此版本不会更改视图。
在使用include之前,代码看起来是这样的(应该解析并呈现到完全相同的html),但是这个版本改变了视图。
<div class="btn functionalButton">
<h:commandLink id="applicationSubmit" styleClass="functional" action="#{applicationPage.doContinue}" title="#{msg['button_FF060_continue']}">
#{msg['button_FF060_continue']}
<span class="arrow icon" id="arrow_continue" />
<span class="tl" />
<span class="tr" />
<span class="bl" />
<span class="br" />
</h:commandLink>
</div>发布于 2012-06-11 14:59:59
Update:当与操作关联的<navigation-case>中的<from-action>仍然引用原始EL表达式时可能发生如下情况:
<from-action>#{applicationPage.doContinue}</from-action>它不是被解释为实际的方法表达式,而是被解释为字符串文本,这正是您在action属性中定义的字符串。因此,在使用include/tag文件时,应该将其更改为在action属性中使用的文字EL表达式:
<from-action>#{bean[action]}</from-action>或者更好,把它移开。如果您没有多个操作,每个操作都可能返回相同的结果,但需要一个不同的目的地,这是没有用的。我还建议只使用没有扩展的<to-view-id>作为结果值。这简化了将来向JSF2.0的迁移,因为这已经隐式地完成了。
现保留以下答案,供日后参考。
我不确定,但可能Facelets 1.x根本就不吃这个。这适用于Facelets 2.x。我只是从经验中看不出来,因为我从来没有这样使用过包含文件。
我建议将它作为标记文件使用。另外的好处是,这也是在更清晰的语法和可能提供属性名称和描述的IDE自动完成。您需要做的就是创建一个/META-INF/my.taglib.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://example.com/jsf/facelets</namespace>
<tag>
<tag-name>functionalButton</tag-name>
<source>/WEB-INF/facelets/content/functionalButton.xhtml</source>
</tag>
</facelet-taglib>(属性的定义是可选的,如果需要,将其作为<attribute>添加到<tag>__中,我还建议将这些文件放在一些/tags子文件夹中,例如/WEB-INF/facelets/tags__)。
如果您按以下方式在/WEB-INF/web.xml中注册它
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/META-INF/my.taglib.xml</param-value>
</context-param>然后您就可以按以下方式使用它:
xmlns:my="http://example.com/jsf/facelets"
...
<my:functionalButton linkId="applicationSubmit" bean="#{applicationPage}"
action="doContinue" linkText="#{msg['button_FF060_continue']} " />https://stackoverflow.com/questions/10982354
复制相似问题