Должен/можно ли заставить соглашения Struts 2 забыть о методе execute() действия?

Я делаю первые шаги со Struts 2 и плагином struts2-convention, в настоящее время работаю над класс действий CRUD (SongCrudAction) с некоторыми типичными методами действий create(), edit(), view() и delete(). Все эти методы помечены @Action.

Как правило, я хотел бы унаследовать полезное поведение по умолчанию от ActionSupport, но это также включает в себя наследование метода execute().

Используя браузер конфигурации, я вижу, что есть действие с именем song-crud, указывающее на него. Это действие song-crud устарело, и я хотел бы от него избавиться, так как у меня есть собственные методы действий для всех нужных операций. Я думаю, благодаря соглашениям Struts2 предполагается, что действие song-crud, хотя я нигде его не объявлял.

В этом конкретном случае одним из возможных решений было бы придать разумное значение методу execute(), например. Я мог бы использовать его для операции view(). Недостатком было бы то, что класс действия должен быть переименован (или аннотирован?) в соответствии с поведением метода execute() (например, ViewSongAction вместо SongCrudAction). В противном случае URL-адрес действия просмотра будет неуместным (например, /view-song?id=5 подойдет лучше, чем /song-crud?id=5).

С другой стороны, переименование класса тоже было бы некрасиво, потому что это всего лишь CRUD, а не класс действий просмотра.

В любом случае, общая проблема остается: всякий раз, когда я наследую от ActionSupport, он предоставляет мне метод execute(), который может или не может быть полезен для того, что я делаю.

Итак, кажется разумным каким-то образом сообщить Struts 2, чтобы он в исключительных случаях забыл о методе execute() в моем классе действий CRUD. Так ли это, и как я могу этого добиться? Есть ли лучшее решение?


person user1992821    schedule 07.03.2013    source источник
comment
Какой метод execute вы хотите забыть?   -  person Roman C    schedule 07.03.2013
comment
SongCrudAction.execute() унаследован от ActionSupport и не должен отображаться как song-crud.action в браузере конфигурации.   -  person user1992821    schedule 07.03.2013
comment
если вы расширяете ActionSuppost, вам следует переопределить метод execute.   -  person Roman C    schedule 07.03.2013
comment
Хорошо, но это означало бы... придать какой-то разумный смысл... (см. выше) с недостатками, как описано, верно?   -  person user1992821    schedule 07.03.2013
comment
Спасибо, Роман С. Кажется, это распространенный подход к использованию метода execute() в контексте Post-Back Default, как я узнал здесь: struts.apache.org/release/2.2.x/docs/.   -  person user1992821    schedule 07.03.2013


Ответы (1)


Метод execute будет работать по умолчанию, если вы не укажете атрибут method в конфигурации действия. И если вы не используете DMI для запуска ваши методы. ActionSupport уже реализован метод execute, так как он реализовал интерфейс Action . Но заметка, которая появляется с восклицательным изображением ниже, выглядит действительно странно.

Если в конфигурации нет метода выполнения и другого метода, указанного в конфигурации, фреймворк выдаст исключение.

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

person Roman C    schedule 07.03.2013
comment
Ну, на самом деле я пытался опустить struts.xml и вместо этого использовать соглашения + аннотации. При использовании конфигурации XML, я думаю, это другая история. В этом случае должно быть легко предотвратить вызов унаследованного метода execute(): я мог бы просто объявить все свои действия CRUD с явным именем метода (кроме execute), так как я мог вызвать execute() тогда ? Однако при использовании соглашений + аннотаций вызываемые действия автоматически выводятся из того, что есть, и возникает вопрос, есть ли способ опустить некоторые из них. - person user1992821; 07.03.2013
comment
Независимо от того, как вы создаете конфигурацию своих действий с помощью XML или аннотаций, если вы опускаете явное объявление метода, метод выполнения будет вызываться, если у вас нет такого метода, тогда будет выдано исключение, как указано выше. Если вы хотите предотвратить выполнение метода, лучше всего использовать абстрактное действие, которое расширяет ActionSupport, которое переопределяет метод выполнения с помощью String execute(){return ERROR;}. Но я не рекомендую этого делать. При выполнении вам не требуется явно определять методы. - person Roman C; 07.03.2013
comment
Хорошо, большое спасибо. Думаю, я просто буду использовать упомянутый выше шаблон Post-Back Default, чтобы использовать метод execute, поэтому нет необходимости его как-то скрывать или отключать. - person user1992821; 07.03.2013