gpt4 book ai didi

jsf-2 - JSF 复合组件 - 尝试保存状态时的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 08:45:08 25 4
gpt4 key购买 nike

我正在使用 Glassfish 3.2.2 和 JSF 2.1.11

我正在尝试创建一个复合组件,它将一个字符串和最大字符数作为参数,然后将仅显示最大字符数,但它旁边会有一个“更多”链接,即单击时会将文本扩展到全长,然后旁边会有一个“更少”链接以将其恢复到最大字符数。

我看到一些奇怪的行为,所以我想知道我是否做错了什么。

这是我的复合组件定义:

<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>

这是 Java 组件:

@FacesComponent("expandableTextComponent")
public class ExpandableTextComponent extends UINamingContainer
{
boolean expanded;

public boolean isExpanded()
{
return expanded;
}

public void toggleExpanded()
{
expanded = !expanded;
}
}

不幸的是,每次调用 toggleExpanded 函数时,expanded 始终为 false。

但是,如果我将复合组件更改为以下内容,它就会起作用。

<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;"/>
<p:commandLink actionListener="#{cc.toggleExpanded()}" rendered="#{fn:length(cc.attrs.value) gt cc.attrs.maxCharacters and !cc.expanded}" update="#{cc.attrs.name}" process="@this">
<h:outputText value="#{__commonButton.more}..."/>
</p:commandLink>

<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 and cc.expanded}" update="#{cc.attrs.name}" process="@this">
<h:outputText value="#{__commonButton.less}"/>
</p:commandLink>
</h:panelGroup>
</composite:implementation>
</html>

如果我在 toggleExpanded 函数中放置一个断点,它只会在“更多”链接而不是“更少”链接上被调用。所以问题是为什么当我点击“less”链接时它没有被调用?这段代码不应该等同于上面的代码吗?

有没有更好的方法来保存组件中的状态?

最佳答案

基本上,您应该覆盖 UIComponent#saveState()restoreState()当您将自定义属性/特性添加到组件时,根据他们的文档,这些组件应该在同一 View 上的多个 HTTP 请求中存活。即在每次请求时重新创建组件实例。

从 JSF 2.0 开始,更好的方法是使用 StateHelper直接在属性 getters/setters 中。它由继承的 UIComponent#getStateHelper() 提供方法。

private enum PropertyKeys {
expanded;
}

public void toggleExpanded() {
setExpanded(!isExpanded());
}

public void setExpanded(boolean expanded) {
getStateHelper().put(PropertyKeys.expanded, expanded);
}

public boolean isExpanded() {
return (boolean) getStateHelper().eval(PropertyKeys.expanded, false);
}

关于jsf-2 - JSF 复合组件 - 尝试保存状态时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13015942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com