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

