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

时间:2011-07-22 04:08:01

标签: struts2

在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,所有后续链接都会有它)。缺点是显而易见的:参数不会遵循重定向动作。我仍在寻找更复杂的解决方案。

2 个答案:

答案 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。如果你不是,我相信你把完全限定的类名称。)

就是这样!