Java 瓦丁:我怎样才能得到URL参数?
我一直在尝试使用Vaadin从项目中的url获取参数,但它似乎无法正常工作。我遵循了vaadin文档中的说明,但参数设置不正确。routerlink使用参数(例如localhost:8080/banner/g50)正确导航,但在新视图中没有正确设置变量Java 瓦丁:我怎样才能得到URL参数?,java,vaadin,Java,Vaadin,我一直在尝试使用Vaadin从项目中的url获取参数,但它似乎无法正常工作。我遵循了vaadin文档中的说明,但参数设置不正确。routerlink使用参数(例如localhost:8080/banner/g50)正确导航,但在新视图中没有正确设置变量 @Route(value = "banner", layout = MainLayout.class) @PageTitle("Banner") public class BannerView extends VerticalLayout imp
@Route(value = "banner", layout = MainLayout.class)
@PageTitle("Banner")
public class BannerView extends VerticalLayout implements HasUrlParameter<String> {
private String ID;
...
编辑:
这是我的构造函数
public BannerView(BannerService bannerService, GameService gameService) {
this.bannerService = bannerService;
this.gameService = gameService;
addClassName("banner-view");
setDefaultHorizontalComponentAlignment(Alignment.CENTER);
//span just added for testing purposes
Span test = new Span("+" + ID + "+");
add(getBannerCount(), getDataChart(), getAverageStats(), test);
}
ID用于我用来添加组件的三种方法(返回跨度、垂直布局和图表)。我尝试将添加组件放在带有click listener事件的按钮中,以便在构造函数按照建议的注释完成运行后单击按钮添加组件,但结果出现异常:java.io.InvalidClassException:local class Compatible:。add在构造函数中正确运行,具有用于测试的硬编码id这只是我的猜测,但是您是否在构造函数中使用了
id
值
setParameter
方法将在构造函数之后调用,因此该值将分别为null
。正如在评论中已经注意到的那样,您的代码似乎是正确的(除了将RouterLink强制转换为Router,但这是一个编译错误),因此您可以添加更多关于如何以及在何处使用ID
:)的详细信息吗
编辑
实际上,您正在使用构造函数中的
ID
值,因此将逻辑移到一个单独的方法,该方法将从setParameter
调用。无需使用推送(异步更新UI)
比如:
@覆盖
公共void setParameter(BeforeEvent事件,字符串参数){
ID=参数;
addSpanToUI();
}
私有无效addSpanToUI(){
Span test=新Span(“+”+ID+“+”);
//根据您的评论,假设每个方法都依赖于id
添加(getBannerCount()、getDataChart()、getAverageStats()、test);
}
公共BannerView(BannerService BannerService、GameService GameService){
this.banner服务=banner服务;
this.gameService=gameService;
addClassName(“横幅视图”);
setDefaultHorizontalComponentAlignment(Alignment.CENTER);
}
这只是我的猜测,但您是否在构造函数中使用您的ID
值
setParameter
方法将在构造函数之后调用,因此该值将分别为null
。正如在评论中已经注意到的那样,您的代码似乎是正确的(除了将RouterLink强制转换为Router,但这是一个编译错误),因此您可以添加更多关于如何以及在何处使用ID
:)的详细信息吗
编辑
实际上,您正在使用构造函数中的
ID
值,因此将逻辑移到一个单独的方法,该方法将从setParameter
调用。无需使用推送(异步更新UI)
比如:
@覆盖
公共void setParameter(BeforeEvent事件,字符串参数){
ID=参数;
addSpanToUI();
}
私有无效addSpanToUI(){
Span test=新Span(“+”+ID+“+”);
//根据您的评论,假设每个方法都依赖于id
添加(getBannerCount()、getDataChart()、getAverageStats()、test);
}
公共BannerView(BannerService BannerService、GameService GameService){
this.banner服务=banner服务;
this.gameService=gameService;
addClassName(“横幅视图”);
setDefaultHorizontalComponentAlignment(Alignment.CENTER);
}
获取参数的方法是正确的
调用构造函数后将显示html页面
setParameter
方法在构造函数之后调用,因此确实设置了ID字段,但ui不会随着更改而更新
为了对组件执行ui更新,您应该调用ui.getCurrent().access()
:
确保不要在access()中运行长时间运行的操作,因为这会使浏览器无响应
另一方面,如果您需要在视图之间传递数据,那么我建议您使用事件总线。因为url参数将以ascii编码字符串的形式出现,还因为它允许共享对象
可以用这种方式从任何视图设置数据
String greetingFromView1 = "Hello world";
ComponentUtil.setData(UI.getCurrent(), "greeting", greetingFromView1);
String greetingFromView2 = (String)ComponentUtil.getData(UI.getCurrent(), "greeting");
之后,您可以通过这种方式从任何视图获取数据
String greetingFromView1 = "Hello world";
ComponentUtil.setData(UI.getCurrent(), "greeting", greetingFromView1);
String greetingFromView2 = (String)ComponentUtil.getData(UI.getCurrent(), "greeting");
获取参数的方式是正确的
调用构造函数后将显示html页面
setParameter
方法在构造函数之后调用,因此确实设置了ID字段,但ui不会随着更改而更新
为了对组件执行ui更新,您应该调用ui.getCurrent().access()
:
确保不要在access()中运行长时间运行的操作,因为这会使浏览器无响应
另一方面,如果您需要在视图之间传递数据,那么我建议您使用事件总线。因为url参数将以ascii编码字符串的形式出现,还因为它允许共享对象
可以用这种方式从任何视图设置数据
String greetingFromView1 = "Hello world";
ComponentUtil.setData(UI.getCurrent(), "greeting", greetingFromView1);
String greetingFromView2 = (String)ComponentUtil.getData(UI.getCurrent(), "greeting");
之后,您可以通过这种方式从任何视图获取数据
String greetingFromView1 = "Hello world";
ComponentUtil.setData(UI.getCurrent(), "greeting", greetingFromView1);
String greetingFromView2 = (String)ComponentUtil.getData(UI.getCurrent(), "greeting");
欢迎使用SO,您的代码是正确的,您如何验证是否设置了私有字符串ID?如果设置了ID,则生成的图表不同。同样,您的代码是正确的,您如何验证是否设置了私有字符串ID?如果设置了ID,则生成的图表是正确的different@yradwan,更新了代码段。您需要重构代码:)@yradwan,更新了代码片段。您需要重构代码:)您不需要在setParameter
中访问UI上的锁。你