2

MVC와 관련하여 JSF @PostConstruvtor가 호출되기 전에 init 속성을 사용하려고합니다.@PostConstructor가 관리되는 Bean에서 호출되기 전에 매개 변수를 초기화하는 방법

이 내 자바 코드 :

@ManagedBean 
public abstract class FooController { 
    protected <type> prop; 

    public void setProp(<type> prop) { 
     this.prop = prop; 
    } 

    public <type> getProp() { 
     return this.prop; 
    } 
} 

@ManagedBean 
public class Foo1Controller extends FooController { 
    private <otherType> myProp; 

    @PostConstructor 
    public void init { 
     myProp = prop.getProp().getOtherTypeProp(); 
    } 
} 

[here I have more FooControllers Foo2Controller, Foo3Controller, Foo4Controller...] 

@ManagedBean 
public class MainController { 
    // all props have getters and setters 
    private FooController fooController; 
    private int controllerType; 
    private List<SelectItem> myTypes; 
    private <type> prop; 

    @PostConstructor 
    public void init { 
     // init myTypes here 
     // init prop here 
    } 

    public static Object getBean(String s) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     return context.getApplication().evaluateExpressionGet(context, "#{" + s + "}", Object.class); 
    } 

    public void controllerTypeChange (ValueChangeEvent event) { 
     controllerType = Integer.valueOf(event.getNewValue().toString()); 

     if (controllerType == 1) 
      fooController = (Foo1Controller) getBean("foo1Controller"); 
     else if (controllerType == 2) 
      fooController = (Foo2Controller) getBean("foo2Controller"); 
     .... 

     fooController.setProp(this.prop); 
    } 
} 

그리고 이것은 XHTML입니다 : 내가 MainController 콩의 foo1Controller을 만드는거야 때

<o:SelectOneMenu id="fooType" 
    value = #{"MainController.controllerType"} 
    valueChangeListener = "#{MainController.controllerTypeChange}" 
    styleClass = "dropdown"> 
    <o:ajax action = "#{MainController.controllerTypeChange}"> 
    <f:selectItems value = "MainController.myTypes"> 
</o:selectOneMenu> 

<h:panelGroup id="component1" rendered="#{MainController.controllerType == 1}"> 
    <!-- some component here that uses foo1Controller as it's controller --> 
</h:panelGroup> 

<h:panelGroup id="component2" rendered="#{MainController.controllerType == 2}"> 
    <!-- some component here that uses foo2Controller as it's controller --> 
</h:panelGroup> 

, 그것은 이미 사용 년대 일이된다 prop 속성을 foo1Controller @ postConstructor하지만이 속성은 아직 초기화되지 않았기 때문에 나는이 게시물의 생성자가 호출되기 전에 어떻게 해야할지 모릅니다. 내가해야할 일이 무엇인지에 대한 개념은 MainController가 하나의 하위 구성 요소 만 가질 수 있고 있어야하며, 모두 공통점이 많아서 상속을 수행해야한다는 것입니다. 사용자가 드롭 다운에서 일부 값을 선택하면 MainController가 컴포넌트 컨트롤러에 대한 참조를 가져야하는 반면 상대 컴포넌트는 디스플레이되어야합니다.

도움이 될 것입니다. 감사합니다.

+0

첫째 : 지금 유용 당신이 게시해야 응답하는 [SSCCE] (http://sscce.org/) 및 코드를 얻을 자체 포함되지 않으며 또한 구문 오류가 있습니다. 둘째 : 귀하의 문제를 설명하고 달성하고자하는 것은 귀하가 게시 한 코드를 설명하는 것입니다. 귀하가 질문을 이해하기 어려울 정도로 자체 포함되지 않고 편집 할 수있는 코드는 아닙니다. 자, 코드에서 볼 수 있듯이'FooXController'가'prop' 속성을 초기화하지 않습니다 ('MainController'에도 없지만 초기화되지 않은 값을 사용하여 myProp을 초기화하려고합니다.) –

+0

@Alonso Dominguez, my 진짜 클래스가 너무 커서 내가 게시 할 수 없으므로 불분명 한 것이 있으면 문제를 설명하는 데 중요한 것으로 보이는 것들을 추출하려고 노력했습니다 - 질문 해주십시오 그리고 설명하겠습니다 FooXController가 프로퍼티를 결코 초기화하지 않는 것에 관해서 : 소품 가치는 MainController에서 초기화되어야하고 FooXController는 PostConstructor에서 소품의 다른 속성을 사용하고 있습니다. 그러나 문제는 내가 FooXController 빈을 작성할 때 자동으로 소품을 사용해야하는 PostConstructor를 호출하지만 MainController – DiSol

+0

너무 가혹한 것에 대해 유감 스럽지만, 게시하는 작은 코드조차도 컴파일 할 수 없다면 매우 어렵습니다. 문제가 어디에 있는지 알 수 있습니다. 나는 당신이'FooXController'에서'propControl' 속성을'MainController'에서 초기화하는 것을 시도하고 있다는 것을 알고 있습니다, 나는 그것을 볼 수 있습니다, 그러나 당신이 어디에서'MainController'를 초기화하는지 보지 않을 것입니다 if 당신은 그것을 초기화하고있다. (당신의'init' 메쏘드는 비어 있고 대괄호도 없다!). 제발, SSCCE를 게시하려고 지침을 따르십시오 코드를 정리하고 그것을 요구하기 전에 문제에 대한 해결책을 찾을 수 있습니다 ... –

답변

0

servlet을 정의해야합니다. GenericServlet은 응용 프로그램에서 원하는대로 수행해야합니다. web.xml set load-on-startup 태그에서 정의하십시오. 은 web.xml에서 서블릿

public class ResourceInitializer extends GenericServlet { 

@Override 
    public void init(final ServletConfig config) throws ServletException { 
     super.init(config); 
// YOUR APPLICATION INIT CODE 
} 

@Override 
    public void service(final ServletRequest req, final ServletResponse res) 
      throws ServletException { 
    } 

    @Override 
    public void destroy() { 
     // tell the ResourceManager to cleanup and remove the resouces 
     LibraOfficeService.getInstance().closeConnection(); 
     super.destroy(); 
    } 
} 

에 대한 샘플 코드

<servlet> 
    <description>Initializes Resources</description> 
    <servlet-name>ResourceInitializer</servlet-name> 
    <servlet-class>packageNAME.ResourceInitializer</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet>