【问题标题】:Jsf custom converter life cylejsf自定义转换器生命周期
【发布时间】:2013-10-11 09:45:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: jsf-2 converter


    【解决方案1】:

    在使用@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>
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2012-12-16
      相关资源
      最近更新 更多