Struts動作をSpringでより良く処理するための3つの統合(2)---参照http://www.bitscn.com


コツ2.Request Processorをカバーする
     SpringをStruts動作から分離することはより巧妙な設計選択である。分離の一つの方法はorg.springframe ebook.web.struts.Delegating Request Processor類を使ってStrutsのRequest Procestor処理プログラムをカバーすることであり、リスト2に示すように:
リスト2.SpringのDelegating Request Processorで統合する
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
 <form-beans>
    <form-bean name="searchForm" 
      type="org.apache.struts.validator.DynaValidatorForm">
               <form-property name="isbn"    type="java.lang.String"/>
    </form-bean>
  </form-beans>
 <global-forwards type="org.apache.struts.action.ActionForward">
     <forward   name="welcome"                path="/welcome.do"/>
     <forward   name="searchEntry"            path="/searchEntry.do"/>
     <forward   name="searchSubmit"           path="/searchSubmit.do"/>
 </global-forwards>
 <action-mappings>
    <action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
    <action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
    <action    path="/searchSubmit" 
               type="ca.nexcel.books.actions.SearchSubmit"
               input="/searchEntry.do"
               validate="true"
               name="searchForm">
              <forward name="success" path="/WEB-INF/pages/detail.jsp"/>
              <forward name="failure" path="/WEB-INF/pages/search.jsp"/>
    </action>  
 </action-mappings>
 <message-resources parameter="ApplicationResources"/>
 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> |(1)
 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" 
      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>
 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/>
 </plug-in>
</struts-config>
     
     私は「controller」のマークを使って、デフォルトのStruts Request ProcessorをDelegatingで上書きしました。次はリスト3に示すように、私のSpringプロファイルにこの動作を登録します。
リスト3.Springプロファイルに動作を登録する
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
  <bean name="/searchSubmit" 
    class="ca.nexcel.books.actions.SearchSubmit"> //(1)
     <property name="bookService">
        <ref bean="bookService"/>
     </property>
  </bean>
</beans>
     
    注意:(1)において、私は名前属性を使って、struts-config動作マッピングの名前にマッチするために、beanを登録しました。Search Submit動作は、リスト4に示されるように、Springが実行中に属性を充填することができるJavaBean属性を明らかにしている。
明細書4.JavaBean属性を持つStruts動作

package ca.nexcel.books.actions;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;
public class SearchSubmit extends Action {
 
  private BookService bookService;
  public BookService getBookService() {
    return bookService;
  }
  public void setBookService(BookService bookService) { //(1)
    this.bookService = bookService; 
  } 
  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {
    DynaActionForm searchForm = (DynaActionForm) form;
    String isbn = (String) searchForm.get("isbn");
  
  Book book = getBookService().read(isbn.trim());  //(2)
    if (null == book) {
      ActionErrors errors = new ActionErrors();
      errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("message.notfound"));
      saveErrors(request, errors);
      return mapping.findForward("failure") ;
  }
      request.setAttribute("book", book);
      return mapping.findForward("success");
  }
}
    リスト4では、Struts動作の作成方法を知ることができます。(1)では、JavaBean属性を作成しました。この属性はDelegating Request Processorに自動的に配置されます。このようなデザインはStruts動作がSpringによって管理されていることを知らず、Spingの動作管理フレームワークのすべての利点を利用することができます。Struts動作はSpringの存在に気づかないため、Strutsコードを書き換える必要がないので、他の制御反転容器を使ってSpringを置き換えることができます。
  DelegatingRequest Processor方法は確かに第一の方法よりいいですが、まだ問題があります。Request Processorを使用すると、SpringのDelegating Request Processorを手動で統合する必要があります。追加されたコードはメンテナンスの面倒を引き起こし、将来的にはアプリケーションの柔軟性を低下させます。また、Struts Request Processorの代わりに一連の命令が使われているという噂もあります。この変化はこの解決法の寿命に負の影響を及ぼすであろう。