Javaフレームワーク研究——JSFとStrutsの異同

6961 ワード

Javaフレームワーク研究——JSFとStrutsの異同
StrutsとJSF/Tapestryはいずれも表現層の枠組みに属し、この2つは異なる性質の枠組みに属している.後者はイベント駆動型のコンポーネントモデルであるが、Strutsは単純なMVCモードの枠組みにすぎず、外国人はいつもイベント駆動型がMVCモードの枠組みより良いと急いでいる.
最初のイベントとは、クライアントページ(ブラウザ)からユーザ操作によってトリガーされるイベントであり、StrutsはActionを使用してブラウザフォームのコミットを受け入れるイベントであり、ここではCommandモードを使用し、Actionを継承するサブクラスごとに1つのメソッドexecuteを実装する必要がある.
Strutsでは、実際にはフォームFormがActionクラス(またはDispatchAction)に対応しています.言い換えれば、Strutsでは実際にはフォームが1つのイベントにしか対応できません.Strutsというイベント方式はapplication eventと呼ばれ、application eventとComponent eventの比は粗粒度のイベントです.
Strutsの重要なフォームオブジェクトActionFormは、Jspページフォームのinputフィールドであるアプリケーションを表すオブジェクトであり、1つのフォームが1つのイベントに対応するため、イベントの粒度をフォームのフィールドに細かくする必要がある場合、つまり1つのフィールドが1つのイベントに対応する場合、Strutsを単純に使うことは不可能ですし、JavaScriptと組み合わせることでターンダウンも可能です.
この場合JSFを使えば簡単に実現できます

       <h:inputText id="userId" value="#{login.userId}">
<f:valueChangeListener type="logindemo.UserLoginChanged" />
</h:inputText>
#{login.userId}は、loginというJavaBeanのgetUserIdから得られた結果を表し、strutsを用いても実現できます.name="login"property="userId"
キーは2行目で、ここではuserIdの値が変更され、コミットが決定されると、呼び出しクラスUserLoginChangedのprocessValue Changed()メソッドがトリガーされることを示します.
JSFはコンポーネントに2つのイベントを提供することができます:Value ChangedとAction.前者は前節で見たことがありますが、後者はstrutsのフォーム提出Actionメカニズムに相当し、そのJSFの書き方は以下の通りです.

       <h:commandButton id="login" commandName="login">
<f:actionListener type=”logindemo.LoginActionListener” />
</h:commandButton>
コードから分かるように、この2つのイベントはListernerのようなオブザーバーモードによって特定のコンポーネントフィールドに貼り付けられ、Strutsのようなイベントは元のフォームコミットSubmitトリガメカニズムである.前者が比較的言語化されているとすれば(プログラミング言語の習慣はSwingプログラミングに似ている).後者はWEB化に属しています.それはHtmlフォームから来ているので、Perl/HPからスタートすれば、かえってStrutsというスタイルを受け入れやすいです.
基本構成
StrutsとJSFはいずれもフレームワークであり、JSFには2つのパッケージJSFコアパッケージ、JSTLパッケージ(ラベルライブラリ)が必要です.また、JSFはApacheプロジェクトに使用されるcommonsパッケージも使用します.これらのApacheパッケージはあなたのサーバに配備すれば可能です.
JSFパッケージダウンロードアドレス:http://java.sun.com/j2ee/javaserverfaces/download.htmlReference Implementationを選択します.
JSTLパッケージのダウンロードhttp://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
だから、JSFの駆動パッケージの構成から見ると、その開源遺伝子も大きな比重を占めており、JSFはSUNパートナーたちの工業標準と開源の間の混血児である.
上記の2つのアドレスでダウンロードしたjarを統合すると、JSFに必要なすべてのドライバパッケージになります.これらの駆動パケットは、Strutsの駆動パケットと同様に、WebプロジェクトのWEB-INF/libに存在する必要があります.Strutsと同様に、web.xmlにも次のような構成が必要です.

       <web-app>
  <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet> 
  <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.faces</url-pattern>
  </servlet-mapping> 
    </web-app>
ここはStrutsのweb.xml構成と何が似ているのか、まったくそっくりです.
Strutsのstruts-config.xmlのように、JSFにも同様のfaces-config.xmlプロファイルがあります.

       <faces-config>
  <navigation-rule>
  <from-view-id>/index.jsp</from-view-id>
  <navigation-case>
   <from-outcome>login</from-outcome>
  <to-view-id>/welcome.jsp</to-view-id>
  </navigation-case>
  </navigation-rule> 
  <managed-bean> 
  <managed-bean-name>user</managed-bean-name>
  <managed-bean-class>com.corejsf.UserBean</managed-bean-class> 
  <managed-bean-scope>session</managed-bean-scope> 
  </managed-bean>
    </faces-config>
Struts-config.xmlにはActionForm ActionおよびJsp間の流れ関係があり、faces-config.xmlにもこのような流れがありますので、Navigationについて具体的に説明します.
index.jspにイベントがあります.

       <h:commandButton label="Login" action="login" />
Actionの値はform-outcome値に一致する必要があります.上記のNavigation構成では、index.jspにloginイベントがある場合、イベントトリガ後の次のページはwelcome.jspになります.
JSFには独立したイベント発生とページナビゲーションのプロセス配置があり,strutsよりも非常に明確である.
managed-beanはStrutsのActionFormに似ており、struts-config.xmlでActionFormのscopeを定義できるように、ここでもmanaged-beanのscopeをsessionとして定義している.
しかし、JSFのmanaged-beanがこの機能だけでは間違っていると思ったら、JSFには新しいIocモード/依存性注射などの技術が溶け込んでいます.
Iocモード
Userbeanのようなmanaged-beanのコードは次のとおりです.

       public class UserBean {
  private String name;
  private String password;

  // PROPERTY: name
  public String getName() { return name; }
  public void setName(String newValue) { name = newValue; }

  // PROPERTY: password
  public String getPassword() { return password; }
  public void setPassword(String newValue) { password = newValue; }
    }

    <managed-bean>
  <managed-bean-name>user</managed-bean-name>
  <managed-bean-class>com.corejsf.UserBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>

  <managed-property>
  <property-name>name</property-name>
  <value>me</value>
  </managed-property>

  <managed-property>
  <property-name>password</property-name>
  <value>secret</value>
  </managed-property>
    </managed-bean>
faces-config.xmlこの構成は、実は「me」をnameに、secretをpasswordに、IocモードでのSetter射出方式を採用しています.
Backing Beans
Web formの場合、1つのbeanを使用して関連するすべてのコンポーネントを含むことができます.このbeanはBacking Beanと呼ばれ、Backing Beanの利点は、1つのクラスが関連する一連の機能のデータと論理をカプセル化できることです.
はっきり言って、Javabeanには他のJavabeanが含まれていて、互いに呼び出し合い、FacadeモードやAdapterモードに属しています.
Backing Beansには、いくつかのmanaged-beanが含まれています.managed-beanにはscopeがあるに違いありません.では、いくつかのmanaged-beansはどのようにscopeを構成しますか.

       <managed-bean>
  ...
  <managed-property>
  <property-name>visit</property-name>
  <value>#{sessionScope.visit}</value>
  </managed-property>
ここでは、Backing Beansにsessionのvisitに値を割り当てるsessionメソッドを設定します.これにより、後でプログラムでvisitオブジェクトにアクセスし、ユーザー登録情報などのデータを取得します.visitはsessionに保存するかアプリケーションまたはrequestに保存するかは構成のみ可能です.
UIインタフェース
JSFはStrutsと同様にJavaBeansクラスのほか、ページ表現要素もあり、いずれもラベルを使用して完成しており、Strutsはstruts-faces.tldラベルライブラリからJSFへの移行を提供している.
Strutsラベルライブラリを使用して複雑なページをプログラミングする場合、最大の問題はlogicラベルを大量に使用することです.このlogicはif文のようなもので、いったん書くと、JSPページはロシアのブロックのようになりますが、JSFラベルを使用すると簡潔で美しいです.

       <jia:navigatorItem name="inbox" label="InBox"
  icon="/images/inbox.gif"
  action="inbox"
  disabled="#{!authenticationBean.inboxAuthorized}"/>
authenticationBeanでinboxAuthorizedが偽を返すと、この行のラベルは表示されず、きれいですね.
ここまで書いておきますが、JSFを深く比較し続けます.Jdonフレームワークを研究した人は、Jdonフレームワークのjdonframework.xmlでservice構成がmanaged-beanと同じように依存注射を使用していることに気づくかもしれません.Javabeanへの依存注射は急速に新しい技術の象徴になっているようです.Iocモードを理解していない場合は、急いで補習します.