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