문제

JSF 기반 웹앱의 예를 고려하십시오. hello1 관리되는 Bean에 추가 생성자가 있는 공식 튜토리얼에서.팔로우 index.xhtml

<html lang="en"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelets Hello Greeting</title>
    </h:head>
    <h:body>
        <h:form>
            <h:graphicImage url="#{resource['images:duke.waving.gif']}" 
                            alt="Duke waving his hand"/>
            <h2>Hello hui, my name is Duke. What's yours?</h2>
            <h:inputText id="username"
                         title="My name is: "
                         value="#{hello.name}"
                         required="true"
                         requiredMessage="Error: A name is required."
                         maxlength="25" />
            <p></p>
            <h:commandButton id="submit" value="Submit" action="response">
            </h:commandButton>
            <h:commandButton id="reset" value="Reset" type="reset">
            </h:commandButton>
        </h:form>
        <div class="messagecolor">
            <h:messages showSummary="true" 
                        showDetail="false"
                        errorStyle="color: #d20005" 
                        infoStyle="color: blue"/>
        </div>
    </h:body>
</html>

및 수정된 관리 Bean Hello.java

package javaeetutorial.hello1;


import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class Hello {

    private String name;

    public Hello() {
    }
    public Hello(String name){
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String user_name) {
        this.name = user_name;
    }
}

있다 공개 생성자.이 앱을 서버에 배포하고 초기 요청을 보냈습니다. inputText 그리고 클릭 submit.이후에 포스트백 요청이 있습니다. submit 딸깍 하는 소리.따라서 튜토리얼에 작성된 대로 실행 단계에는 다음과 같은 하위 단계가 있습니다.

  1. 애플리케이션 보기가 빌드되거나 복원됩니다.
  2. 요청 매개변수 값이 적용됩니다.
  3. 구성 요소 값에 대해 변환 및 유효성 검사가 수행됩니다.
  4. 관리 Bean은 구성요소 값으로 업데이트됩니다.
  5. 애플리케이션 로직이 호출됩니다.

Managed Bean의 인스턴스는 어떤 단계에서 생성되나요?

이 인스턴스 생성을 위해 어떤 생성자가 호출되며 그 이유는 무엇입니까?나는 그것이 어떻게 관찰될 수 있는지 이해하지 못한다. index.xhtml 암호.

도움이 되었습니까?

해결책

Managed Bean의 인스턴스는 어떤 단계에서 생성되나요?

구체적으로 아무도 없습니다.이는 Bean 인스턴스가 해당 범위에 없는 동안 임의의 EL 표현식이 처음으로 관리되는 Bean을 참조해야 할 때 처음으로 구성됩니다.이는 특정 얼굴 이벤트에 종속되지 않습니다.이는 뷰 복원 단계(첫 번째 단계) 중일 수 있지만 렌더링 응답 단계(마지막 단계) 또는 그 사이의 다른 단계 중에도 좋을 수 있습니다.

이는 모두 EL 컨텍스트에서 Bean을 참조하는 방법과 위치에 따라 다릅니다. #{bean.xxx} 뷰에서(또는 프로그래밍 방식으로 모델에서)일반적으로 이에 대해 걱정할 필요가 없습니다.JSF(특히 EL)는 적어도 뷰를 적절하게 빌드, 처리 또는 렌더링하기 위해 필요한 것보다 빨리 구성하지 않습니다.


이 인스턴스 생성을 위해 어떤 생성자가 호출되며 그 이유는 무엇입니까?

물론 기본 생성자입니다.Javabeans 사양에 그렇게 나와 있기 때문입니다.다른 모든 생성자는 JSF/CDI 관리 Bean 기능에서 사용되지 않습니다.

그럼에도 불구하고 생성자에 대해 걱정할 필요는 없습니다.초기화를 수행하는 것이 좋습니다. @PostConstruct 생성자 대신 주석이 달린 메서드입니다.즉, Bean이 CDI와 같은 프록시를 사용하는 Bean 관리 프레임워크에 의해 관리되는 경우 기본 생성자가 원하는 것보다 더 자주 호출될 수 있습니다.


index.xhtml 코드에서 어떻게 관찰할 수 있는지 이해할 수 없습니다.

생성자에 중단점을 넣으면 됩니다. @PostConstruct, 또는 관련 getter/setter 메소드를 선택하고 디버그 모드에서 프로젝트를 실행하세요.중단점에 도달하면 호출 스택을 검사합니다.관련된 클래스와 메소드는 일반적으로 자체 문서화되는 이름을 갖습니다.다음은 다음을 사용할 때 호출 스택이 어떻게 보이는지에 대한 예입니다. @Named:

Daemon Thread [http-bio-8088-exec-6] (Suspended (entry into method <init> in TestBean)) 
    owns: LocalCache$StrongEntry  (id=503)  
    owns: SocketWrapper  (id=504)   
    TestBean$Proxy$_$$_WeldClientProxy.<init>() line: not available [local variables unavailable]   
    NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]   
    NativeConstructorAccessorImpl.newInstance(Object[]) line: 57    
    DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45    
    Constructor.newInstance(Object...) line: 526    
    Class.newInstance() line: 374   
    NewInstanceAction.run() line: 33    
    AccessController.doPrivileged(PrivilegedExceptionAction<T>) line: not available [native method] 
    ClientProxyFactory(ProxyFactory).create(BeanInstance) line: 271 
    ClientProxyFactory.create(BeanInstance) line: 111   
    ClientProxyProvider.createClientProxy(Bean<T>, Set<Type>) line: 181 
    ClientProxyProvider.createClientProxy(Bean<T>) line: 171    
    ClientProxyProvider.access$100(ClientProxyProvider, Bean) line: 45  
    ClientProxyProvider$CreateClientProxy.load(Bean<Object>) line: 56   
    ClientProxyProvider$CreateClientProxy.load(Object) line: 52 
    LocalCache$LoadingValueReference.loadFuture(K, CacheLoader<? super K,V>) line: 3589 
    LocalCache$Segment.loadSync(K, int, LoadingValueReference<K,V>, CacheLoader<? super K,V>) line: 2374    
    LocalCache$Segment.lockedGetOrLoad(K, int, CacheLoader<? super K,V>) line: 2337 
    LocalCache$Segment.get(K, int, CacheLoader<? super K,V>) line: 2252 
    LocalCache.get(K, CacheLoader<? super K,V>) line: 3990  
    LocalCache.getOrLoad(K) line: 3994  
    LocalCache$LocalLoadingCache.get(K) line: 4878  
    LoadingCacheUtils.getCacheValue(LoadingCache<K,V>, K) line: 52  
    LoadingCacheUtils.getCastCacheValue(LoadingCache<K,V>, Object) line: 80 
    ClientProxyProvider.getClientProxy(Bean<T>) line: 187   
    WeldELResolver(AbstractWeldELResolver).lookup(BeanManagerImpl, ELContext, String) line: 110 
    WeldELResolver(AbstractWeldELResolver).getValue(ELContext, Object, Object) line: 91 
    WeldApplication$LazyBeanManagerIntegrationELResolver(ForwardingELResolver).getValue(ELContext, Object, Object) line: 49 
    CompositeELResolver.getValue(ELContext, Object, Object) line: 67    
    DemuxCompositeELResolver._getValue(int, ELResolver[], ELContext, Object, Object) line: 176  
    DemuxCompositeELResolver.getValue(ELContext, Object, Object) line: 203  
    AstIdentifier.getValue(EvaluationContext) line: 72  
    ValueExpressionImpl.getValue(ELContext) line: 185   
    WeldValueExpression.getValue(ELContext) line: 50    
    ELText$ELTextVariable.writeText(ResponseWriter, ELContext) line: 227    
    ELText$ELTextComposite.writeText(ResponseWriter, ELContext) line: 150   
    TextInstruction.write(FacesContext) line: 85    
    UIInstructions.encodeBegin(FacesContext) line: 82   
    UIInstructions(UILeaf).encodeAll(FacesContext) line: 207    
    HtmlBody(UIComponent).encodeAll(FacesContext) line: 1899    
    UIViewRoot(UIComponent).encodeAll(FacesContext) line: 1899  
    FaceletViewHandlingStrategy.renderView(FacesContext, UIViewRoot) line: 451  
    MultiViewHandler.renderView(FacesContext, UIViewRoot) line: 131 
    ConversationAwareViewHandler(ViewHandlerWrapper).renderView(FacesContext, UIViewRoot) line: 337 
    RenderResponsePhase.execute(FacesContext) line: 120 
    RenderResponsePhase(Phase).doPhase(FacesContext, Lifecycle, ListIterator<PhaseListener>) line: 101  
    LifecycleImpl.render(FacesContext) line: 219    
    FacesServlet.service(ServletRequest, ServletResponse) line: 647 
    ...

맨 아래부터 시작합니다(이후 모든 줄을 제거했습니다). FacesServlet.service 일반적으로 관련이 없으므로) 아래에서 위로 읽으세요.그만큼 RenderResponsePhase.execute 렌더링 응답 단계에서 실행되었음을 알려줍니다.그만큼 TextInstruction.write EL의 결과를 템플릿 텍스트에 쓰는 동안 발생했음을 알려줍니다. <p>#{bean.something}</p>.나머지는 CDI 구현 Weld가 프록시를 찾고 인스턴스화하는 방법과 실제 Bean 참조를 인스턴스화하는 방법입니다.

다른 단계에서 발생한 경우 대신 RenderResponsePhase.execute 예를 들어 본 적이 있다 UpdateModelValuesPhase.execute 등등.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top