Apache Tapestry - ส่วนประกอบ
ตามที่กล่าวไว้ก่อนหน้านี้คอมโพเนนต์และเพจจะเหมือนกันยกเว้นว่าเพจเป็นคอมโพเนนต์รูทและมีคอมโพเนนต์ย่อยอย่างน้อยหนึ่งคอมโพเนนต์ คอมโพเนนต์มักจะอยู่ภายในเพจและทำหน้าที่แบบไดนามิกเกือบทั้งหมดของเพจ
ส่วนประกอบ Tapestry แสดงลิงก์ HTML อย่างง่ายไปยังฟังก์ชันกริดที่ซับซ้อนด้วย interactive AJAX. ส่วนประกอบอาจรวมถึงส่วนประกอบอื่นด้วย ส่วนประกอบของ Tapestry ประกอบด้วยรายการต่อไปนี้ -
Component Class - คลาส Java หลักของคอมโพเนนต์
XML Template- เทมเพลต XML คล้ายกับเทมเพลตของเพจ คลาสคอมโพเนนต์แสดงเทมเพลตเป็นผลลัพธ์สุดท้าย ส่วนประกอบบางอย่างอาจไม่มีเทมเพลต ในกรณีนี้เอาต์พุตจะถูกสร้างขึ้นโดยคลาสคอมโพเนนต์โดยใช้MarkupWriter ชั้นเรียน
Body- ส่วนประกอบที่ระบุภายในเทมเพลตเพจอาจมีมาร์กอัปแบบกำหนดเองและเรียกว่า "เนื้อหาส่วนประกอบ" หากเทมเพลตคอมโพเนนต์มี<body />จากนั้นองค์ประกอบ <body /> จะถูกแทนที่ด้วย body ของส่วนประกอบ ซึ่งคล้ายกับเค้าโครงที่กล่าวถึงก่อนหน้านี้ในส่วนเทมเพลต XML
Rendering - การเรนเดอร์เป็นกระบวนการที่แปลงเทมเพลต XML และเนื้อความของส่วนประกอบให้เป็นผลลัพธ์จริงของส่วนประกอบ
Parameters - ใช้เพื่อสร้างการสื่อสารระหว่างคอมโพเนนต์และเพจและส่งผ่านข้อมูลระหว่างกัน
Events- มอบหมายการทำงานจากคอมโพเนนต์ไปยังคอนเทนเนอร์ / พาเรนต์ (เพจหรือคอมโพเนนต์อื่น) มีการใช้กันอย่างแพร่หลายในการนำทางหน้า
การแสดงผล
การแสดงผลของคอมโพเนนต์จะทำในชุดของเฟสที่กำหนดไว้ล่วงหน้า แต่ละเฟสในระบบคอมโพเนนต์ควรมีวิธีการที่สอดคล้องกันซึ่งกำหนดโดยแบบแผนหรือคำอธิบายประกอบในคลาสส่วนประกอบ
// Using annotaion
@SetupRender
void initializeValues() {
// initialize values
}
// using convention
boolean afterRender() {
// do logic
return true;
}
ขั้นตอนชื่อวิธีการและคำอธิบายประกอบแสดงอยู่ด้านล่าง
คำอธิบายประกอบ | ชื่อวิธีการเริ่มต้น |
---|---|
@SetupRender | setupRender () |
@BeginRender | startRender () |
@BeforeRenderTemplate | beforeRenderTemplate () |
@BeforeRenderBody | beforeRenderBody () |
@AfterRenderBody | afterRenderBody () |
@AfterRenderTemplate | afterRenderTemplate () |
@AfterRender | afterRender () |
@CleanupRender | cleanupRender () |
แต่ละขั้นตอนมีวัตถุประสงค์เฉพาะและมีดังนี้ -
SetupRender
SetupRender เริ่มกระบวนการแสดงผล โดยปกติจะตั้งค่าพารามิเตอร์ของส่วนประกอบ
BeginRender
BeginRender เริ่มแสดงผลคอมโพเนนต์ โดยปกติจะแสดงแท็ก start / start ของส่วนประกอบ
BeforeRenderTemplate
BeforeRenderTemplate ใช้ในการตกแต่งเทมเพลต XML โดยเพิ่มมาร์กอัปพิเศษรอบ ๆ เทมเพลต นอกจากนี้ยังมีตัวเลือกในการข้ามการแสดงเทมเพลต
BeforeRenderBody
BeforeRenderTemplate มีตัวเลือกในการข้ามการแสดงผลองค์ประกอบร่างกายของส่วนประกอบ
AfterRenderBody
AfterRenderBody จะถูกเรียกใช้หลังจากแสดงผลเนื้อหาของส่วนประกอบแล้ว
AfterRenderTemplate
AfterRenderTemplate จะถูกเรียกใช้หลังจากแสดงเทมเพลตของคอมโพเนนต์แล้ว
AfterRender
AfterRender เป็นคู่ของ BeginRender และมักจะแสดงผลแท็กปิด
CleanupRender
CleanupRender เป็นคู่ของ SetupRender มันเผยแพร่ / จำหน่ายวัตถุทั้งหมดที่สร้างขึ้นในระหว่างกระบวนการแสดงผล
ขั้นตอนการแสดงผลไม่ได้ไปข้างหน้าเท่านั้น มันไปมาระหว่างเฟสขึ้นอยู่กับค่าส่งกลับของเฟส
ตัวอย่างเช่นถ้าเมธอด SetupRender ส่งคืนค่าเท็จการแสดงผลจะข้ามไปยังเฟส CleanupRender และในทางกลับกัน หากต้องการทำความเข้าใจอย่างชัดเจนเกี่ยวกับการไหลระหว่างระยะต่างๆให้ตรวจสอบการไหลในแผนภาพด้านล่าง
ส่วนประกอบที่เรียบง่าย
ให้เราสร้างส่วนประกอบง่ายๆ Hello ซึ่งจะมีข้อความแสดงผลเป็น“ Hello, Tapestry” ต่อไปนี้เป็นรหัสของส่วนประกอบ Hello และเทมเพลต
package com.example.MyFirstApplication.components;
public class Hello {
}
<html
xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<div>
<p>Hello, Tapestry (from component).</p>
</div>
</html>
สามารถเรียกคอมโพเนนต์ Hello ในเทมเพลตเพจเป็น -
<html title = "Hello component test page"
xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<t:hello />
</html>
ในทำนองเดียวกันส่วนประกอบอาจแสดงผลลัพธ์เดียวกันโดยใช้ MarkupWriter แทนเทมเพลตดังที่แสดงด้านล่าง
package com.example.MyFirstApplication.components;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.BeginRender;
public class Hello {
@BeginRender
void renderMessage(MarkupWriter writer) {
writer.write("<p>Hello, Tapestry (from component)</p>");
}
}
ให้เราเปลี่ยนเทมเพลตองค์ประกอบและรวมองค์ประกอบ <body /> ดังที่แสดงในบล็อกโค้ดด้านล่าง
<html>
xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<div>
<t:body />
</div>
</html>
ตอนนี้เทมเพลตของเพจอาจรวมเนื้อหาในมาร์กอัปส่วนประกอบดังที่แสดงด้านล่าง
<html title = "Hello component test page"
xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<t:hello>
<p>Hello, Tapestry (from page).</p>
</t:hello>
</html>
ผลลัพธ์จะเป็นดังนี้ -
<html>
<div>
<p>Hello, Tapestry (from page).</p>
</div>
</html>
พารามิเตอร์
วัตถุประสงค์หลักของพารามิเตอร์เหล่านี้คือการสร้างการเชื่อมต่อระหว่างฟิลด์ของคอมโพเนนต์และคุณสมบัติ / ทรัพยากรของเพจ การใช้พารามิเตอร์ส่วนประกอบและหน้าที่เกี่ยวข้องสื่อสารและถ่ายโอนข้อมูลระหว่างกัน นี้เรียกว่าTwo Way Data Binding.
ตัวอย่างเช่นคอมโพเนนต์กล่องข้อความที่ใช้แทนอายุในเพจการจัดการผู้ใช้จะได้รับค่าเริ่มต้น (พร้อมใช้งานในฐานข้อมูล) ผ่านพารามิเตอร์ อีกครั้งหลังจากอัปเดตและส่งอายุของผู้ใช้แล้วคอมโพเนนต์จะส่งอายุที่อัปเดตกลับมาผ่านพารามิเตอร์เดียวกัน
ในการสร้างพารามิเตอร์ใหม่ในคลาสคอมโพเนนต์ให้ประกาศฟิลด์และระบุ a @Parameterคำอธิบายประกอบ @Parameter นี้มีอาร์กิวเมนต์ที่เป็นทางเลือกสองแบบซึ่ง ได้แก่ -
required- ทำให้พารามิเตอร์เป็นสิ่งจำเป็น Tapestry มีข้อยกเว้นหากไม่มีให้
value - ระบุค่าเริ่มต้นของพารามิเตอร์
ควรระบุพารามิเตอร์ในเทมเพลตเพจเป็นแอตทริบิวต์ของแท็กคอมโพเนนต์ ควรระบุค่าของแอตทริบิวต์โดยใช้ Binding Expression / Expansion ซึ่งเราได้กล่าวถึงในบทก่อนหน้านี้ ส่วนขยายบางส่วนที่เราได้เรียนรู้ก่อนหน้านี้ ได้แก่ -
Property expansion (prop:«val») - รับข้อมูลจากคุณสมบัติของคลาสเพจ
Message expansion (message:«val») - รับข้อมูลจากคีย์ที่กำหนดในไฟล์ index.properties
Context expansion (context:«val») - รับข้อมูลจากโฟลเดอร์บริบทเว็บ / src / main / webapp
Asset expansion (asset:«val») - รับข้อมูลจากทรัพยากรที่ฝังอยู่ในไฟล์ jar / META-INF / assets
Symbol expansion (symbol:«val») - รับข้อมูลจากสัญลักษณ์ที่กำหนดใน AppModule.javafile
Tapestry มีส่วนขยายที่มีประโยชน์อื่น ๆ อีกมากมายซึ่งบางส่วนได้รับด้านล่าง -
Literal expansion (literal:«val») - สตริงตามตัวอักษร
Var expansion (var:«val») - อนุญาตให้อ่านหรืออัปเดตตัวแปรการแสดงผลขององค์ประกอบ
Validate expansion (validate:«val»)- สตริงเฉพาะที่ใช้เพื่อระบุกฎการตรวจสอบของออบเจ็กต์ ตัวอย่างเช่น validate: required, minLength = 5
Translate (translate:«val») - ใช้เพื่อระบุคลาส Translator (การแปลงฝั่งไคลเอ็นต์เป็นการแสดงฝั่งเซิร์ฟเวอร์) ในการตรวจสอบอินพุต
Block (block:«val») - รหัสขององค์ประกอบบล็อกภายในเทมเพลต
Component (component:«val») - รหัสของส่วนประกอบอื่นภายในเทมเพลต
การขยายทั้งหมดข้างต้นเป็นแบบอ่านอย่างเดียวยกเว้นการขยายคุณสมบัติและการขยาย Var ส่วนประกอบเหล่านี้ใช้เพื่อแลกเปลี่ยนข้อมูลกับเพจ เมื่อใช้การขยายเป็นค่าแอตทริบิวต์${...}ไม่ควรใช้ แทนที่จะใช้การขยายตัวโดยไม่มีสัญลักษณ์ดอลลาร์และวงเล็บปีกกา
ส่วนประกอบโดยใช้พารามิเตอร์
ให้เราสร้างคอมโพเนนต์ใหม่ HelloWithParameter โดยการปรับเปลี่ยนคอมโพเนนต์ Hello เพื่อแสดงข้อความแบบไดนามิกโดยการเพิ่ม name พารามิเตอร์ในคลาสคอมโพเนนต์และเปลี่ยนเทมเพลตคอมโพเนนต์และเทมเพลตเพจตามนั้น
สร้างคลาสคอมโพเนนต์ใหม่ HelloWithParameter.java.
เพิ่มเขตข้อมูลส่วนตัวและตั้งชื่อด้วย @Parameterคำอธิบายประกอบ ใช้อาร์กิวเมนต์ที่จำเป็นเพื่อทำให้เป็นข้อบังคับ
@Parameter(required = true)
private String name;
เพิ่มฟิลด์ส่วนตัวผลลัพธ์ด้วย @Properyคำอธิบายประกอบ คุณสมบัติผลลัพธ์จะถูกใช้ในเทมเพลตคอมโพเนนต์ เทมเพลตคอมโพเนนต์ไม่มีสิทธิ์เข้าถึงฟิลด์ที่มีคำอธิบายประกอบ@Parameter และสามารถเข้าถึงได้เฉพาะฟิลด์ที่มีคำอธิบายประกอบ @Property. ตัวแปรที่มีอยู่ในเทมเพลตคอมโพเนนต์เรียกว่า Render Variables
@Property
private String result;
เพิ่มเมธอด RenderBody และคัดลอกค่าจากพารามิเตอร์ name ไปยังคุณสมบัติผลลัพธ์
@BeginRender
void initializeValues() {
result = name;
}
เพิ่มเทมเพลตองค์ประกอบใหม่ HelloWithParamter.tml และใช้คุณสมบัติผลลัพธ์เพื่อแสดงข้อความ
<div> Hello, ${result} </div>
เพิ่มคุณสมบัติใหม่ชื่อผู้ใช้ในหน้าทดสอบ (testhello.java)
public String getUsername() {
return "User1";
}
ใช้องค์ประกอบที่สร้างขึ้นใหม่ในเทมเพลตเพจและตั้งค่าคุณสมบัติชื่อผู้ใช้ในชื่อพารามิเตอร์ของ HelloWithParameter ส่วนประกอบ.
<t:helloWithParameter name = "username" />
รายชื่อที่สมบูรณ์มีดังนี้ -
package com.example.MyFirstApplication.components;
import org.apache.tapestry5.annotations.*;
public class HelloWithParameter {
@Parameter(required = true)
private String name;
@Property
private String result;
@BeginRender
void initializeValues() {
result = name;
}
}
<html
xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<div> Hello, ${result} </div>
</html>
package com.example.MyFirstApplication.pages;
import org.apache.tapestry5.annotations.*;
public class TestHello {
public String getUsername() {
return "User1";
}
}
<html title = "Hello component test page"
xmlns:t = "https://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<t:helloWithParameter name = "username" />
</html>
ผลลัพธ์จะเป็นดังนี้ -
<div> Hello, User1 </div>
พารามิเตอร์ขั้นสูง
ในบทก่อนหน้านี้เราได้วิเคราะห์วิธีสร้างและใช้พารามิเตอร์ง่ายๆในคอมโพเนนต์ที่กำหนดเอง พารามิเตอร์ขั้นสูงอาจมีมาร์กอัปที่สมบูรณ์เช่นกัน ในกรณีนี้ควรระบุมาร์กอัปภายในแท็กส่วนประกอบเช่นส่วนย่อยในเทมเพลตเพจ องค์ประกอบ if ในตัวมีมาร์กอัปสำหรับทั้งความสำเร็จและเงื่อนไขความล้มเหลว มาร์กอัปสำหรับความสำเร็จถูกระบุเป็นเนื้อหาของแท็กส่วนประกอบและระบุมาร์กอัปของความล้มเหลวโดยใช้ไฟล์elseparameter.
ให้เราดูวิธีการใช้ ifส่วนประกอบ. องค์ประกอบ if มีสองพารามิเตอร์ -
test - พารามิเตอร์ตามคุณสมบัติอย่างง่าย
Else - พารามิเตอร์ขั้นสูงที่ใช้เพื่อระบุมาร์กอัปทางเลือกหากเงื่อนไขล้มเหลว
Tapestry จะตรวจสอบค่าของคุณสมบัติทดสอบโดยใช้ตรรกะต่อไปนี้และส่งคืนจริงหรือเท็จ นี้เรียกว่าType Coercionวิธีแปลงวัตถุประเภทหนึ่งไปเป็นอีกประเภทหนึ่งที่มีเนื้อหาเหมือนกัน
ถ้าชนิดข้อมูลเป็น String,“ True” หากไม่เว้นว่างและไม่ใช่สตริงตามตัวอักษร“ False” (ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่)
ถ้าชนิดข้อมูลเป็น Number, จริงถ้าไม่ใช่ศูนย์
ถ้าชนิดข้อมูลเป็น Collectionจริงถ้าไม่ว่างเปล่า
ถ้าชนิดข้อมูลเป็น Object, จริง (ตราบใดที่ไม่เป็นโมฆะ)
หากเงื่อนไขผ่านไปส่วนประกอบจะแสดงผลร่างกาย มิฉะนั้นจะแสดงเนื้อหาของพารามิเตอร์ else
รายชื่อที่สมบูรณ์มีดังนี้ -
package com.example.MyFirstApplication.pages;
public class TestIf {
public String getUser() {
return "User1";
}
}
<html title = "If Test Page"
xmlns:t = "http://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p = "tapestry:parameter">
<body>
<h1>Welcome!</h1>
<t:if test = "user">
Welcome back, ${user}
<p:else>
Please <t:pagelink page = "login">Login</t:pagelink>
</p:else>
</t:if>
</body>
</html>
เหตุการณ์คอมโพเนนต์ / การนำทางเพจ
แอปพลิเคชั่น Tapestry คือไฟล์ collection of Pagesมีปฏิสัมพันธ์ซึ่งกันและกัน จนถึงตอนนี้เราได้เรียนรู้วิธีสร้างแต่ละเพจโดยไม่มีการสื่อสารระหว่างกัน วัตถุประสงค์หลักของเหตุการณ์คอมโพเนนต์คือการจัดเตรียมการโต้ตอบระหว่างเพจ (ภายในเพจด้วย) โดยใช้เหตุการณ์ฝั่งเซิร์ฟเวอร์ เหตุการณ์คอมโพเนนต์ส่วนใหญ่เกิดจากเหตุการณ์ฝั่งไคลเอ็นต์
ตัวอย่างเช่นเมื่อผู้ใช้คลิกลิงก์ในเพจ Tapestry จะเรียกเพจเดียวกันด้วยข้อมูลเป้าหมายแทนที่จะเรียกเพจเป้าหมายและเพิ่มเหตุการณ์ที่ฝั่งเซิร์ฟเวอร์ หน้า Tapestry จะจับภาพเหตุการณ์ประมวลผลข้อมูลเป้าหมายและทำการเปลี่ยนเส้นทางฝั่งเซิร์ฟเวอร์ไปยังหน้าเป้าหมาย
Tapestry ตามด้วย Post/Redirect/Get (RPG) design patternสำหรับการนำทางหน้า ใน RPG เมื่อผู้ใช้ส่งคำขอโพสต์โดยส่งแบบฟอร์มเซิร์ฟเวอร์จะประมวลผลข้อมูลที่โพสต์ แต่จะไม่ส่งคืนการตอบกลับโดยตรง แต่จะทำการเปลี่ยนเส้นทางฝั่งไคลเอ็นต์ไปยังเพจอื่นแทนซึ่งจะแสดงผลลัพธ์ รูปแบบ RPG ใช้เพื่อป้องกันการส่งแบบฟอร์มซ้ำผ่านปุ่มย้อนกลับของเบราว์เซอร์ปุ่มรีเฟรชของเบราว์เซอร์ ฯลฯ Tapestry จัดเตรียมรูปแบบ RPG โดยให้คำขอสองประเภทต่อไปนี้
Component Event Request- คำขอประเภทนี้กำหนดเป้าหมายไปที่ส่วนประกอบเฉพาะในเพจและเพิ่มเหตุการณ์ภายในคอมโพเนนต์ คำขอนี้ทำการเปลี่ยนเส้นทางเท่านั้นและไม่ส่งออกการตอบสนอง
Render Request - คำขอประเภทนี้กำหนดเป้าหมายเพจและสตรีมการตอบกลับไปยังไคลเอนต์
เพื่อให้เข้าใจเหตุการณ์ของคอมโพเนนต์และการนำทางของหน้าเราจำเป็นต้องทราบรูปแบบ URL ของคำขอ tapestry รูปแบบ URL สำหรับคำขอทั้งสองประเภทมีดังนี้ -
Component Event Requests -
/<<page_name_with_path>>.<<component_id|event_id>>/<<context_information>>
Render Request -
/<<page_name_with_path>>/<<context_information>>
ตัวอย่างบางส่วนของรูปแบบ URL ได้แก่ -
สามารถขอหน้าดัชนีได้โดย https://«domain»/«app»/index.
หากหน้าดัชนีอยู่ภายใต้ผู้ดูแลระบบโฟลเดอร์ย่อยสามารถร้องขอได้โดย https://«domain»/«app»/admin/index.
หากผู้ใช้คลิกที่ไฟล์ ActionLink component ด้วย id test ในหน้าดัชนีจากนั้น URL จะเป็น https://«domain»/«app»/index.test.
เหตุการณ์
โดยค่าเริ่มต้น Tapestry จะเพิ่มขึ้น OnPassivate และ OnActivateกิจกรรมสำหรับคำขอทั้งหมด สำหรับประเภทการร้องขอเหตุการณ์คอมโพเนนต์ Tapestry จะเพิ่มเหตุการณ์อย่างน้อยหนึ่งเหตุการณ์ขึ้นอยู่กับส่วนประกอบ คอมโพเนนต์ ActionLink เพิ่มเหตุการณ์การดำเนินการในขณะที่คอมโพเนนต์ฟอร์มเพิ่มหลายเหตุการณ์เช่นValidate, Successฯลฯ
เหตุการณ์สามารถจัดการได้ในคลาสเพจโดยใช้ตัวจัดการเมธอดที่เกี่ยวข้อง ตัวจัดการเมธอดถูกสร้างขึ้นโดยใช้หลักการตั้งชื่อเมธอดหรือผ่าน@OnEventคำอธิบายประกอบ รูปแบบของหลักการตั้งชื่อวิธีคือOn«EventName»From«ComponentId».
เหตุการณ์การดำเนินการของคอมโพเนนต์ ActionLink กับ id test สามารถจัดการได้ด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้ -
void OnActionFromTest() {
}
@OnEvent(component = "test", name = "action")
void CustomFunctionName() {
}
หากชื่อเมธอดไม่มีองค์ประกอบเฉพาะใด ๆ เมธอดจะถูกเรียกใช้สำหรับองค์ประกอบทั้งหมดที่มีเหตุการณ์ที่ตรงกัน
void OnAction() {
}
OnPassivate และ OnActivate Event
OnPassivate ใช้เพื่อจัดเตรียมข้อมูลบริบทสำหรับตัวจัดการเหตุการณ์ OnActivate โดยทั่วไป Tapestry ให้ข้อมูลบริบทและสามารถใช้เป็นอาร์กิวเมนต์ในตัวจัดการ OnActivateevent
ตัวอย่างเช่นหากข้อมูลบริบทเป็น 3 ประเภท int ดังนั้นเหตุการณ์ OnActivate สามารถเรียกเป็น -
void OnActivate(int id) {
}
ในบางสถานการณ์อาจไม่มีข้อมูลบริบท ในสถานการณ์นี้เราสามารถจัดเตรียมข้อมูลบริบทให้กับตัวจัดการเหตุการณ์ OnActivate ผ่านตัวจัดการเหตุการณ์ OnPassivate ชนิดการส่งคืนของตัวจัดการเหตุการณ์ OnPassivate ควรใช้เป็นอาร์กิวเมนต์ของตัวจัดการเหตุการณ์ OnActivate
int OnPassivate() {
int id = 3;
return id;
}
void OnActivate(int id) {
}
ค่าส่งคืนตัวจัดการเหตุการณ์
Tapestry ปัญหาการเปลี่ยนเส้นทางหน้าตามค่าที่ส่งคืนของตัวจัดการเหตุการณ์ ตัวจัดการเหตุการณ์ควรส่งคืนค่าใดค่าหนึ่งต่อไปนี้
Null Response- ส่งคืนค่าว่าง Tapestry จะสร้าง URL ของหน้าปัจจุบันและส่งไปยังไคลเอนต์เป็นการเปลี่ยนเส้นทาง
public Object onAction() {
return null;
}
String Response- ส่งกลับค่าสตริง Tapestry จะสร้าง URL ของหน้าที่ตรงกับค่าและส่งไปยังไคลเอนต์เป็นการเปลี่ยนเส้นทาง
public String onAction() {
return "Index";
}
Class Response- ส่งคืนคลาสเพจ Tapestry จะสร้าง URL ของคลาสหน้าที่ส่งคืนและส่งไปยังไคลเอนต์เป็นการเปลี่ยนเส้นทาง
public Object onAction() {
return Index.class
}
Page Response- ส่งคืนฟิลด์ที่มีคำอธิบายประกอบด้วย @InjectPage Tapestry จะสร้าง URL ของหน้าที่แทรกและส่งไปยังไคลเอนต์เป็นการเปลี่ยนเส้นทาง
@InjectPage
private Index index;
public Object onAction(){
return index;
}
HttpError- ส่งคืนวัตถุ HTTPError Tapestry จะแสดงข้อผิดพลาด HTTP ฝั่งไคลเอ็นต์
public Object onAction(){
return new HttpError(302, "The Error message);
}
Link Response- ส่งคืนอินสแตนซ์ลิงก์โดยตรง Tapestry จะสร้าง URL จากออบเจ็กต์ Link และส่งไปยังไคลเอนต์เป็นการเปลี่ยนเส้นทาง
Stream Response - ส่งคืนไฟล์ StreamResponseวัตถุ. Tapestry จะส่งสตรีมเป็นการตอบสนองโดยตรงไปยังเบราว์เซอร์ไคลเอนต์ ใช้เพื่อสร้างรายงานและรูปภาพโดยตรงและส่งไปยังไคลเอนต์
Url Response - ส่งคืนไฟล์ java.net.URLวัตถุ. Tapestry จะได้รับ URL ที่สอดคล้องกันจากวัตถุและส่งไปยังไคลเอนต์เป็นการเปลี่ยนเส้นทาง
Object Response- ส่งคืนค่าใด ๆ นอกเหนือจากค่าที่ระบุไว้ข้างต้น Tapestry จะทำให้เกิดข้อผิดพลาด
บริบทเหตุการณ์
โดยทั่วไปตัวจัดการเหตุการณ์สามารถรับข้อมูลบริบทโดยใช้อาร์กิวเมนต์ ตัวอย่างเช่นหากข้อมูลบริบทเป็น 3 ประเภท int ตัวจัดการเหตุการณ์จะเป็น -
Object onActionFromTest(int id) {
}
Tapestry จัดการข้อมูลบริบทอย่างเหมาะสมและจัดเตรียมวิธีการผ่านอาร์กิวเมนต์ บางครั้ง Tapestry อาจไม่สามารถจัดการได้อย่างถูกต้องเนื่องจากความซับซ้อนของการเขียนโปรแกรม เมื่อถึงเวลานั้นเราอาจได้รับข้อมูลบริบทที่สมบูรณ์และดำเนินการเอง
Object onActionFromEdit(EventContext context) {
if (context.getCount() > 0) {
this.selectedId = context.get(0);
} else {
alertManager.warn("Please select a document.");
return null;
}
}