1

Struts2 Convention プラグインを使用してアクションをマップします。次の問題を解決するのを手伝ってください。ここにアクションマッピングがあります

@Action(value="/{categorie:\\w+}/{hoofdgroep:\\w+}/{artikelgroep:\\w+}/", results = {
    @Result(name="success", location="articlelist.jsp"),
    @Result(name="maingroup", location="/%{categorie}/%{hoofdgroep}/", type="redirect"),
    @Result(name="category", location="/%{categorie}/", type="redirect")
}, interceptorRefs = {
    ...
})
public String execute() throws Exception {
   ...
   Category category = service.getCategory(categorie);
   if (category == null) return NONE;
   ...
   MainGroup mGroup = service.getMainGroup(hoofdgroep);
   if (mGroup == null) return "category";
   ...
   ArticleGroup artGroup = service.getArticleGroup(artikelgroep);
   if (artGroup == null) return "maingroup";
   ...
   return SUCCESS;
}

たとえば、指定された artikelgroep の artGroup がない場合、link _http://site/categorie/hoofdgroep/artikelgroep/URL_http://site/categorie/hoofdgroep/にリダイレクトする必要がありますが、これは完全に行われます。ここでの唯一の問題は、望ましくない追加のパラメーターも先頭に追加されることです。したがって、 link _http://site/categorie/hoofdgroep/artikelgroep/はにリダイレクトされます_http://site/categorie/hoofdgroep/?categorie=categorie&hoofdgroep=hoofdgroep&artikelgroep=artikelgroep.

私の質問は、これらのパラメーターを取り除く方法ですか?

これが私のstruts.propertiesファイルからのいくつかの設定パラメータです

...
struts.serve.static=false
struts.ognl.allowStaticMethodAccess=true
struts.enable.DynamicMethodInvocation=false
struts.action.extension= ,
struts.url.includeParams=none

struts.enable.SlashesInActionNames=true
struts.mapper.alwaysSelectFullNamespace=false
struts.patternMatcher=regex

struts.convention.default.parent.package=app-default
struts.convention.action.packages=...
struts.convention.action.alwaysMapExecute=false
struts.convention.package.locators.disable=true
struts.convention.relative.result.types=dispatcher
struts.convention.result.path=/WEB-INF/jsp/

基本的にこれはバグですか、それともこのように動作するはずですか?

おそらくそれはそれほどエレガントな解決策ではありませんが、ここで私がやったことです。私はオーバーライドしましたorg.apache.struts2.dispatcher.ServletRedirectResult#getProhibitedResultParams

public class ServletRedirectResult
        extends org.apache.struts2.dispatcher.ServletRedirectResult
{

    public ServletRedirectResult() {
        super();
        initProhibitedResultParams();
    }

    public ServletRedirectResult(String location) {
        super(location);
        initProhibitedResultParams();
    }

    public ServletRedirectResult(String location, String anchor) {
        super(location, anchor);
        initProhibitedResultParams();
    }

    private List<String> prohibitedParamNames;

    private void initProhibitedResultParams() {

        String[] parentParams = (String[])super.getProhibitedResultParams().toArray();
        int len = parentParams.length;
        String[] params = new String[len + 4];
        for (int i = 0; i < len; i++) {
            params[i] = parentParams[i];
        }
        params[len] = "statusCode";

        // TODO: This is a temporary solution because RegexPatternMatcher puts parameters
        // from urls into ResultConfig for some reason.
        params[len+1] = "categorie";
        params[len+2] = "hoofdgroep";
        params[len+3] = "artikelgroep";

        prohibitedParamNames = Arrays.asList(params);
    }

    protected List<String> getProhibitedResultParams() {
        return prohibitedParamNames;
    }
}
4

2 に答える 2

0

のコードを掘り下げていましたorg.apache.struts2.dispatcher.ServletRedirectResult#doExecute。おそらく、この部分は望ましくないパラメータを前に追加します

ResultConfig resultConfig = invocation.getProxy().getConfig().getResults().get(invocation.getResultCode());
if (resultConfig != null)
{
    Map<String, String> resultConfigParams = resultConfig.getParams();

    for (Map.Entry<String, String> e : resultConfigParams.entrySet())
    {
        if (!getProhibitedResultParams().contains(e.getKey()))
        {
            String potentialValue = e.getValue() == null ? "" : conditionalParse(e.getValue(), invocation);
            if (!suppressEmptyParameters || ((potentialValue != null) && (potentialValue.length() > 0)))
            {
                    requestParameters.put(e.getKey(), potentialValue);
            }
        }
    }
}

このコードに問題はありません。問題は、これら 3 つのパラメーターが ResultConfig に表示された理由です。のように動作しているので、そのように書くと

 <result name="maingroup" type="redirect">
     <param name="location">/${categorie}/${hoofdgroep}/</param>
     <param name="namespace">/</param>
     <param name="categorie">${categorie}</param>
     <param name="hoofdgroep">${hoofdgroep}</param>
     <param name="artikelgroep">${artikelgroep}</param>
 </result>
于 2012-03-20T09:14:49.460 に答える
0

あなたが説明するのは、com.opensymphony.xwork2.util.NamedVariablePatternMatcher と org.apache.struts2.util.RegexPatternMatcher の両方のデフォルトの動作ですが、com.opensymphony.xwork2.util.WildcardHelper (デフォルトの実装) の動作ではありません。

あなたが示したことから、デフォルトの実装は、あなたがしていることをはるかに少ない頭痛で処理できます(通常のワイルドカードマッチング)。

このページの参照: http://struts.apache.org/2.3.1.2/docs/wildcard-mappings.html

「名前空間のパラメーター」について述べています(これを使用していないことはわかっています):

Struts 2.1+ から名前空間パターンをリクエスト パラメータとして抽出し、アクションにバインドできます。

ただし、これはアクションで起こっていることにも同様に当てはまり、実際にはそれが唯一の動作のようです (「できる」から、実際には「...名前空間/アクション パターンリクエスト パラメーターとして抽出されます...")、正規表現パターン マッチングにも同様に適用されるようです。ドキュメントでこれをより明示的に記載することをお勧めします。

あなたのコメントから、私はあなたが何をしているのかをよりよく理解できます...

次の 3 つのアクションを簡単に設定してみませんか。

*/*/*, */* and *

次に、番号付きパラメーターをアクションに渡すだけですか?

于 2012-03-20T21:06:12.170 に答える