如何将 JSF 复合组件属性设置为 ManagedBean 属性?
How to set JSF composite component attribute to ManagedBean property?
所以我做了一个复合组件FileAdder.xhtml
<composite:interface>
<composite:attribute name="type" value="#{editoriCompositeController.typeString}"/>
</composite:interface>
<composite:implementation>
<h:form>
<p:editor id="editor" widgetVar="editorWidget" value="some text" width="600" />
</h:form>
</composite:implementation>
然后我有 EditoriCompositeController ManagedBean:
@ViewScoped
@ManagedBean
public class EditoriCompositeController {
String typeString;
public void setTypeString(String typeStringParameter) {
this.typeString = typeStringParameter;
}
public String getTypeString() {
return typeString;
}
}
然后在我的 fileattachmentsview.xhtml 中使用组件:
<owncomponents:fileadder type="MEMO" />
但这并不是将支持 bean 中的 typeString 值设置为 "MEMO"。它保持为 null 我用一个打印值的按钮对其进行了测试。
如何让支持 bean 获得 typeString
的值 我将复合组件的 type
属性设置为 "MEMO"?为什么是 null
而不是 "MEMO"?
我通过以下方式从支持 bean 中的组件手动获取 "type" 属性解决了这个问题:
String typeString = (String) component.getAttributes().get("type");
您必须将目标 bean/model 作为另一个复合属性传递。然后你可以在复合里面使用<c:set>
设置一个属性就可以了。
<cc:interface>
<cc:attribute name="bean" type="com.example.Bean" />
<cc:attribute name="type" type="java.lang.String" />
</cc:interface>
<cc:implementation>
<c:set target="#{cc.attrs.bean}" property="type" value="#{cc.attrs.type}" />
<p:editor value="#{cc.attrs.bean.text}" />
</cc:implementation>
用法:
public class Bean {
private String text;
private String type; // I suggest to make it an enum.
// ...
}
<h:form>
<your:composite bean="#{bean}" type="MEMO" />
<p:commandButton action="#{bean.submit}" />
</h:form>
请注意,我在复合之外分解了表格。在组合中有一个表单是不好的做法。
另请参阅:
- When to use <ui:include>, tag files, composite components and/or custom components?
所以我做了一个复合组件FileAdder.xhtml
<composite:interface>
<composite:attribute name="type" value="#{editoriCompositeController.typeString}"/>
</composite:interface>
<composite:implementation>
<h:form>
<p:editor id="editor" widgetVar="editorWidget" value="some text" width="600" />
</h:form>
</composite:implementation>
然后我有 EditoriCompositeController ManagedBean:
@ViewScoped
@ManagedBean
public class EditoriCompositeController {
String typeString;
public void setTypeString(String typeStringParameter) {
this.typeString = typeStringParameter;
}
public String getTypeString() {
return typeString;
}
}
然后在我的 fileattachmentsview.xhtml 中使用组件:
<owncomponents:fileadder type="MEMO" />
但这并不是将支持 bean 中的 typeString 值设置为 "MEMO"。它保持为 null 我用一个打印值的按钮对其进行了测试。
如何让支持 bean 获得 typeString
的值 我将复合组件的 type
属性设置为 "MEMO"?为什么是 null
而不是 "MEMO"?
我通过以下方式从支持 bean 中的组件手动获取 "type" 属性解决了这个问题:
String typeString = (String) component.getAttributes().get("type");
您必须将目标 bean/model 作为另一个复合属性传递。然后你可以在复合里面使用<c:set>
设置一个属性就可以了。
<cc:interface>
<cc:attribute name="bean" type="com.example.Bean" />
<cc:attribute name="type" type="java.lang.String" />
</cc:interface>
<cc:implementation>
<c:set target="#{cc.attrs.bean}" property="type" value="#{cc.attrs.type}" />
<p:editor value="#{cc.attrs.bean.text}" />
</cc:implementation>
用法:
public class Bean {
private String text;
private String type; // I suggest to make it an enum.
// ...
}
<h:form>
<your:composite bean="#{bean}" type="MEMO" />
<p:commandButton action="#{bean.submit}" />
</h:form>
请注意,我在复合之外分解了表格。在组合中有一个表单是不好的做法。
另请参阅:
- When to use <ui:include>, tag files, composite components and/or custom components?