[SPRING] Vaadin : 데이터를 변경하기위한 UI 참조 얻기
SPRINGVaadin : 데이터를 변경하기위한 UI 참조 얻기
Vaadin UI 내부에서 데이터를 변경하고 싶습니다. 변경은 a 나머지 호출에 의해 호출됩니다. 저기, 어떻게 든 그 메서드를 호출하는 UI 클래스에 대한 참조가 필요합니다 '. changeValue (문자열 값).
vaadin-spring-boot-startter 1.0.0을 사용하고 있습니다.
어떻게 든 가능합니까?
수정 : 다른 질문은 지금 : 뷰 내부에서 @Eric이 언급 한 서버 푸시를 수행하려고 했으므로 뷰가 브로드 캐스트 메시지로 업데이트됩니다. 그러나 이것은 작동하지 않습니다 (예외는 없으며, 디버깅 할 것도없고 뷰의 업데이트도 없음). 이것은 내보기에서 무엇입니까 :
@UIScope
@SpringView(name = LoadWebsiteView.VIEW_NAME)
@Push
public class LoadWebsiteView extends VerticalLayout implements View, Broadcaster.BroadcastListener {
...
@Autowired
public LoadWebsiteView(ScraperMainUI scraperMainUi) {
this.scraperMainUi = scraperMainUi;
Broadcaster.register(this);
initControlPane();
}
@Override
public void receiveBroadcast(String message) {
scraperMainUi.access(new Runnable() {
@Override
public void run() {
urlTxtField.setValue(message);
}
});
}
여기 내 restcontroller에서하는 간단한 것들이 있습니다 :
Broadcaster.broadcast(text);
해결법
-
==============================
1.당신이 찾고있는 것은 Vaadin의 Push 기능과 등록 된 "클라이언트"목록에 메시지를 보내는 방법입니다 (이 경우 변경 사항을 알 필요가있는 Vaadin UI).
당신이 찾고있는 것은 Vaadin의 Push 기능과 등록 된 "클라이언트"목록에 메시지를 보내는 방법입니다 (이 경우 변경 사항을 알 필요가있는 Vaadin UI).
Vaadin Push에 대한 자세한 내용은 다음을 참조하십시오. Server Push 활성화 및 Advanced Push 문서
Vaadin 푸시 기능을 사용하면 브라우저에서 다시 요청하기 위해 기다리지 않고 서버가 클라이언트를 강제로 업데이트 할 수 있습니다.
메시지 구성 요소는 구독 된 UI에 조치가 필요한 업데이트가 있음을 알리는 방법으로 작동합니다.
이 말은 여러 사용자가 작업 항목을 다루는 것과 거의 같은 일을하는 프로젝트가 있고 사용자가 알아야 할 변경 사항을 적용 할 수있는 Spring 예약 작업이 있다는 것입니다.
아래의 예는 Server Push Enabling 문서에서 사용 가능한 예제를 기반으로합니다.
Broadcaster.java - 인스턴스를 등록하여 브로드 캐스트를 수신하고 브로드 캐스트를 전송하는 기능을 제공하는 메커니즘으로 작동합니다. 아래 예제에서, 나는 메시지 (BroadcastMessage)를 나타내는 클래스를 가지고 있지만 물론 그것을 단순화 할 수있다.
public class Broadcaster implements Serializable { private static final long serialVersionUID = 3540459607283346649L; static ExecutorService executorService = Executors.newSingleThreadExecutor(); private static LinkedList<BroadcastListener> listeners = new LinkedList<BroadcastListener>(); public interface BroadcastListener { void receiveBroadcast(BroadcastMessage message); } public static synchronized void register(BroadcastListener listener) { listeners.add(listener); } public static synchronized void unregister(BroadcastListener listener) { listeners.remove(listener); } public static synchronized void broadcast(final BroadcastMessage message) { for (final BroadcastListener listener: listeners) executorService.execute(new Runnable() { @Override public void run() { listener.receiveBroadcast(message); } }); } }
다음은 BroadcastMessage에 정의 된 클래스입니다. 아이디어는 내가 가지고있는 메시지의 종류와 맵의 형태로 일부 페이로드를 나타내는 방법을 갖는 것입니다.
public class BroadcastMessage implements Serializable { private static final long serialVersionUID = 5637577096751222106L; public BroadcastMessageType messageType; public Map<String, String> params; public BroadcastMessage() { } public BroadcastMessage(BroadcastMessageType messageType) { this.messageType = messageType; this.params = new HashMap<String, String>(); } public BroadcastMessage(BroadcastMessageType messageType, Map<String, String> params) { this.messageType = messageType; this.params = params; } public BroadcastMessageType getMessageType() { return messageType; } public void setMessageType(BroadcastMessageType messageType) { this.messageType = messageType; } public Map<String, String> getParams() { return params; } public void setParams(Map<String, String> params) { this.params = params; } }
이것은 브로드 캐스트를 청취하려는 예제 Vaadin UI입니다. @Push 주석을 주목하십시오. 이 옵션이 없으면 클라이언트는 브라우저가 결정할 때만 새로 고칩니다. @Push로 바로 처리 **
@SpringComponent @UIScope @Push @SpringView(name=TaskListComponent.NAME) public class TaskListComponent extends MyCustomComponent implements Broadcaster.BroadcastListener, View { /** PRUNED DOWN, TO DEMONSTRATE THE KEY CODE **/ // Register this window when we enter it @Override public void enter(ViewChangeEvent event) { Broadcaster.register(this); } // Must also unregister when the UI expires @Override public void detach() { Broadcaster.unregister(this); super.detach(); } // Receive a broadcast @Override public void receiveBroadcast(BroadcastMessage message) { getUI().access(new Runnable() { @Override public void run() { // DO WHATEVER YOU NEED TO DO HERE. // I CALLED INITIALIZE BUT IT COULD BE // JUST YOU FIELD UPDATE if ( message.getMessageType().equals(BroadcastMessageType.REFRESH_TASK_LIST) ) initialize(); } }); } }
나머지 인터페이스에서 메시지를 보내려면 다음을 수행하십시오.
Broadcaster.broadcast( new BroadcastMessage( BroadcastMessageType.AUTO_REFRESH_LIST ) );
희망이 도움이! :)
from https://stackoverflow.com/questions/39532142/vaadin-get-reference-of-ui-to-change-data by cc-by-sa and MIT license