You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 8中UI间参数传递问题:无法获取UriFragment参数

解决Vaadin 8跨SpringUI传递参数的问题

你遇到的核心问题是:在OrderGUI里设置URI片段后跳转至GetOrderNumber,但目标UI无法获取到这个片段参数。这是因为Vaadin中setUriFragment()只会修改当前UI的URL片段,当你调用setLocation()跳转到全新的SpringUI时,这个片段不会自动被携带到新的URL中。

下面给你几种可行的解决方案,你可以根据需求选择:

方法1:通过查询参数传递(最直观)

直接把orderNumber作为查询参数拼到跳转的URL里,目标UI可以通过请求参数直接获取:

在OrderGUI中修改跳转代码:

String orderNumber = "你的订单号";
// 把参数拼到目标URL的查询字符串中
getUI().getPage().setLocation("orderNumber?orderNumber=" + orderNumber);

在GetOrderNumber的init()方法中获取参数:

@Override
protected void init(VaadinRequest vaadinRequest) {
    // 从请求中获取查询参数
    String orderNumber = vaadinRequest.getParameter("orderNumber");
    // 这里处理你的业务逻辑
}

方法2:通过路径参数传递(更美观的URL)

如果你希望URL更简洁,可以把参数作为路径的一部分:

首先修改GetOrderNumber的@SpringUI路径配置:

@SpringUI(path="orderNumber/{orderNumber}") 
@Title("Order number") 
public class GetOrderNumber extends UI {
    @Override
    protected void init(VaadinRequest vaadinRequest) {
        // 解析URL路径获取参数
        String[] pathSegments = getPage().getLocation().getPath().split("/");
        if (pathSegments.length >= 3) {
            String orderNumber = pathSegments[2];
            // 处理参数逻辑
        }
    }
}

然后在OrderGUI中跳转时拼接路径:

String orderNumber = "你的订单号";
getUI().getPage().setLocation("orderNumber/" + orderNumber);

方法3:通过Vaadin Session传递(不暴露参数在URL)

如果不想把订单号暴露在URL中,可以利用Vaadin的Session来传递:

在OrderGUI跳转前存储参数:

String orderNumber = "你的订单号";
// 把参数存入当前Session
VaadinSession.getCurrent().setAttribute("orderNumber", orderNumber);
getUI().getPage().setLocation("orderNumber");

在GetOrderNumber中取出参数:

@Override
protected void init(VaadinRequest vaadinRequest) {
    // 从Session中获取参数
    String orderNumber = (String) VaadinSession.getCurrent().getAttribute("orderNumber");
    // 记得用完后移除参数,避免Session中残留
    VaadinSession.getCurrent().removeAttribute("orderNumber");
    // 处理业务逻辑
}

额外提示

  • Vaadin 8中每个@SpringUI对应独立的UI实例,它们共享同一个Vaadin Session,但各自拥有独立的Page对象,所以跨UI跳转时,当前UI的URI片段不会自动传递到新UI。
  • 如果使用查询参数或路径参数,建议对参数进行URL编码(比如用URLEncoder.encode()),避免特殊字符导致的URL解析错误。

内容的提问来源于stack exchange,提问作者Michu93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:57:22