Vaadin 导航器不适用于 v7.6.7
Vaadin navigator does not work on v7.6.7
11.9.3 中的示例代码 。在 Book of Vaadin 中处理 URI 片段路径在 v7.6.7 上不起作用。它在 v7.6.6 上运行良好。
如何使其工作?
Page.setUriFragmnet 可以做一些类似的任务,但它有另一个问题。
我使用 UriFragmentChangedListener 解决问题。
在视图中,使用 UI.getCurrent().getPage().setUriFragment("string-fragment",true)。一个技巧是使用 ! 作为片段字符串的第一个字符。
以下是视图处理程序的典型格式。
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class AdminView extends VerticalLayout implements View {
static int count = 0;
Label label = null;
public AdminView() {
UI.getCurrent().getPage().addUriFragmentChangedListener(ev -> {
String fragment = ev.getUriFragment();
if(!fragment.startsWith("!admin"))
return;
label.setValue("Admin : " + count + "/" + fragment);
});
setMargin(true);
setSpacing(true);
Button btnAAA = new Button("Admin aaa", e -> {
this.getUI().getPage().setUriFragment("!admin/aaa", true);
});
Button btnBBB = new Button("Admin bbb", e -> {
this.getUI().getPage().setUriFragment("!admin/bbb", true);
});
Button btnQuery = new Button("Goto query", e -> {
TestNavi.navigator.navigateTo("query");
});
label = new Label();
addComponent(btnAAA);
addComponent(btnBBB);
addComponent(btnQuery);
addComponent(label);
}
@Override
public void enter(ViewChangeEvent event) {
System.out.println("Admin ENTER begin:" + event.getParameters());
String v = event.getParameters();
if (v.isEmpty())
label.setValue(++count + " : Admin EMPTY EVENT");
else
label.setValue(++count + " : " + v);
System.out.println("Admin ENTER finish");
}
}
follwing是另外一个视图变化效果测试的视图代码
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class QueryView extends VerticalLayout implements View {
Label label = null;
static int count = 0;
public QueryView() {
setMargin(true);
setSpacing(true);
UI.getCurrent().getPage().addUriFragmentChangedListener(ev -> {
String fragment = ev.getUriFragment();
if(!fragment.startsWith("!query"))
return;
label.setValue("Query : " + count + "/" + fragment);
});
Button btnAAA = new Button("Query aaa", e -> {
this.getUI().getPage().setUriFragment("!query/aaa", true);
});
Button btnBBB = new Button("Query bbb", e -> {
this.getUI().getPage().setUriFragment("!query/bbb", true);
});
Button btnAdmin = new Button("Goto admin", e -> {
TestNavi.navigator.navigateTo("admin");
});
label = new Label();
addComponent(btnAAA);
addComponent(btnBBB);
addComponent(btnAdmin);
addComponent(label);
}
@Override
public void enter(ViewChangeEvent event) {
System.out.println("Query ENTER begin:" + event.getParameters());
String v = event.getParameters();
if (v.isEmpty())
label.setValue(++count + " : Query EMPTY EVENT");
else
label.setValue(++count + " : " + v);
System.out.println("Query ENTER finish");
}
}
Follwing 是定义导航器对象的主要控件UI。
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.UI;
@SuppressWarnings("serial")
@Theme("TestNavi")
@Widgetset("kr.re.nsr.secdiv.inseog.navi.testnavi.WidgeTestNavi")
public class TestNavi extends UI {
public static Navigator navigator = null;
private QueryView qv = null;
private AdminView av = null;
private StartView sv = null;
@Override
protected void init(VaadinRequest vaadinRequest) {
navigator = new Navigator(this, this);
qv = new QueryView();
av = new AdminView();
sv = new StartView();
getPage().setTitle("서인석이 시험중입니다.");
navigator.addView("", sv);
navigator.addView("query", qv);
navigator.addView("admin", av);
}
@WebServlet(urlPatterns = "/*", name = "TestNaviServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = TestNavi.class, productionMode = false)
public static class TestNaviServlet extends VaadinServlet {
}
}
以下是开始查看。
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class StartView extends VerticalLayout implements View {
public StartView() {
setSizeFull();
Button button = new Button("GO to Main View", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
TestNavi.navigator.navigateTo("query");
}
});
addComponent(button);
setComponentAlignment(button, Alignment.MIDDLE_CENTER);
}
@Override
public void enter(ViewChangeEvent event) {
Notification.show("TestNavi");
}
}
解决要点如下
1. 为每个视图添加 URI 片段处理程序。
2. 对于视图内的状态更改,使用 setUriFragment.
3. 对于setUriFragment,不要忘记使用!作为第一个字符.
4. 最后,片段更改处理程序必须检查片段字符串ownership。如果该字符串不是您的,请立即 return。另一个处理程序将执行他们的任务。
这是 Vaadin 7.2.7 版本发布的解决方案。在 v7.6.6. 之前,navigateTo 可以很好地处理单个视图内的状态变化。但是 v7.6.7 navigateTo 不会触发视图内片段更改的输入事件。
Vaadin 有朝一日可能会恢复进入开火逻辑。
11.9.3 中的示例代码 。在 Book of Vaadin 中处理 URI 片段路径在 v7.6.7 上不起作用。它在 v7.6.6 上运行良好。
如何使其工作?
Page.setUriFragmnet 可以做一些类似的任务,但它有另一个问题。
我使用 UriFragmentChangedListener 解决问题。
在视图中,使用 UI.getCurrent().getPage().setUriFragment("string-fragment",true)。一个技巧是使用 ! 作为片段字符串的第一个字符。
以下是视图处理程序的典型格式。
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class AdminView extends VerticalLayout implements View {
static int count = 0;
Label label = null;
public AdminView() {
UI.getCurrent().getPage().addUriFragmentChangedListener(ev -> {
String fragment = ev.getUriFragment();
if(!fragment.startsWith("!admin"))
return;
label.setValue("Admin : " + count + "/" + fragment);
});
setMargin(true);
setSpacing(true);
Button btnAAA = new Button("Admin aaa", e -> {
this.getUI().getPage().setUriFragment("!admin/aaa", true);
});
Button btnBBB = new Button("Admin bbb", e -> {
this.getUI().getPage().setUriFragment("!admin/bbb", true);
});
Button btnQuery = new Button("Goto query", e -> {
TestNavi.navigator.navigateTo("query");
});
label = new Label();
addComponent(btnAAA);
addComponent(btnBBB);
addComponent(btnQuery);
addComponent(label);
}
@Override
public void enter(ViewChangeEvent event) {
System.out.println("Admin ENTER begin:" + event.getParameters());
String v = event.getParameters();
if (v.isEmpty())
label.setValue(++count + " : Admin EMPTY EVENT");
else
label.setValue(++count + " : " + v);
System.out.println("Admin ENTER finish");
}
}
follwing是另外一个视图变化效果测试的视图代码
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class QueryView extends VerticalLayout implements View {
Label label = null;
static int count = 0;
public QueryView() {
setMargin(true);
setSpacing(true);
UI.getCurrent().getPage().addUriFragmentChangedListener(ev -> {
String fragment = ev.getUriFragment();
if(!fragment.startsWith("!query"))
return;
label.setValue("Query : " + count + "/" + fragment);
});
Button btnAAA = new Button("Query aaa", e -> {
this.getUI().getPage().setUriFragment("!query/aaa", true);
});
Button btnBBB = new Button("Query bbb", e -> {
this.getUI().getPage().setUriFragment("!query/bbb", true);
});
Button btnAdmin = new Button("Goto admin", e -> {
TestNavi.navigator.navigateTo("admin");
});
label = new Label();
addComponent(btnAAA);
addComponent(btnBBB);
addComponent(btnAdmin);
addComponent(label);
}
@Override
public void enter(ViewChangeEvent event) {
System.out.println("Query ENTER begin:" + event.getParameters());
String v = event.getParameters();
if (v.isEmpty())
label.setValue(++count + " : Query EMPTY EVENT");
else
label.setValue(++count + " : " + v);
System.out.println("Query ENTER finish");
}
}
Follwing 是定义导航器对象的主要控件UI。
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.UI;
@SuppressWarnings("serial")
@Theme("TestNavi")
@Widgetset("kr.re.nsr.secdiv.inseog.navi.testnavi.WidgeTestNavi")
public class TestNavi extends UI {
public static Navigator navigator = null;
private QueryView qv = null;
private AdminView av = null;
private StartView sv = null;
@Override
protected void init(VaadinRequest vaadinRequest) {
navigator = new Navigator(this, this);
qv = new QueryView();
av = new AdminView();
sv = new StartView();
getPage().setTitle("서인석이 시험중입니다.");
navigator.addView("", sv);
navigator.addView("query", qv);
navigator.addView("admin", av);
}
@WebServlet(urlPatterns = "/*", name = "TestNaviServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = TestNavi.class, productionMode = false)
public static class TestNaviServlet extends VaadinServlet {
}
}
以下是开始查看。
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class StartView extends VerticalLayout implements View {
public StartView() {
setSizeFull();
Button button = new Button("GO to Main View", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
TestNavi.navigator.navigateTo("query");
}
});
addComponent(button);
setComponentAlignment(button, Alignment.MIDDLE_CENTER);
}
@Override
public void enter(ViewChangeEvent event) {
Notification.show("TestNavi");
}
}
解决要点如下
1. 为每个视图添加 URI 片段处理程序。
2. 对于视图内的状态更改,使用 setUriFragment.
3. 对于setUriFragment,不要忘记使用!作为第一个字符.
4. 最后,片段更改处理程序必须检查片段字符串ownership。如果该字符串不是您的,请立即 return。另一个处理程序将执行他们的任务。
这是 Vaadin 7.2.7 版本发布的解决方案。在 v7.6.6. 之前,navigateTo 可以很好地处理单个视图内的状态变化。但是 v7.6.7 navigateTo 不会触发视图内片段更改的输入事件。
Vaadin 有朝一日可能会恢复进入开火逻辑。