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で統合する
私は「controller」のマークを使って、デフォルトのStruts Request ProcessorをDelegatingで上書きしました。次はリスト3に示すように、私のSpringプロファイルにこの動作を登録します。
リスト3.Springプロファイルに動作を登録する
注意:(1)において、私は名前属性を使って、struts-config動作マッピングの名前にマッチするために、beanを登録しました。Search Submit動作は、リスト4に示されるように、Springが実行中に属性を充填することができるJavaBean属性を明らかにしている。
明細書4.JavaBean属性を持つStruts動作
DelegatingRequest Processor方法は確かに第一の方法よりいいですが、まだ問題があります。Request Processorを使用すると、SpringのDelegating Request Processorを手動で統合する必要があります。追加されたコードはメンテナンスの面倒を引き起こし、将来的にはアプリケーションの柔軟性を低下させます。また、Struts 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の代わりに一連の命令が使われているという噂もあります。この変化はこの解決法の寿命に負の影響を及ぼすであろう。