从我以前在该站点上提出的问题之一,我意识到我对定制转换器的生命周期一无所知。我在互联网上搜索了一下,发现没有任何用处。
我想了解自定义转换器是一次创建并在需要时随时回收还是在运行时创建并销毁。
我想他们的主要目的是执行一些简单而轻松的任务,因此,如果每次在发送给用户的jsf页面中找到转换器的新实例时,都不会产生任何区别。
但我想使用自定义转换器以未铺砌的方式解决常见任务。我的自定义转换将具有繁重的初始化逻辑,因此我必须确定其生命周期。必须全部创建一次,而不是每次都需要创建。是否有可能 ?
根据我将收到的答案,我可以放弃使用自定义转换器的想法,也可以决定将繁重的初始化逻辑转移到单调中。
每次在使用@FacesConverter
注释时引用转换器时,都会创建一次转换器。这意味着,如果您执行缓慢的代码,将会给您带来麻烦。
或者,您可以根据@ManagedBean
需要的范围对它们进行批注,并将它们与EL参考(而不是原始转换器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();
}
}
托管豆:
@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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句