การใช้งาน Tapesty ร่วมกับ Spring Framework
By nuttarut phugsuwan [ Friday, August 3rd, 2007 ]
Tapestry เป็นเฟรมเวิร์คสำหรับพัฒนาเว็บแอพพลิเคชั่นด้วยจาวาที่มีประสิทธิภาพมากเฟรมเวิร์คหนึ่ง ด้วยการทำงานในรูปแบบ Component-Centric ที่มีความสามารถหลักๆคือทำให้เราสามารถนำโค๊ดเก่ามาใช้ใหม่ได้ ง่าย และยังมี HiveMind ที่ทำให้สามารถใช้แนวคิด Inversion of Control (IoC)ในการพัฒนาได้อีกด้วย
แต่การพัฒนาแอพพลิเคชั่นด้วยแนวคิดแบบ IoC ในปัจจุบันนั้น การใช้ Spring Framework จะเป็นที่นิยมแพร่หลายมากกว่า ฉะนั้นถ้าเราสามารถนำ Spring Framework มาใช้งานร่วมกับ Tapestry ได้ ก็จะเป็นประโยชน์มากทีเดียว
โชคดีที่ทั้ง Spring Framework และ Tapestry นั้นมีสถาปัตยกรรมที่ค่อนข้างจะยืดหยุ่น ทำให้การนำเฟรมเวิร์คอื่นๆมาใช้งานร่วมด้วยนั้นสามารถทำได้ง่าย และมีประสิทธิภาพ โดยการนำ Spring Framework และ Tapestry มาใช้งานร่วมกันสามารถทำได้ดังนี้
การ config web.xml
ก่อนอื่นเราจะต้องทำให้เว็บแอพลิเคชั่นที่พัฒนาด้วย Tapestryของเรานั้นหาไฟล์ config ของ Spring ให้เจอเสียก่อนโดยใช้ listener ที่ชื่อ ContextLoaderListener โดยทำการเพิ่ม config ใน web.xml ดังนี้
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
ในส่วนต่อไปจะเป็นการทำให้ ContextLoaderListener ทราบว่าจะเข้าไปหาไฟล์ config ของ Spring ได้ที่ไหน ถ้าไม่มีการกำหนดในส่วนนี้ไว้ ContextLoaderListener จะเข้าไปหาใน /WEB-INF/applicationContext.xml แทน
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
การใช้ Dependency Injection เพื่อเรียกใช้ Spring Bean
เรามาสารถเรียกใช้ Spring Bean จาก page object ของ Tapestry ได้โดยตรงเช่น
WebApplicationContext appContext = WebApplicationContextUtils.getApplicationContext(
getRequestCycle().getRequestContext().getServlet().getServletContext());
SomeService someService = (SomeService) appContext.getBean("someService");
แต่การทำแบบนี้จะทำให้แก้ไขลำบากในภายหลัง เพราะเราจะต้องแก้ทุก page object ที่เรียกใช้ Spring Bean และถึงแม้เราจะใช้รูปแบบการเขียนโค๊ดต่างๆ ที่จะสะดวกในการแก้ไขแล้วก็ตาม ตัว Servlet เองก็ไม่ควรเรียกใช้ Application Context โดยตรง หรือรู้ว่าถูกสร้างมาได้อย่างไร ตามหลักของ IoC
เราสามารถแก้ปัญหานี้ได้โดยใช้ไลบราลีที่ชื่อ Tapestry-Spring ซึ่งจะใช้ Annotation @InjectObject แทนการเรียกใช้แบบเดิมที่กล่าวไว้ข้างต้น ทำให้เราเรียกใช้ Spring Beanได้ง่ายและยืดหยุ่นมากยิ่งขึ้น โดยให้ทำการดาวน์โหลดไฟล์ไลบราลีมาใส่ไว้ร่วมกับไลบราลีอื่นๆ ที่เราใช้ในเว็บแอพพลิเคชั่น (ปกติจะเป็น /WEB-INF/lib) และทำการเรียกใช้ใน page object ดังนี้
@InjectObject("spring:someService")
public abstract SomeService getSomeService();
สำหรับระบบที่ไม่ได้ใช้ Java5 จะต้องทำการเรียกใช้ Spring Bean ผ่านไฟล์ .page หรือ .jwc ของหน้าเว็บนั้นๆแทนดังนี้
<inject property="someService" object="spring:someService"/>

Leave comment...