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
相关产品推荐
相关产品推荐

