在struts2中我们使用
<action name="anAction">
<result name="success">xx.jsp</result>
</action>
定义操作,并使用s:url生成指向操作的链接
<s:url action="anAction"></s:url>
以上s:url将输出“/anAction.do”。
我想知道是否可以让s:url
为所有链接生成默认网址参数(即/anAction.do?p=xxx
),而无需修改现有的s:url
标记(有很多并且它们分散)。目标是让参数出现在链接中以供SEO使用。
可用选项可以是:更改任何操作配置,更改任何struts配置,甚至重写s:url
生成类。
修改:我发现将其添加到struts.xml
<constant name="struts.url.includeParams" value="get" />
部分解决了我的问题(只要初始页面有?p = xxx,所有后续链接都会有它)。缺点是显而易见的:参数不会遵循重定向动作。我仍在寻找更复杂的解决方案。
答案 0 :(得分:0)
全局搜索和替换(所有IDE应具有此功能)
<s:url action="anAction"></s:url>
使用
<s:url action="anAction"><s:param name="p" value="'xxx'"/></s:url>
现在每个“anAction”都有一个值为xxx的参数p。
通常最好指定命名空间。
<s:url namespace="/" action="anAction"><s:param name="p" value="'xxx'"/></s:url>
答案 1 :(得分:0)
我确实弄清楚如何做到这一点。步骤是:
1)创建一个实现org.apache.struts2.components.UrlRenderer的类 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");
}
}
2)在struts.xml中,将此类设置为渲染器实现,其行如下所示:
<constant name="struts.urlRenderer" value="parameterInjectingUrlRenderer" />
(在这个例子中我使用的是Spring对象工厂,值引用了一个spring bean id。如果你不是,我相信你把完全限定的类名称。)
就是这样!