2013-08-04 4 views
1

하나의 혼란이있는 기본적인 Struts2 애플리케이션을 실행 중입니다. My action 클래스는 Preparable 및 ModelDriven 인터페이스를 구현하고 ActionSupport 클래스를 확장합니다. 모델 bean에는 "User"라는 단일 속성이 있습니다.Struts2의 validate 및 model 메소드에서 가져온 속성 값의 차이

내 홈페이지 (jsp)에는 모델 bean의 유일한 "User"등록 정보에 해당하는 하나의 입력 필드가 있습니다.

prepare() 메소드에서 bean을 초기화하고 해당 속성을 "Test"라고 말하는 일부 기본값으로 설정하고 model() 메소드가이 bean 객체를 리턴하고 있습니다.

validate()에서 bean의 "User"속성 값이 "Test"와 같고 addFieldError가 다른 경우 계속 진행됩니다. 내가 직접하고 작업을 접근하고 때

public Student getModel() { 
    System.out.println("inside getModel.."+ st.getName());  
    return st; 
} 

public void validate(){ 
    System.out.println("inside validate"+st.getName()); 
    if(st.getName().equals("Test")){ 
     addFieldError("name","blank field"); 
    }  
} 

public void prepare() throws Exception { 
    st = new Student(); 
    st.setName("Test"); 
} 

지금, 내 질문입니다 오류가 와서 콘솔에서 나는 아래에 기록되었다 :

inside getModel..Test 
inside getModel..Test 
inside validate...Test 

하지만 입력 값이에서 "스택"을 말한다면 양식 필드를 제출하고 양식을 제출 한 다음 validate 메소드는 model 메소드가 준비중인 것을 인쇄하는 동안 사용자가 입력 한 값을 인쇄합니다.

inside getModel..Test 
inside getModel..Test 
inside validate...Stack 

왜 그렇습니까? 왜 두 방법이 동기화되지 않았습니까? validate 메서드와 model 메서드가 다른 위치에서 속성 값을 선택합니까?

감사합니다.

답변

1

값은 인터셉터 호출 순서에 따라 get/set됩니다. 조치가 가치가있는 한 prepare 다음에 params 인터셉터를 호출하여 getModel()을 호출하여 속성을 설정해야하는 객체를 가져옵니다.

modelDriven 요격기는 또한 valuestack에서 모델을 검색합니다. 속성이 아직 설정되지 않은 상태에서 표현식 결과를 통해 모델 속성을 검색하면 getModel()을 호출합니다. params 인터셉터는 마지막으로 속성을 설정하고 validation 인터셉터가 호출되고 이미 설정해야하는 속성 값을 얻기 위해 getModel()을 가져옵니다.

콘솔은 위와 같습니다. 액션이 실행될 때까지는 인터셉터의 정상적인 동작입니다. 첫 번째 경우에는 요청과 함께 값을 보내지 않으므로 prepare 이후의 내용이 출력됩니다. 두 번째에는 값이 전송되고 속성이 변경되어 콘솔에 반영됩니다. 값은 http 요청과 함께 오므로 요청 범위와 동일한 "위치"입니다.

+0

인터셉터가 실행되는 순서를 놓쳤습니다. 감사. – Infotechie

+0

@Infotechie 설정 파일의 순서는 위에서 아래로 같습니다. 'interceptor-stack' 태그를보십시오. –