struts2:由s:url标记生成的默认参数

struts2:由s:url标记生成的默认参数,struts2,Struts2,在struts2中,我们使用 <action name="anAction"> <result name="success">xx.jsp</result> </action> 部分解决了我的问题(只要初始页面有?p=xxx,所有后续链接都会有)。缺点是显而易见的:参数不会跟随重定向操作。我仍在寻找更复杂的解决方案。全局搜索和替换(所有IDE都应具有此功能) 与 现在每个“动作”都有一个值为xxx的参数p 通常最好指定名称空间 &

在struts2中,我们使用

<action name="anAction">
    <result name="success">xx.jsp</result>
</action>
部分解决了我的问题(只要初始页面有?p=xxx,所有后续链接都会有)。缺点是显而易见的:参数不会跟随重定向操作。我仍在寻找更复杂的解决方案。

全局搜索和替换(所有IDE都应具有此功能)



现在每个“动作”都有一个值为xxx的参数p

通常最好指定名称空间

<s:url namespace="/" action="anAction"><s:param name="p" value="'xxx'"/></s:url>

我确实想出了如何做到这一点。这些步骤是:

1) 创建一个实现org.apache.struts2.components.urlenderer的类 2) 向struts对象工厂注册该类,并根据需要注入该类

细节?嗯

1) 例如,ServletUrlRender的子类可能如下所示:

package com.example;

import java.util.Map;

import org.apache.struts2.components.ServletUrlRenderer;
import org.apache.struts2.components.UrlProvider;

public class ParameterInjectingUrlRenderer extends ServletUrlRenderer {

    @Override
    protected void mergeRequestParameters(String value, Map<String, Object> parameters, Map<String, Object> contextParameters) {
       super.mergeRequestParameters(value, parameters, contextParameters);
       parameters.put("myParameter", "secretvalue");
    }
}
<constant name="struts.urlRenderer" value="parameterInjectingUrlRenderer" />
package.com.example;
导入java.util.Map;
导入org.apache.struts2.components.ServletUrlRenderer;
导入org.apache.struts2.components.UrlProvider;
公共类参数InjectingUrlRenderer扩展了ServletUrlRenderer{
@凌驾
受保护的void mergeRequestParameters(字符串值、映射参数、映射上下文参数){
super.mergeRequestParameters(值、参数、上下文参数);
参数。put(“myParameter”、“secretvalue”);
}
}
2) 在struts.xml中,将此类设置为渲染器实现,行如下:

package com.example;

import java.util.Map;

import org.apache.struts2.components.ServletUrlRenderer;
import org.apache.struts2.components.UrlProvider;

public class ParameterInjectingUrlRenderer extends ServletUrlRenderer {

    @Override
    protected void mergeRequestParameters(String value, Map<String, Object> parameters, Map<String, Object> contextParameters) {
       super.mergeRequestParameters(value, parameters, contextParameters);
       parameters.put("myParameter", "secretvalue");
    }
}
<constant name="struts.urlRenderer" value="parameterInjectingUrlRenderer" />

(在本例中,我使用的是一个Spring对象工厂,值引用了一个Springbean id。如果不是,我相信您使用了完全限定的类名)


就这样

?您好,四元数非常感谢您的回复,但是,我需要实现的前提是“不修改现有的s:url标记”。您的方法工作正常,但它要求所有未来的开发人员记住通过ctrl-cv向s:url添加相同的s:param,因此违反了DRY。提供自己的s:url实现可能是唯一的方法。我将创建一个服务,该服务将从数据库中获取您想要添加到url的虚拟值。表字段:id(自动递增)、命名空间、操作、参数名、值。然后为它为特定的namspace/action找到的值粘贴任何参数。如果你解决了,我会投票表决!仅供参考,我希望提供我自己的
实现,这看起来非常痛苦,我相信它不会覆盖s:url,但您可以改为
,这仍然是一个全局搜索和替换。
package com.example;

import java.util.Map;

import org.apache.struts2.components.ServletUrlRenderer;
import org.apache.struts2.components.UrlProvider;

public class ParameterInjectingUrlRenderer extends ServletUrlRenderer {

    @Override
    protected void mergeRequestParameters(String value, Map<String, Object> parameters, Map<String, Object> contextParameters) {
       super.mergeRequestParameters(value, parameters, contextParameters);
       parameters.put("myParameter", "secretvalue");
    }
}
<constant name="struts.urlRenderer" value="parameterInjectingUrlRenderer" />