通常のaction(executeメソッド呼び出し)とrestfulなactionを呼び分けたい場合があります。そんなときはPrefixBasedActionMapperを使おう、とうい話。
RESTを有効にするためstruts.xmlに以下の記述を行うと通常のactionもRESTとして動作するようになります。
1 |
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper" /> |
呼ぶactionによって通常のActionMapper(DefaultActionMapper)とRestful2ActionMapperを呼び分けたいのですが、このような場合はPrefixBasedActionMapperを使用することでURLの内容から使用するActionMapperを切り替えることがでる。
1 2 |
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" /> <constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/> |
上記の例はREST plugin使用時においてDefaultActionMapperとRestful2ActionMapperを切り替える場合。他にもたくさん切り替えたい場合は3つ4つと設定すればいい。
REST/non-RESTを混在させるためにはこの他に以下の設定も必要。
1 2 3 4 5 6 |
<constant name="struts.action.extension" value="xhtml,,xml,json,action"/> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.default.parent.package" value="rest-default"/> <constant name="struts.convention.package.locators" value="example"/> |
下3つは実装する環境に合わせて変更すればいい。suffixはControllerでなくてもよいし、interceptionを追加したい場合はpackageを作るだろうし。
特定のpackage(クラスパス)以下のみを対象にしたい場合はstruts.convention.package.locators.basePackageを設定する方法もある。packageに関する設定項目は以下4つ。いずれもconventionの持ち物。
- struts.convention.action.packages
- struts.convention.package.locators
- struts.convention.package.locators.basePackage
- struts.convention.exclude.packages
それと、今回参考にしたサイト。
- REST Plugin – REST and non-RESTful URL’s Together Configuration
- Convention Plugin – Configuration reference
- ActionMapper – PrefixBasedActionMapper
Stackoverflowのここも参考になるので載せておきます。
Struts2を触り始めて1週間?2週間ぐらいですが、感じたことを少しばかり。
かれこれ長いことstrtus1を使い続けていたのですんなりstruts2も使いこなせるだろうと高を括っていました。struts1とは異なる点が多々あり足踏みをすることが多かったように思います。1)もしかするとstruts1にどっぷりだったからこそかもしれませんね。大まかな流れさえわかってしまえば学習曲線も上がるのですんなり身に入りそうな気がしています。
ではでは。
References
1. | ↑ | もしかするとstruts1にどっぷりだったからこそかもしれませんね。 |