2012-06-02 1 views
8

컨트롤러를 이벤트 리스너로 등록해야하므로 컨트롤러를 참조하는보기가 필요합니다. 단추를 클릭하면 목록에서 선택한 파일을 가져올 수 있어야하므로 뷰에 대한 참조를 보유하려면 컨트롤러가 필요합니다.MVC - 순환 종속성

Controller controller(view); 
View view(controller); 

나 ':

짧은 그래서

내가 가지고있는 (그래서 버튼을 클릭 할 때 선택한 파일을 얻을 필요가,'클러스터 추가 '파일의 목록을 가지고 있고, 버튼) 나쁜 디자인은 여기가 확실 m은, 난 그냥 .. 그것을 방지하는 방법을 알아낼 수 없습니다

+0

[Swing did] (http://www.oracle.com/technetwork/java/architecture-142923.html)으로 수행하고 컨트롤러와보기를 결합하십시오. – Jeffrey

+0

MVC에서이 작업을 수행하는 것에 대해 논쟁하겠다. 왜냐하면 실제로 서버 측 이벤트 처리를 위해 만들어진 것이 아니기 때문이다. 아마도 jQuery로 이벤트를 처리하는 것이 여기에 더 적합 할 것입니다. – Lilienthal

답변

3

한 가지 가능한 솔루션 :

  • 간단히 컨트롤러에게 addView(View view) 방법을 제공
  • 마찬가지로보기의 경우 addController(Controller controller) 방법을 사용하십시오.
  • 설명서를 작성한 후에 사용하기 전에 설정해야합니다.
  • 참조 변수가 생성자에서 설정되지 않기 때문에 사용하기 전에 참조 변수가 null이 아닌지 확인하십시오.
+0

감사. 나는 그것을 생각했지만 그것이 옳았다는 것을 확신하지 못했습니다. – Shmoopy

+0

뷰가 MVC 패턴의 컨트롤러에 의존해서는 안됩니다 : 모델에만 의존해야합니다. –

+0

뷰에 컨트롤러에 대한 참조가 있어야한다고 제안합니다. : 종속성 –

1

글쎄, 나는 당신이 캡슐화와 게으른 초기화 과정을 사용할 수 있다고 생각한다. 컨트롤러가 초기화 될 때 같은 순간에 뷰가 필요 없으며 그 반대의 경우도 마찬가지입니다. 그렇지 않다면 bean에 대한 lazy init 프로퍼티와 함께 ​​위의 답을 얻을 수있다.

+1

나는 원래의 포스터가 아니지만, 당신이 의미하는 바에 대한 간단한 예를 보여줄 수 있습니까? 감사! –

+0

컨트롤러를 삽입 한 후에 뷰가 필요한 경우 그는 다음과 같이 뷰를 구성 할 수 있습니다. 컨트롤러 전에보기를 초기화 할 필요가 없습니다. dharam

+0

업데이트 해 주셔서 감사합니다! –

5

GWT 응용 프로그램에서 사용하는 Java 기술과 MVP 패턴을 사용하여보기에 컨트롤러에 대한 참조가 필요하지는 않습니다. 컨트롤러 (또는 발표자) 간의 모든 통신 View에 의해 구현 된 인터페이스를 통해 View가 작성됩니다. 특정 경우에, 당신의 코드는 다음과 같아야합니다

public interface Display { 
    public void registerEventListener(Listener aListener) 
    public List getSelectedFiles() 
} 

보기가 인터페이스를 구현하자 :

public class View implements Display{ 
//The method implementations 
} 

을 그리고 모든 필요한 바인딩을

는 디스플레이 inteface을 정의 컨트롤러 :

public class Controller{ 
    private Display view; 
    public Controller(){ 
     //Or use some DI technology 
     this.view = new View(); 
     //Get a Listener implementation, maybe an Anonymous Inner Class 
     this.view.registerEventListener(getListener()); 
    } 

    public void processFiles(){ 
     List files = view.getSelectedFiles(); 
     //Do the processing here 
    } 

} 
0

보기 및 컨트롤러를 올바르게 바인딩하려면 * .asp를 마우스 오른쪽 단추로 클릭하십시오. x 페이지를 선택하고 "컨트롤러로 이동"메뉴를 선택하십시오. 이제 존경받는 컨트롤러에서 다음 구문을 사용하여 메서드를 추가합니다.

public ActionResult viewName() 
{ 
    return view() 
} 

여기서 viewname은 예를 들어보기의 이름입니다. 그것은 aspx 확장명이없는 페이지의 이름입니다. 이제보기를 마우스 오른쪽 버튼으로 클릭하고 "보기로 이동"메뉴를 선택하면 존경받는 페이지로 이동할 것입니다. 그러면보기 및 컨트롤러가 올바르게 묶여 있음을 확인합니다.