Struts 2: передача массива строк в качестве статического параметра

Я хотел объявить действие таким образом, чтобы я мог передать String массив статических параметров. Я попробовал следующий код:

<action name="saveRecord" class="saveRecordAction">
        <result name="success" type="tiles">tiles:saveRecordSuccess</result>
        <param name="names">name1</param>
        <param name="names">name2</param>
        <param name="names">name3</param>
    </action>

У меня есть сеттер в моем классе действий:

public void setNames(String[] name){
    mNames = name;
}

Но я получаю только одно имя, последнее, "name3"

Возможно ли то, что я хотел? если да, то как правильно это сделать?


person Macchiato    schedule 23.01.2013    source источник


Ответы (5)


Статический параметр struts работает как MAP. имя было КЛЮЧОМ, а значение - ЗНАЧЕНИЕМ. Вы можете выполнить свое требование, отправив значения через запятую, и вы можете разделить их, чтобы у вас был свой массив.

<param name="names">name1,name2,name3</param>

Для получения дополнительной информации на статических параметрах

person Raja Asthana    schedule 23.01.2013
comment
Извините, я удалил свой комментарий, потому что думал, что он автоматически разделится на массив. Сначала я подумал об этом решении, но если есть законное решение, было бы лучше. Я все еще жду кого-то, кто может знать ответ, если нет, я вернусь к этому. - person Macchiato; 23.01.2013
comment
@Macchiato Как насчет моего ответа? - person Roman C; 08.03.2018

Статические параметры AFAIK преобразуются в строку, поэтому различные перехватчики (например, FileUploadInterceptor) используют статический метод commaDelimitedStringToSet из TextParseUtil для преобразования String в Set<String>. Вы можете вызвать этот метод внутри сеттера для вашего свойства.

public void setNames(String name) {
    mNames = TextParseUtil.commaDelimitedStringToSet(name);
}
person Aleksandr M    schedule 23.01.2013

Попробуй это

    <action name="saveRecord" class="saveRecordAction">
            <result name="success" type="tiles">tiles:saveRecordSuccess</result>
            <param name="names" value="new java.lang.String[]{'name1', 'name2', 'name3'}"></param>

</action>
person NPKR    schedule 23.01.2013
comment
Спасибо за быстрый ответ, но этот код не работает. Он дал мне массив с одним значением new java.lang.String[]{'name1', 'name2', 'name3'}, который не разбивается на массив из 3 элементов. - person Macchiato; 23.01.2013

попробуйте имена [] вместо имен

 <action name="saveRecord" class="saveRecordAction">
            <result name="success" type="tiles">tiles:saveRecordSuccess</result>
            <param name="names[]">name1</param>
            <param name="names[]">name2</param>
            <param name="names[]">name3</param>
        </action>
person atom217    schedule 05.08.2013

Статические параметры, обрабатываемые staticParams перехватчиком через конфигурацию действия где параметры определены как Map<String,String>.

Для правильного использования статических параметров в конфигурации действия вы должны включить ссылку на перехватчик staticParams или использовать файл defaultStack.

<interceptor-ref name="staticParams">
      <param name="parse">true</param>
      <param name="overwrite">false</param>    
</interceptor-ref>

Вы также включили setParams(Map<String,String> params) в действие, чтобы перехватчик установил значения параметров. Используйте разные ключи name1, name2, name3 в вашем случае для получения значений карты. Вы также можете попробовать свойство overwrite (не задокументировано) для статических параметров, чтобы не перезаписывать значение с тем же ключом.

Вы можете увидеть пример использования статических параметров в конфигурации действия: Настроить статический параметр для класса Action

person Roman C    schedule 23.01.2013