Struts Framework – The View in MVC

View เป็นส่วนติดต่อกับผู้ใช้ หน้าที่หลักคือใช้ในการเก็บข้อมูลจากผู้ใช้หรือแสดงผลข้อมูล
โดยทั่วไปแล้วชั้น View จะไม่มีการคำนวณทาง business logic หรือการดึงและ
การเก็บข้อมูลลง datasource เราจะต้องทำให้ส่วน Model และ View แยกออกจากกัน
เพื่อที่จะสามารถมี View ที่หลากหลายได้

Struts ได้เตรียมวิธีการพัฒนาส่วนของ View ไว้ให้เยอะพอสมควร Component หลักๆ
ที่เราน่าจะได้ใช้บ่อยๆ มีดังนี้

  • JSP
  • Form Beans
  • JSP tag libraries
  • Resource bundles

มาดูรายละเอียดเพิ่มเติมของแต่ละ Component กัน

JSP
สำหรับผู้ที่พัฒนา web ที่เป็น java คงต้องรู้จักกันเป็นอย่างดีแล้ว
ข้างในก็จะมี html และ jsp tag lib ซึ่งตัว tag lib ก็จะถูก generate เป็น dynamic html
และก็มาย้ำกันอีกที โค้ดในส่วนนี้ไม่ควรมีการทำงานของ business logic นะครับ ^^

Form Beans
เป็นช่องทางที่ใช้ในการขนส่งข้อมูลระหว่างชั้น View และ Controller
เมื่อฟอร์มถูก submit ตัว struts ก็จะทำการดึงเอาข้อมูลมายัดค่าให้ Form Bean
ที่ถูกลงทะเบียนกับฟอร์มนั้นๆ แล้ว Form Bean ตัวนั้นก็จะถูกส่งไปให้ Controller
โดย Controller ก็จะสามารถใช้ข้อมูลที่ผู้ใช้ส่งเข้ามาได้ผ่านทาง object ของ Form Bean นี้
เพื่อที่จะได้ส่งต่อไปยังชั้น Model ต่อไป

ตัว Form Bean เป็น java bean ธรรมดาที่สืบทอดคลาสของ Struts ที่ชื่อ
org.apache.struts .action.ActionForm ซึ่งในคลาสนี้มีเมธอดสองตัวที่น่าจะต้องใช้คือ
reset() และ validate() ซึ่งเมธอด reset() นี้จะถูกเรียกก่อนที่ Struts จะทำการยัดค่าจากการ
submit หน้าฟอร์ม หลังจากทำการยัดค่าแล้ว Struts ก็จะเรียกเมธอด validate()

ตัวแปรใน Form Bean นั้นสามารถเป็น type อะไรก็ได้ ไม่ว่าจะเป็น primative type
หรือ Object type เช่น Address ที่ข้างในคลาสมีอาจจะตัวแปร street city zipcode
ตัว Struts จะใช้กระบวนการที่เรียกว่า Reflection (หาเพิ่มเติมได้จาก Internet นะครับ ^^)
ในการยัดค่าให้ Form Bean และ Struts ก็ยังสามารถวิ่งเข้าไปในตัวแปรที่เป็น Object
ซ้อนกันไปเรื่อยๆ ได้ จนกว่าจะเจอ getter/setter ที่เป็น public

โดยปกติ ประเภทของตัวแปรที่ดีที่สุดของ Form Bean ควรจะเป็น String
ยกตัวอย่างเช่น เราประกาศตัวแปรที่มีประเภทเป็น Integer เพื่อใช้เก็บตัวเลขบางอย่าง
เราก็เปลี่ยนมาเป็นประเภท String แทน เพราะว่า ข้อมูลที่ได้มาจากหน้า form ของ html
เป็น String นั่นเอง ซึ่งตัวแปรแบบ String สามารถเก็บตัวเลขได้ถูกต้องที่สุดกรณีที่ตัวเลขนั้น
มีทศนิยมมากๆ หรือเป็นจำนวนเต็มที่ยาวมากๆ ซึ่งหากเราประกาศเป็น Type อื่นๆ เช่น
Long หรือ Double ก็จะมีโอกาสเกิด NumberFormatException ได้ถ้าหากค่าที่ส่งมา
เป็นตัวหนังสือแทนที่จะเป็นตัวเลขแล้วถ้าอยากทำการตรวจสอบค่าว่าถูกต้องหรือไม่
ก็ไปพัฒนาไว้ในเมธอด validate()

Validator Framework ของ Struts สามารถประกาศไว้ใน xml แล้วนำมาใช้ในเมธอด validate() ได้ ซึ่งจะกล่าวแบบละเอียดอีกทีในตอนต่อไป

นักพัฒนาหลายคนรู้สึกเบื่อเมื่อต้องสร้าง Form Bean ทุกๆ หน้าที่มีฟอร์ม จึงได้มีการสร้างคลาส
DynaActionForm ขึ้นมา ซึ่งสามารถประกาศไว้ใน config ของ Struts ได้ หน้าตาดังนี้

<!-- Form Beans Configuration -->
<form-beans>
  <form-bean name="searchForm"
             type="org.apache.struts.action.DynaActionForm">
    <form-property name="name"
                   type="java.lang.String"/>
    <form-property name="isbn"
                   type="java.lang.String"/>
  </form-bean>
</form-beans>

เหมือนกับการประกาศฟอร์ม ที่ต่างคือ
type จะต้องเป็น org.apache.struts.action.DynaActionForm
และมีแท็กข้างในคือ form-property ซึ่งเราสามารถกำหนดค่าเริ่มต้นให้ตัวแปรได้ดังนี้

<form-property name="name"
                   type="java.lang.String"
				   initial="java"/>

หากเราไม่ได้กำหนดค่าเริ่มต้น ตัวแปรก็จะมีค่าเริ่มต้นตามปกติของจาวาคือ
ตัวเลขะเป็นศูนย์และ object จะเป็น null

จากการที่ประกาศในไฟล์ config ทำให้เราไม่ต้องพัฒนาส่วนของเมธอด reset() และ validate()
โดยเมธอด reset() นั้นก็จะไม่มีความจำเป็นแล้ว เนื่องจากเรามีค่า initial ของแท็ก form-property
ซึ่งมันมีผลเหมือนกันนั่นเอง ส่วนเมธอด validate() ก็ให้ไปทำที่คลาส action แทน
หากมีกรณีต้องใช้เมธอด reset() หรือ validate() ก็สามารถสร้าง Dynamic Form Bean ได้
โดยให้สืบทอดคลาส DynaActionForm แล้วเปลี่ยน type ใน config เป็น DynaActionForm ด้วย

JSP tag libraries

Struts เตรียมพร้อม custom JSP tag libraries ให้มากมาย สำหรับการสร้างฟอร์มของ html
ที่ข้อมูลจะสามารถเก็บลงใน Form Beans ได้ และยังใช้แสดงข้อมูลที่อยู่ใน Form Beans ด้วย
และยังมี tag อื่นๆ อีก เช่น conditional logic การวนลูปบน Collections เป็นต้น
และในสมัยนั้น JSTL เพิ่งเกิด ทำให้ความสามารถของ custom tag lib ของ Struts แทบจะเหมือนกัน
แต่เราก็สามารถใช้ JSTL ร่วมกับ Struts ได้เช่นกัน

Struts เตรียม tag lib ไว้ให้ดังนี้

  • HTML ใช้สร้างฟอร์มที่ใช้ติดต่อกับ Struts API
  • Bean ใช้ทำงานกับ Java bean ใน jsp
  • Logic ใช้แทน conditional logic ง่ายๆ แทนที่จะเปิดแท็กเพื่อเขียนโค้ดจาวาเอง
  • Nested แท็กนี้ผมยังไม่เคยใช้ แต่ก็พอมีตัวอย่างให้ดูคร่าวๆ คือ
    สมมุติว่าเราต้องการแสดงผลข้อมูลที่มีประเภทแบบ Object ซ้อนๆ กัน
    เช่น Object ของ Book อาจจะมีตัวแปร publisher ซึ่งจะมี address อยู่
    ปกติเวลาแสดงผลเราจะต้องทำประมาณนี้

    Line 1: <html:text property="book.publisher.address.line1"/>
    Line 2: <html:text property="book.publisher.address.line2"/>
    City: <html:text property="book.publisher.address.city"/>
    State: <html:text property="book.publisher.address.state"/>
    Zip: <html:text property="book.publisher.address.zip"/>
    

    หากตัวแปร address มีการเปลี่ยนชื่อ เราก็จะต้องตามแก้ให้ครบทุกตัว
    แต่ถ้าเราใช้แท็ก nested เราก็จะช่วยทุ่นแรงได้ นี่คือตัวอย่างของแท็ก nested

    <nested:nest property="book">
    	<nested:nest property="publisher">
    		  <nested:nest property="address">
    			Line 1: <nested:text property="line1"/>
    			Line 2: <nested:text property="line2"/>
    			City: <nested:text property="city"/>
    			State: <nested:text property="state"/>
    			Zip: <nested:text property="zip"/>
    		  </nested:nest>
    	 </nested:nest>
    </nested:nest>
    

    เราก็สามารถแก้ไขที่เดียว โดยไม่กระทบกับการแสดงผลที่อื่นๆ

Resource Bundles

งานหลักของ Resource Bundles คือการทำให้ application ของเรารองรับได้หลายภาษา
แทนที่จะ hard code ในโปรแกรม และประโยชน์ที่ได้อีกอย่างคือ เราสามารถแก้ไขข้อความ
ได้ทันทีโดยไม่ต้องทำการแก้ไขโปรแกรม
ในตัวอย่างที่แล้วน่าจะพอคุ้นตากัน ที่เราต้องการสร้างไฟล์ MessageResources.properties
แล้วไปกำหนดตำแหน่งในไฟล์ struts-config.xml แล้วเวลาใช้งานที่หน้า jsp
เราก็เรียกใช้ผ่านแท็ก bean ของ struts tag lib ได้ทันที

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s