2011-03-08 6 views
2

내 수업에서는 MVC 및 MVP와 같은 다양한 디자인에 대해 학습했습니다. 현재 JTable 및 사용자 지정 플롯에 데이터를 표시하는 응용 프로그램을 작성 중입니다. 내 질문은 뷰와 컨트롤러 간의 통신에 대해 어떻게해야 하는가입니다.MVC 뷰 및 컨트롤러 통신 구현. (Java)

예를 들어 파일에서 모델로 데이터를 가져와야하는 버튼이 있습니다. 사용자가 파일을 가져 오려한다는 것을 컨트롤러에 알리는보기가 필요하다고 생각합니다. 그런 다음 컨트롤러는 필요한 로직을 수행합니다. 보기는 그렇게해야합니까? 몇 가지 옵션이 있습니다. 1) 사용자가 가져 오기 버튼을 클릭 할 때마다 호출되는 내부 클래스를 컨트롤러에 생성하게하십시오. 이 경우 컨트롤러는 사용자가 가져 오려는 파일을보기 위해보기의 메소드를 호출해야합니다. 2)보기에서 이벤트를 감지 한 다음 컨트롤러에서 적절한 메서드를 호출하여 파일 이름과 함께 전달하십시오.

이것은 컨트롤러가 컨트롤러에 대해 알고 있는지 여부에 대해 더 큰 질문을합니다. 나는이 것들에 대한 정답이 없다는 것을 알고 있지만 최선의 방법은 무엇인가?

답변

2

아시다시피 컨트롤러 레이어는 대개의 경우보기 레이어와 밀접하게 연결되어 있습니다.

건축가 또는 프로그래머로 참여하는 프로젝트에서 비즈니스 로직을 컨트롤러에 두지 않았습니다. 뷰와 직접 통신하는 레이어를 이식 할 수있는 기술을 본 적이 없기 때문입니다.

컨트롤러 레이어는보기의 서비스 레이어로 작동해야합니다. 그래. 뷰는 컨트롤러에 대해 알아야합니다. 이전 명령문이 true이면 컨트롤러가보기와 통신 할 수있는 아무런 문제가 없습니다.

완전히 POJO 기반 레이어에서 비즈니스 로직 (my @EJB 또는 spring 's @Service)을 디자인합니다. 그것은 내 휴대용 비즈니스 계층입니다.

컨트롤러는보기와 비즈니스 규칙 계층 사이의 다리 일뿐입니다. 비즈니스 메소드를 호출하고 응답을 적절하게 (때로) 형식화 한 다음 다시보기로 보냅니다. 이 컨텍스트에서 컨트롤러는 웹 서비스, 관리되는 bean, 테스트 슈트 등이 될 수 있습니다.

+0

당신은보기가 작업 흐름과 관련하여 더 많은 "리더"라고 말하고 싶습니까? 예를 들어 뷰는 복잡한 계산 결과를 표시해야합니다. 그런 다음 컨트롤러를 호출하여 모델에서 작동하고 결과를 반환합니다. – user650271

+0

전혀 아닙니다. 당신은 "모델"이 단순한 엔티티가 아닌 단일 레이어가 아니라는 것을 이해해야합니다. 모델은 비즈니스 규칙을 구성하는 일련의 구성 요소입니다. 보기는 모델에 대해 몇 가지 작업을 요청합니다. 그것은 확실히 리더십이 아닙니다. 뷰는 작업 흐름을 시작합니다. 컨트롤러를 호출하면 컨트롤러는 "결과가 표시됩니다"라는보기에 응답합니다. – bluefoot

0

어떤 방식 으로든 컨트롤러는 컨트롤러에 대해 알아야합니다. 내 경험에 따르면 GUI (버튼 클릭, 드래그 앤 드랍 등)로 생성 된 이벤트는 사용하는보기 유형에 따라 다르므로보기 자체에서 가장 잘 처리됩니다. 예를 들어 UI는 음성 기반이었습니다. 컨트롤러는 뷰에서 주변에 새보기/변경 일을 추가 할 때마다 컨트롤러를 수정해야 할 것입니다, 당신의 1) 접근 방식

importFile(String filePath) 

같은 API를 노출한다. 2) 접근 방식이 더 좋습니다.

+0

응답 해 주셔서 감사합니다. 그렇다면 복잡한 작업이 컨트롤러에서 이루어져야하며, 쉬운 작업은 뷰에 남아 있어야한다고 생각하십니까? – user650271

+0

그것은 실제로 분할 선이 아닙니다. 모델을 수정하는 것이 무엇이든 컨트롤러에 속합니다. 그래서, "버튼을 클릭 한 사용자"는 속하지 않지만 "사용자가 파일 이름을 입력했습니다"는 않습니다. – iluxa

0

나는 보통, 보기로 청취자 컨트롤러합니다. 이런 식으로 나는 여러 다른 보기를 가질 수 있습니다.컨트롤러입니다. 모든 뷰는 몇 가지 공통 인터페이스를 구현해야합니다. 에서 ~ 컨트롤러보기를 생성자 주입을 사용하여 제공합니다. 그래서 이렇게 smt 수 있습니다

InterfaceWithMethodThatViewCanCall controller = new ConcreteController(new Model); 
SomeView view = new ConcreteSomeView(controller); 
controller.addListener(view); 

또 다른 방법은 통신을 던지 EventBus입니다.MVP 사용 예제 인 GWT에 잠글 것을 권합니다.

* 불행히도이 주제에 대한 좋은 연구 조사는 읽지 않았습니다.

관련 문제