gpt4 book ai didi

JSF 中基于两个组件的组合的验证/转换

转载 作者:行者123 更新时间:2023-12-01 02:22:24 27 4
gpt4 key购买 nike

我正在开发一个 JSF Web 应用程序,我需要在其中使用周期性作为数据结构。这里有我使用的 Java 类:

public class Periodicity implements Serializable {

private Integer value = 0;

private PeriodicityType type;

//Getter and setters

}

public enum PeriodicityType {
DAY, WEEK, MONTH, YEAR
}

这样我就可以为我的任务指定不同的周期,这些周期可以将值与 PeriodicityType 结合起来。 .

我还创建了一个名为 periodityInput.xhtml 的输入复合元素,我可以使用它以可重用的方式以不同的形式提供该数据类型:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">

<h:body>
<composite:interface>
<composite:attribute name="value" required="true" />
<composite:attribute name="disabled" required="false" default="false" />
</composite:interface>

<composite:implementation>
<h:panelGrid columns="2" id="#{cc.id}">
<p:spinner value="#{cc.attrs.value.value}" min="1"
id="value_spinner" disabled="#{cc.attrs.disabled}" />
<p:selectOneMenu value="#{cc.attrs.value.type}" style="width:200px"
disabled="#{cc.attrs.disabled}">
<f:selectItem noSelectionOption="true"
itemLabel="#{windowsMessages.NOT_ASSIGNED}" />
<f:selectItems value="#{viewUtils.periodicityTypes}" />
</p:selectOneMenu>
</h:panelGrid>
</composite:implementation>
</h:body>
</html>

基本上我有一个 spinner元素和 selectOneMenu ,以便为周期性选择一个值和类型。还有机会不选择任何类型, 在这种情况下,输入数值必须为零 .或者,更好的是, 如果没有选择周期性,则输入必须转换为空/空元组 .

正如我读到的一些 sites有机会通过访问验证方法中的 id 一次验证多个 JSF 组件:

UIInput confirmComponent = (UIInput) component.getAttributes().get("confirm");



问题是,如何调整它以便在没有固定 ID 的复合组件中使用?

最佳答案

一种方法是创建一个扩展 UIInput 的支持组件。并在 UIInput#getSubmittedValue() 中完成工作.子输入可以直接通过 findComponent() 获得。 .

<cc:interface componentType="inputPeriodicity">
...
</cc:interface>
<cc:implementation>
...
<p:spinner id="value_spinner" ... />
<p:selectOneMenu id="type_menu" ... />
...
</cc:implementation>


@FacesComponent("inputPeriodicity")
public class InputPeriodicity extends UIInput implements NamingContainer {

@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}

@Override
public Object getSubmittedValue() {
UIInput typeMenu = (UIInput) findComponent("type_menu");
String type = (String) typeMenu.getSubmittedValue();

if (type == null || type.isEmpty()) {
UIInput valueSpinner = (UIInput) findComponent("value_spinner");
valueSpinner.setSubmittedValue("0"); // Don't use int/Integer here!
}

return super.getSubmittedValue();
}

}

也可以看看:
  • Split java.util.Date over two h:inputText fields representing hour and minute with f:convertDateTime


  • 无关 到具体问题, <h:panelGrid id="#{cc.id}">真的不对。如果你真的需要,给它一个固定的 ID。

    关于JSF 中基于两个组件的组合的验证/转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19275847/

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