gpt4 book ai didi

jsf-2 - Jsf 自定义转换器生命周期

转载 作者:行者123 更新时间:2023-12-04 04:39:16 25 4
gpt4 key购买 nike

来自 one of my previous questions在这个网站上,我意识到我对自定义转换器生命周期一无所知。我在互联网上搜索了一下,没有发现任何有用的东西。

我想了解自定义转换器是一次性创建并在需要时随时回收,还是动态创建并销毁。

我想它们的主要目的是执行一些简单而轻松的任务,所以如果每次在发送给用户的 jsf 页面中找到转换器的新实例时都创建它,那没有什么区别。

但我想使用自定义转换器以未铺砌的方式解决常见任务。我的自定义转换会有一个繁重的初始化逻辑,所以我必须确定它的生命周期。它必须一劳永逸地创建,而不是每次需要时创建。是否有可能 ?

根据我收到的答案,我可以放弃使用自定义转换器的想法,或者决定在单音中移动繁重的初始化逻辑。

最佳答案

使用 @FacesConverter 时,每次引用转换器都会创建一次转换器注释。这意味着如果你在那里执行慢代码,它会给你带来问题。

或者,您可以将它们注释为 @ManagedBean使用您想要的范围并将它们与 EL reference 一起使用而不是原始转换器 ID。如果你想以某种方式初始化它们,你的解决方案是为它们设置整个应用程序的范围并使它们急切地初始化,这样它们就会在应用程序启动时被创建:

转换器:

@ManagedBean(eager = true)
@ApplicationScoped
public class WorkerConverter implements Converter {

public WorkerConverter() {
System.out.println("Building converter...");
}

@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
Integer id = Integer.parseInt(value);
if (id == 1) {
return new Worker(1, "John");
} else {
return new Worker(1, "Larry");
}
}

@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
return ((Worker) value).getId().toString();
}

}

托管 bean:
@ManagedBean
@ViewScoped
public class SelectWorkerBean {

public static class Worker {
Integer id;
String name;

public Worker(Integer id, String name) {
this.id = id;
this.name = name;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Worker other = (Worker) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}

public Integer getId() {
return id;
}

public String getName() {
return name;
}

@Override
public int hashCode() {
return id;
}

@Override
public String toString() {
return "Worker [name=" + name + "]";
}

}

private Worker selectedWorker;

private List<Worker> workers = Arrays.asList(new Worker(1, "John"),
new Worker(2, "Larry"));

public Worker getSelectedWorker() {
return selectedWorker;
}

public List<Worker> getWorkers() {
return workers;
}

public void send() {
System.out.println(selectedWorker + " selected");
}

public void setSelectedWorker(Worker selectedWorker) {
this.selectedWorker = selectedWorker;
}

}

页面:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Test page</title>
</h:head>
<h:body>
<h:form>
<h:selectOneMenu value="#{selectWorkerBean.selectedWorker}"
converter="#{workerConverter}">
<f:selectItems value="#{selectWorkerBean.workers}" var="worker"
itemLabel="#{worker.name}" />
</h:selectOneMenu>
<h:commandButton value="send" action="#{selectWorkerBean.send}" />
</h:form>
</h:body>
</html>

关于jsf-2 - Jsf 自定义转换器生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180457/

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