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; 
   } 
}