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

