
在web开发中,获取当前http请求的uri(uniform resource identifier)是一项常见需求,例如用于构建动态链接、路径清理或日志记录等。在基于xml的web发布框架apache cocoon中,开发者通常通过其特有的expression language(el)或xsp(extensible server pages)java逻辑块来访问请求相关的信息。然而,对于不熟悉cocoon上下文的开发者来说,获取requesturi可能会遇到一些挑战。
Cocoon环境中的request对象代表了当前的HttpServletRequest实例,它提供了访问HTTP请求的各种属性和方法。理解如何正确地与这个对象交互,是高效开发Cocoon应用的关键。
在尝试获取requestURI时,开发者可能会遇到以下几种常见的误区:
直接使用表达式语言的属性访问:
<jdbp:page-param name="pageToLoad" value="${{request.requestURI}}/../{@page}"/>这种方式在某些上下文中可能有效,但并非总是适用于所有Cocoon EL解析器,特别是当requestURI被视为一个需要方法调用的属性时。虽然request.requestURI看起来像一个属性,但在Java Servlet API中,获取URI的方法是getRequestURI()。
在XSP逻辑块中尝试错误的表达式解析:
<xsp:logic>
  String input2 = evaluate("${{request.requestURI}}", String.class);
  // ...
</xsp:logic>在XSP的<xsp:logic>块中,我们直接编写Java代码。此时,request变量是一个标准的HttpServletRequest对象。尝试使用Cocoon的EL表达式"${{...}}"并结合evaluate函数来获取requestURI是错误的,因为evaluate函数用于解析Cocoon的EL表达式,而不是直接在Java代码中访问Java对象的方法。在Java代码中,应该直接调用对象的方法。此外,错误提示“Type mismatch: cannot convert from Object to String”通常表示evaluate返回的类型与期望的String不匹配,或者在尝试将一个非字符串对象强制转换为字符串时发生。
在Cocoon中,获取requestURI的最直接和正确的方法是利用request对象的getRequestURI()方法。
如果您的环境支持,可以直接在Cocoon的表达式语言中使用方法调用:
<jdbp:page-param name="pageToLoad" value="${{request.getRequestURI()}}/../{@page}"/>说明: 尽管原始问题中request.requestURI的尝试可能在某些旧版或特定配置下表现异常,但标准的、推荐的做法是使用request.getRequestURI()。这确保了您调用的是HttpServletRequest对象上的实际方法,而不是依赖于可能不存在的属性映射。
在<xsp:logic>块中,您可以直接编写Java代码,因此可以直接调用request对象的方法:
<xsp:logic>
  // 获取当前HTTP请求的URI
  String requestUri = request.getRequestURI();
  // 获取页面属性 @page (假设通过XSLT或Sitemap传递)
  // 在XSP逻辑块中,XML元素的属性可以通过 attributes.get("attributeName") 获取
  String pageAttribute = attributes.get("page");
  // 构建完整的路径字符串
  String combinedPath = requestUri;
  if (pageAttribute != null && !pageAttribute.isEmpty()) {
      combinedPath += "/../" + pageAttribute;
  } else {
      combinedPath += "/../"; // 如果@page为空,也需要处理
  }
  // 假设您有一个名为 cleanPath 的Java函数或工具类方法
  // 例如:MyPathUtils.cleanPath(String path)
  String cleanedPath = MyPathUtils.cleanPath(combinedPath);
  // 将处理后的路径放入XSP变量,以便在后续的XML或JSP标签中使用
  putVariable("cleanedPagePath", cleanedPath);
</xsp:logic>
<!-- 在jdbp:page-param中使用处理后的变量 -->
<jdbp:page-param name="pageToLoad" value="${{cleanedPagePath}}"/>代码解析:
import java.net.URI;
// ...
URI uri = new URI(requestUri);
URI resolvedUri = uri.resolve("/../" + pageAttribute); // 示例
String cleanedPath = resolvedUri.normalize().toString();在Apache Cocoon框架中,获取HTTP请求的URI(requestURI)是一个基本而重要的操作。最直接和推荐的方法是利用HttpServletRequest对象的getRequestURI()方法。无论是通过JXSP的表达式语言还是XSP的Java逻辑块,直接调用此方法都能高效地获取所需信息。在进行路径处理时,结合Java的URI处理能力,可以构建出更加健壮和安全的应用程序。理解Cocoon的上下文和Java Servlet API的协作方式,是解决此类问题的关键所在。
以上就是在Cocoon中访问HTTP请求URI的方法的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                 
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                            Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号