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

如何在Java函数中获取Cocoon的requestURI并调用cleanPath函数

老旧Cocoon代码路径处理问题解决

一、现成解决方案的文档参考

Cocoon相关功能的官方归档文档里,优先看XSP Developer Guide和JDBP Reference,这些文档在Cocoon 2.1/2.2等历史版本的官方归档中可查,里面详细说明了变量引用、函数调用和XSP逻辑块的正确用法。

二、两种尝试的修正方案

1. 直接在jdbp:page-param中调用函数的正确写法

原写法的问题在于字符串拼接和函数调用的语法不符合Cocoon EL规范,修正后:

<jdbp:page-param name="pageToLoad" value="${cleanPath(concat(request.requestURI, '/../', @page))}"/>

要点:

  • 用Cocoon内置的concat()函数拼接字符串,不能直接用/../连接变量
  • 确保cleanPath函数已在XSP的<xsp:functions>块中声明,或者全局函数库已注册该函数

2. XSP逻辑块的修正

原代码有两个核心问题:evaluate返回Object需强制转换,且逻辑块中不能嵌套XSL标签。修正后的代码:

<xsp:logic>
  // 直接获取requestURI,强制转换为String
  String requestURI = (String) evaluate("${request.requestURI}", Object.class);
  // 通过evaluate获取@page属性值
  String page = (String) evaluate("${@page}", Object.class);
  // 拼接路径并调用cleanPath
  String cleanedPath = (String) evaluate("cleanPath('" + requestURI + "/../" + page + "')", Object.class);
  putVariable("pageToLoad", cleanedPath);
</xsp:logic>
<jdbp:page-param name="pageToLoad" value="${pageToLoad}"/>

如果cleanPath是自定义Java工具类的静态方法,也可以直接调用,不用evaluate:

<xsp:logic>
  String requestURI = request.getRequestURI();
  String page = (String) evaluate("${@page}", Object.class);
  String cleanedPath = com.your.utils.PathUtils.cleanPath(requestURI + "/../" + page);
  putVariable("pageToLoad", cleanedPath);
</xsp:logic>

三、额外建议

  • Cocoon内置了org.apache.cocoon.util.URIUtils工具类,其中的normalize()方法可以直接处理路径跳转,无需自己实现cleanPath,更可靠
  • 确保request对象在当前上下文可用,Cocoon中request是内置对象,直接调用request.getRequestURI()比evaluate更高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:05:15