Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 瓦丁:我怎样才能得到URL参数?_Java_Vaadin - Fatal编程技术网

Java 瓦丁:我怎样才能得到URL参数?

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

我一直在尝试使用Vaadin从项目中的url获取参数,但它似乎无法正常工作。我遵循了vaadin文档中的说明,但参数设置不正确。routerlink使用参数(例如localhost:8080/banner/g50)正确导航,但在新视图中没有正确设置变量

@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上的锁。你