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

如何在Struts 6.2中映射URL路径参数至Action

可以配置Struts 6.2处理带路径参数的.action URL

完全可以实现,通过调整Struts核心配置和Action路由规则,就能解析形如save-user.action/name/joe/age/20的URL并映射到对应Action,以下是具体配置步骤:

1. 开启Struts对斜杠路径的支持

在struts.xml中添加以下常量配置,允许Action路径包含斜杠并正确解析:

<constant name="struts.enable.SlashesInActionNames" value="true" />
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
<constant name="struts.patternMatcher" value="regex" />
  • struts.enable.SlashesInActionNames:允许Action路径中包含斜杠,确保.action后的路径片段能被Struts捕获
  • struts.mapper.alwaysSelectFullNamespace:避免命名空间解析错误,让Struts正确识别Action的完整路径
  • struts.patternMatcher:启用正则表达式匹配模式,支持灵活的路径参数映射

2. 配置Action路由映射

根据参数传递形式,有两种常用配置方式:

方式一:固定参数位置的REST风格映射

如果参数位置固定(如name在前、age在后),可直接在Action配置中指定参数占位符,Struts会自动将路径值注入到Action字段:

XML配置方式

<package name="default" extends="struts-default" namespace="/">
    <action name="save-user.action/{name}/{age}" class="com.yourpackage.SaveUserAction" method="execute">
        <result name="success">/success.jsp</result>
    </action>
</package>

注解配置方式

若使用注解开发,直接在Action类上标注路径参数:

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;

@Action(value = "save-user.action/{name}/{age}", results = @Result(name = "success", location = "/success.jsp"))
public class SaveUserAction extends ActionSupport {
    private String name;
    private int age;

    // 必须提供getter和setter,Struts会自动注入参数值
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    public String execute() {
        // 直接使用name和age参数处理业务逻辑
        return SUCCESS;
    }
}

方式二:灵活解析键值对形式的路径参数

如果参数是键/值/键/值的交替形式且数量不固定,可用通配符捕获全部路径片段,在Action内部手动解析:

XML配置

<package name="default" extends="struts-default" namespace="/">
    <action name="save-user.action/**" class="com.yourpackage.SaveUserAction">
        <result name="success">/success.jsp</result>
    </action>
</package>

Action内部解析逻辑

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.HashMap;
import java.util.Map;

public class SaveUserAction extends ActionSupport {
    public String execute() {
        HttpServletRequest request = ServletActionContext.getRequest();
        String pathInfo = request.getPathInfo(); // 获取.action后的路径片段:/name/joe/age/20
        
        // 分割路径并解析键值对
        String[] parts = pathInfo.split("/");
        Map<String, String> paramMap = new HashMap<>();
        for (int i = 1; i < parts.length; i += 2) {
            if (i + 1 < parts.length) {
                paramMap.put(parts[i], parts[i + 1]);
            }
        }
        
        // 获取参数值
        String name = paramMap.get("name");
        String age = paramMap.get("age");
        
        // 业务逻辑处理
        return SUCCESS;
    }
}

3. 验证Tomcat配置

由于已将*.action正确映射到Struts的DispatcherServlet,Tomcat会将包含.action后缀的完整请求转发给Struts处理,无需额外调整Tomcat的Servlet映射规则。

调用方非浏览器的情况下,只需确保HTTP请求格式合法(如正确的请求方法、无非法字符),Struts即可正常解析参数并处理请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:35