商城首页欢迎来到中国正版软件门户

您的位置:首页 >Struts 2 6.2 URL 参数映射方法

Struts 2 6.2 URL 参数映射方法

  发布于2026-04-10 阅读(0)

扫一扫,手机访问

如何在 Struts 2(6.2)中将 URL 路径参数映射到 Action

Struts 2 本身不原生支持 REST 风格的路径参数(如 /save-user.action/name/joe/age/20),但可通过前置 URL 重写过滤器(如 Tuckey URLRewriteFilter)将路径格式转换为标准查询参数格式,再交由 Struts 2 处理。

Struts 2 本身不原生支持 REST 风格的路径参数(如 `/save-user.action/name/joe/age/20`),但可通过前置 URL 重写过滤器(如 Tuckey URLRewriteFilter)将路径格式转换为标准查询参数格式,再交由 Struts 2 处理。

在 Struts 6.2(兼容 Struts 2 约定插件 convention-plugin)中,Action 默认通过 .action 后缀匹配,且参数通常以 ?key=value 查询字符串形式传入。而路径参数(path variables)如 /save-user.action/name/joe/age/20 属于 RESTful 风格,Struts 核心拦截器链无法直接解析该结构——它会在进入 StrutsPrepareAndExecuteFilter 前就因路径不匹配或参数未绑定而失败。

推荐方案:使用 Tuckey URLRewriteFilter 进行预处理
该过滤器需部署在 StrutsPrepareAndExecuteFilter 之前,实现「请求重写」而非「重定向」,确保原始请求上下文(如 HttpServletRequest)中的 request.getRequestURL() 和 getQueryString() 已被改写为 Struts 可识别的形式。

配置步骤如下:

  1. 添加依赖(Maven)

    <dependency>
     <groupId>org.tuckey</groupId>
     <artifactId>urlrewritefilter</artifactId>
     <version>4.0.4</version>
    </dependency>
  2. 配置 web.xml(注意过滤器顺序!)

    <!-- 必须在 Struts 过滤器之前 -->
    <filter>
     <filter-name>UrlRewriteFilter</filter-name>
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    <filter-mapping>
     <filter-name>UrlRewriteFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
struts2org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilterstruts2*.action ```
  1. 定义重写规则(src/main/webapp/WEB-INF/urlrewrite.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
     "https://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
    <urlrewrite>
     <!-- 支持动态多段路径参数:/save-user.action/key1/val1/key2/val2 → /save-user.action?key1=val1&key2=val2 -->
     <rule match-type="regex">
         <from>^/([^.]+\.action)(?:/([^/]+)/([^/]+))*</from>
         <to type="forward">/$1<if-variable name="2" operator="equal" value="">$2=$3</if-variable></to>
     </rule>
    
     <!-- 简化示例:专用于 save-user.action 的固定两段参数 -->
     <rule>
         <from>/save-user.action/name/([^/]+)/age/(\d+)</from>
         <to>/save-user.action?name=$1&amp;age=$2</to>
     </rule>
    </urlrewrite>

⚠️ 注意事项:

  • 正则中使用 &amp; 而非 &,避免 XML 解析错误;
  • 若参数数量不固定,建议采用第一种通用正则 + 自定义 UrlRewriteRule 类扩展逻辑;
  • 所有重写均发生在服务器端(forward),客户端无感知,不影响 Action 中 @Action 注解或 convention-plugin 的自动参数注入;
  • Struts 6.2 默认启用 alwaysSelectFullNamespace,请确保命名空间与重写后 URL 匹配(如 /save-user.action 对应 namespace="" 或 /);
  • 开发阶段可启用 UrlRewriteFilter 调试日志(设置 <init-param><param-name>logLevel</param-name><param-value>DEBUG</param-value></init-param>)验证重写是否生效。

完成配置后,请求 save-user.action/name/joe/age/20 将被静默转为 save-user.action?name=joe&age=20,Struts 2 即可正常绑定至 Action 的 name 和 age 属性(需提供对应 setter 方法),无需修改任何业务代码。此方案轻量、稳定,是 Struts 生态中处理路径参数的事实标准实践。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注