SeamFramework.orgCommunity Documentation
SeamはJSFに替わるプレゼンテーション層のための手段としてWicketをサポートします。Seam上で動作するwicket
の例を見ていくことにしましょう。例は予約サンプルをWicketに移行させたものです。
WicketサポートはSeamにとって新しいものであり、それゆえJSFを使って実現可能ないくつかの機能を、Wicketを使ってまだ実現することができません(例えば、ページフロー)。またドキュメントはJSFを想定して書かれているため、Wicketサポートを使いこなすためには、ドキュメントの読み替えが必要になってくることに気づかれることでしょう。
Wicketサポートが提供する機能は、バイジェクションとオーケストレーションの二つに分類されます。これらについては、後で詳細に説明します。
Wicketアプリケーションを作成する際、通常、内部クラスを多用することになります。このような場合、コンポーネント木はコンストラクタ内で構築されることになります。Seamは内部クラスやコンストラクタ内でのアノテーションを用いた制御を完全にサポートします(通常のSeamコンポーネントとは異なります)。
アノテーションはすべての親クラスに対する呼び出しが終わった後で動作します。これは、this()
やsuper()
の中ではいかなる属性もインジェクションされていないということを意味します。
この点については改善を行っているところです。
内部クラスにおいてメソッドの呼び出しが行われる際、その内部クラスを内包するすべてのクラスでバイジェクションが行われます。これによって、バイジェクションのための変数をクラスに宣言しておいて、その内部クラスからバイジェクションされた変数を参照することが可能となります。
Seam上で動作するWicketアプリケーションでは、すべての標準的なSeamコンテキスト(EVENT
、CONVERSATION
、SESSION
、APPLICATION
、BUSINESS_PROCESS
)を完全に操作することが可能です。
WicketからSeamコンポーネントを操作するためにすることは、@In
を使ってインジェクションを行うことだけです。
@In(create=true)
private HotelBooking hotelBooking;
Wicketクラスは完全なSeamコンポーネントではありませんので、クラスに@Name
をつける必要はありません。
Wicketコンポーネントから、Seamコンテキストに対してオブジェクトをアウトジェクトすることも可能です。
@Out(scope=ScopeType.EVENT, required=false)
private String verify;
TODO ここはもう少し実際の用途に沿って書く
Wicketコンポーネントに対して@Restrict
アノテーションを使用することができます。このアノテーションはクラスに記述することも、その内部クラスに記述することもできます。@Restrict
が指定されると、コンポーネントは自動的にログインユーザーのみの使用に限定されます。value
属性にEL式を使うことで、限定方法を指定することもできます。詳しくは、章 15. セキュリティを参照して下さい。
例:
@Restrict
public class Main extends WebPage {
...
Seamは、制限を、自動的にその入れ子クラスに対しても適用します。
Wicketコンポーネントの中で、@Begin
や@End
を使用することにより、対話の境界を定めることができます。これらのアノテーションの使い方は、Seamコンポーネントの中で使うのと同じです。@Begin
や@End
は、すべてのメソッドで定義することができます。
ifOutcome
属性はサポートされません。
例:
item.add(new Link("viewHotel") {
@Override
@Begin
public void onClick() {
hotelBooking.selectHotel(hotel);
setResponsePage(org.jboss.seam.example.wicket.Hotel.class);
}
};
ユーザーの長期対話が有効な状態であっても、そこでは対話を使用せず、ただアクセスだけさせたいページもあるでしょう。そのような場合は、@NoConversationPage
アノテーションを使用することができます。
@Restrict @NoConversationPage(Main.class) public class Hotel extends WebPage {
アプリケーション内のクラス同士を疎結合にさせたい場合は、Seamイベントを使用することができます。もちろんEvents.instance().raiseEvent("foo")
のようにしてイベントを使用することもできますし、@RaiseEvent("foo")
のようにメソッドにアノテーションをつけることもできます。後者の場合、メソッドがnullでない結果 (outcome)を返し、例外が発生しない場合のみ、イベントが発生します。
Wicketクラスの中で@CreateProcess
、@ResumeTask
、@BeginTask
、@EndTask
、@StartTask
、@Transition
を使用して、タスクやプロセスの制御を行うことも可能です。
TODO - BPM制御を実装する - JBSEAM-3194
Seam needs to instrument the bytecode of your Wicket classes to be able to intercept the annotations you use. Seam provides two ways to do this.The first is to place your classes in WEB-INF/wicket
. Seam will look for classes placed in this directory at startup and instrument them. An alternative approach, which can be used alongside the first, is to use an ant task for instrumention. Seam provides such a task; it is packaged in jboss-seam-wicket-ant.jar
, and can be used in the following manner:
<taskdef name="instrumentWicket"
classname="org.jboss.seam.wicket.ioc.WicketInstrumentationTask">
<classpath>
<pathelement location="lib/jboss-seam-wicket-ant.jar"/>
<pathelement location="web/WEB-INF/lib/jboss-seam-wicket.jar"/>
<pathelement location="lib/javassist.jar"/>
<pathelement location="lib/jboss-seam.jar"/>
</classpath>
</taskdef>
<instrumentWicket outputDirectory="${build.instrumented}">
<classpath refid="build.classpath"/>
<fileset dir="${build.classes}" includes="**/*.class"/>
</instrumentWicket>
Then have ant copy the instrumented classes in ${build.instrumented}
into WEB-INF/classes
. If you want to hot deploy the Wicket components, you can copy the instrumented classes to WEB-INF/dev
; if you use hot deploy, make sure that your WicketApplication
class is also hot-deployed. Upon a reload of hot-deployed classes, the entire WicketApplication instance has to be re-initialized, in order to pick up new references to the classes of mounted pages.
Seamの機能を使用するために、WicketのWebApplicationクラスはSeamWebApplication
クラスを継承する必要があります。これは、Wicketのライフサイクル中にフックを作成し、Seamが対話を自動的に伝播させていくために必要です。また、ページにステータスメッセージを付加します。
例:
SeamAuthorizationStrategy
は、Wicketコンポーネント上で@Restrict
の使用を可能にする、Seamセキュリティ機構のための認証を任されます。SeamWebApplication
クラスは、それを可能にします。クラスにgetLoginPage()
メソッドを実装することによって、認証のためのページを指定することができます。
また、クラスにgetHomePage()
メソッドを実装することによって、ホームページを指定することができます。
public class WicketBookingApplication extends SeamWebApplication {
@Override
public Class getHomePage() {
return Home.class;
}
@Override
protected Class getLoginPage() {
return Home.class;
}
}
Seam automatically installs the Wicket filter for you (ensuring that it is inserted in the correct place for you). But you still need to tell Wicket which WebApplication
class to use.
<components xmlns="http://jboss.com/products/seam/components"
xmlns:wicket="http://jboss.com/products/seam/wicket"
xsi:schemaLocation=
"http://jboss.com/products/seam/wicket
http://jboss.com/products/seam/wicket-2.1.xsd">
<wicket:web-application
application-class="org.jboss.seam.example.wicket.WicketBookingApplication" />
</components
In addition, if you plan to use JSF-based pages in the same application as wicket pages, you'll need to ensure that the jsf exception filter is only enabled for jsf urls:
<components xmlns="http://jboss.com/products/seam/components"
xmlns:web="http://jboss.com/products/seam/web"
xmlns:wicket="http://jboss.com/products/seam/wicket"
xsi:schemaLocation=
"http://jboss.com/products/seam/web
http://jboss.com/products/seam/web-2.1.xsd">
<!-- Only map the seam jsf exception filter to jsf paths, which we identify with the *.seam path -->
<web:exception-filter url-pattern="*.seam"/>
</components
認証機構に関するさらに詳細な情報や、Application
クラスでオーバーライド可能なその他のメソッドに関しては、Wicketのドキュメントを参照して下さい。