2012-03-19 3 views
1

Я использую плагин Struts2 Convention для сопоставления своих действий. Пожалуйста, помогите мне решить следующую проблему. Здесь у меня есть привязки действияПараметры Struts2 и параметры перенаправления

@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; 
} 

Когда, например, нет artGroup для указанного artikelgroep он должен перенаправить link _http://site/categorie/hoofdgroep/artikelgroep/ к URL _http://site/categorie/hoofdgroep/ который он отлично делает. Единственная проблема здесь в том, что она также добавляет дополнительные параметры, которые нежелательны. Поэтому ссылка _ 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; 
    } 
} 
+0

Вы можете передать эти значения в действие, составить нужную строку местоположения и вместо этого ссылаться на эту новую строку. Вы думали о том, чтобы превратить эту функциональность в перехватчик, как только вы ее заработаете? – Quaternion

+0

Я никогда не видел такого заявления @Action, как раньше. Может кто-нибудь объяснить (или указать мне на какую-то документацию), что @Action (value = "/ {category: \\ w +}/{hoofdgroep: \\ w +}/{artikelgroep: \\ w +} /" на самом деле означает – user497087

+0

To @ user497087 Вы можете писать так, когда используете [шаблон шаблона регулярных выражений] (http://struts.apache.org/2.3.1.2/docs/wildcard-mappings.html) (struts.patternMatcher = regex) плюс [Контекстный плагин] (http://struts.apache.org/2.3.1.2/docs/convention-plugin.html) – user1278890

ответ

0

То, что вы описываете поведение по умолчанию как com.opensymphony.xwork2.util.NamedVariablePatternMatcher и org.apache.struts2.util.RegexPatternMatcher однако это не поведение com.opensymphony.xwork2.util.WildcardHelper (которое является реализацией по умолчанию)

От того, что вы показали, реализация по умолчанию может обрабатывать то, что вы делаете, с гораздо меньшими головными болями (регулярное сопоставление подстановочных знаков).

Consulting этой страница: http://struts.apache.org/2.3.1.2/docs/wildcard-mappings.html

Это говорится для «Параметров в пространствах имен» (я знаю, что вы не используете это):

От Struts 2.1+ структура пространства имен может быть извлечена как запрос параметры и связаны с действием.

Однако это в равной мере относится к тому, что происходит в действии, и это действительно кажется единственным поведением (где я бы предположил, что «может быть», что будет другой выбор, когда он должен был быть действительно написан как «... namespace/action patterns - это, извлеченные как параметры запроса ...»), и, похоже, это применимо к шаблону регулярного выражения, равному поровну, было бы неплохо, если бы в документации было явно указано это.

Из ваших комментариев я могу лучше понять, что вы делаете ...

Почему вы просто не созданы три действия для:

*/*/*, */* and * 

Тогда просто передать пронумерованные параметры в действии?

+0

Большое спасибо за ваш ответ. Объяснение в разделе «Параметры в пространствах имен» остается для меня неясным. До тех пор вы сказали, что «то, что вы описываете, является поведением по умолчанию как com.opensymphony.xwork2.util.NamedVariablePatternMatcher ...», так и для активации «Параметры в пространствах имен» мы должны установить struts.patternMatcher = namedVariable. Действительно, я могу управлять картированием действий с параметрами */*/*, */*, * и нумерованными, но я не знаю, как это будет работать, потому что у меня также есть URL-адреса, такие как «/ customer/passrestore/forgetPassword» и «/ customer/registerCustomer. Будут ли какие-то конфликты? – user1278890

+0

В любом случае это правильное поведение для NamedVariablePatternMatcher и RegexPatternMatcher? Если они определяют некоторые параметры в настройке действия wile, создавая '@Action (значение ="/{категори: \\ w +}/{hoofdgroep: \\ w +}/{artikelgroep: \\ w +}/"...' отображение, они должны объявляется на уровне Action не на уровне результата, например, они должны присутствовать в invocation.getProxy(). getConfig(). getParams(), но не в ResultConfig # getParams(). Но, возможно, я ошибаюсь. Выбрали решение, переопределив «ServletRedirectResult # getProhibitedResultParams» и добавив эти параметры для исключения. – user1278890

+0

Не должно быть конфликта между _ */*/* _ и _ */* _ ... Я говорю, что используйте значение по умолчанию, а не параметры имени или регулярного выражения. – Quaternion

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); 
      } 
     } 
    } 
} 

С этим кодом нет ничего плохого. И вопрос в том, почему эти три параметра появились в 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> 
Смежные вопросы