คำนำ
ทำไมต้องพิมพ์ตัวแปลงใน struts2?
: struts2 สามารถให้การแปลงอัตโนมัติสำหรับ 8 ประเภทดั้งเดิมใน Java และประเภททั่วไปเช่นสตริงและวันที่
แต่สิ่งนี้ไม่สามารถตอบสนองความต้องการของเราได้อย่างแน่นอนหากเราต้องการรวมข้อมูลหน้าเว็บเข้ากับ Javabean เมื่อคุณไปดำเนินการสิ่งที่การกระทำได้รับคือวัตถุดังนั้นข้อกำหนดนี้ต้องการให้เราใช้ตัวแปลงประเภท
เวลาส่วนใหญ่การใช้ตัวแปลงประเภทในตัวและตัวแปลงประเภทที่ใช้ OGNL ที่จัดทำโดย Framework Struts2 สามารถตอบสนองความต้องการการแปลงประเภทส่วนใหญ่ได้ อย่างไรก็ตามมีบางกรณีพิเศษที่สตริงของรูปแบบที่ระบุอาจต้องแปลงเป็นวัตถุคอมโพสิตและจำเป็นต้องมีตัวแปลงประเภทที่กำหนดเอง ตัวอย่างเช่นหากไคลเอนต์ส่งสตริงเช่น "เจลลี่ | 123456" ไปยังเซิร์ฟเวอร์เราต้องแปลงสตริงนี้เป็นอินสแตนซ์ประเภทผู้ใช้ด้วย "เจลลี่" เป็นชื่อผู้ใช้และ "123456" เป็นรหัสผ่านผู้ใช้
คลาสการแปลงประเภทที่กำหนดเอง
มีหน้าแผนกต้อนรับแบบนี้:
<form action = "เข้าสู่ระบบ" method = "post"> ผู้ใช้: <อินพุต type = "text" name = "userInfo"> <br> <อินพุต type = "submit" value = "Convert"> </form>
รหัสการดำเนินการที่เกี่ยวข้องคือ:
ผู้ใช้ส่วนตัว // นี่คือเคล็ดลับสตริงส่วนตัวชนิดผสม; setusers โมฆะสาธารณะ (ผู้ใช้ผู้ใช้) {this.user = user;} ผู้ใช้สาธารณะ getUser () {return user;}เราหวังว่าผู้ใช้จะป้อนสตริงในหน้าเบื้องหน้าด้วยรูปแบบ "ชื่อผู้ใช้ | รหัสผ่าน" และแปลงสตริงในรูปแบบของ "ชื่อผู้ใช้ | รหัสผ่าน" เป็นประเภทผู้ใช้ผ่านตัวแปลงประเภทที่กำหนดเอง มาพูดคุยกันเกี่ยวกับวิธีการใช้ตัวแปลงประเภทที่กำหนดเอง
ตัวแปลงประเภทของ Struts2 นั้นยังคงขึ้นอยู่กับเฟรมเวิร์ก OGNL มีอินเทอร์เฟซ Typeconverter ในโครงการ OGNL ซึ่งเป็นอินเทอร์เฟซที่ต้องใช้งานโดยตัวแปลงประเภทที่กำหนดเอง รหัสคำจำกัดความของอินเทอร์เฟซนี้มีดังนี้:
// OGNL ให้ Typeconverter อินเทอร์เฟซสาธารณะ {วัตถุสาธารณะ convertValue (บริบทแผนที่, เป้าหมายวัตถุ, สมาชิก, สตริงคุณสมบัติ Name, ค่าวัตถุ, คลาส totype);}ในการใช้ตัวแปลงประเภทคุณต้องใช้ Typeconverter ด้านบน แต่วิธีการในอินเทอร์เฟซข้างต้นนั้นซับซ้อนเกินไปดังนั้นโครงการ OGNL ยังให้คลาสการใช้งานสำหรับอินเทอร์เฟซนี้: DefaultTypeconverter ซึ่งมักจะใช้คลาสนี้เพื่อใช้ตัวแปลงประเภทที่กำหนดเอง การใช้ตัวแปลงประเภทที่กำหนดเองนั้นจำเป็นต้องมีการเอาชนะวิธีการ ConvertValue ของคลาส DefaultTypeconverter
ต่อไปนี้คือคลาสการแปลงที่แปลงเป็นอินสแตนซ์ของคลาสผู้ใช้:
คลาสสาธารณะ userConverter ขยาย defaultTypeconverter {วัตถุสาธารณะ convertValue (บริบทแผนที่ค่าวัตถุ, คลาส totype) {ถ้า (totype == user.class) {// เมื่อคุณต้องการแปลงสตริงเป็นประเภทผู้ใช้ // พารามิเตอร์ของระบบเป็นสตริงสตริง // สร้างผู้ใช้อินสแตนซ์ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); // จะประมวลผลองค์ประกอบอาร์เรย์แรกของอาร์เรย์พารามิเตอร์คำขอและแบ่งสตริงออกเป็นสองสตริงด้วย '|' สตริงสัญลักษณ์ [] uservalues = params [0] .split ("// |"); // กำหนดค่าให้กับผู้ใช้อินสแตนซ์ผู้ใช้ setName (uservalues [0]); user.setPassword (uservalues [1]); ผู้ใช้ส่งคืน; } อื่นถ้า (totype == string.class) {// เมื่อจำเป็นต้องแปลงประเภทผู้ใช้เป็นค่าผู้ใช้สตริง = (ผู้ใช้) ส่งคืน "<" + user.getName () + "|" + user.getPassword () + ">"; } return null; -ฟังก์ชั่นของวิธี ConvertValue นั้นง่ายมาก วิธีนี้มีหน้าที่รับผิดชอบในการแปลงประเภท แต่การแปลงนี้เป็นแบบสองทิศทาง ประเภทเป้าหมายจะถูกตัดสินตามพารามิเตอร์ totype จากนั้นเราสามารถใช้ตรรกะการแปลงในสองทิศทาง
ลงทะเบียนตัวแปลงประเภท
การมีตัวแปลงประเภทไม่เพียงพอเนื่องจากเฟรมเวิร์ก Struts2 ไม่ทราบว่าจะใช้ตัวแปลงประเภทเหล่านี้เมื่อใดดังนั้นตัวแปลงประเภทจะต้องลงทะเบียนในเว็บแอปพลิเคชันดังนั้นเฟรมเวิร์ก Struts2 สามารถใช้ตัวแปลงประเภทนี้ได้ตามปกติ
struts2 ส่วนใหญ่รองรับสองวิธีต่อไปนี้ในการลงทะเบียนประเภทตัวแปลง:
มาพูดคุยเกี่ยวกับสองวิธีข้างต้นในการลงทะเบียนตัวแปลงประเภท
ตัวแปลงประเภทท้องถิ่น
Struts2 อนุญาตให้นักพัฒนาระบุข้อมูลการกำหนดค่าสำหรับการแปลงประเภทผ่านไฟล์การแปลงประเภทท้องถิ่น ไฟล์การแปลงประเภทเป็นไฟล์คุณสมบัติทั่วไป (*.properties) ชื่อไฟล์ของไฟล์การแปลงประเภทโลคัลควรอยู่ในฟอร์ม ActionName -Conversion.properties โดยที่ ActionName เป็นชื่อการกระทำที่ต้องแปลงเป็นไฟล์ด้วยประเภทนี้และสตริงที่ตามมา ควรวางไฟล์การแปลงประเภทในตำแหน่งเดียวกับไฟล์คลาสการกระทำ
หลังจากพูดคุยเกี่ยวกับไฟล์การแปลงประเภทท้องถิ่นให้พูดคุยเกี่ยวกับตัวแปลงประเภทท้องถิ่นที่ลงทะเบียนต่อไป ในการลงทะเบียนตัวแปลงประเภทท้องถิ่นคุณจะต้องเพิ่มบรรทัดการกำหนดค่าต่อไปนี้ในไฟล์แปลงประเภทท้องถิ่น:
<propname> = <ConverterClass>
แทนที่ <propname> ด้านบนด้วยคุณสมบัติที่จำเป็นต้องแปลงประเภทและแทนที่ <converterClass> ด้วยคลาสการใช้งานของตัวแปลงประเภท สำหรับคลาส USERCONVERTER ที่นำมาใช้ด้านบนจำเป็นต้องกำหนดค่าในไฟล์การแปลงประเภทท้องถิ่นดังนี้:
# ในการระบุแอตทริบิวต์ของผู้ใช้คุณต้องใช้คลาส USERCONVERTER เพื่อกรอกประเภทการแปลงผู้ใช้ = com.jellythink.practise.userconverter
ตัวแปลงประเภททั่วโลก
ข้อ จำกัด ของตัวแปลงประเภทท้องถิ่นนั้นชัดเจนเกินไปและสามารถทำงานกับการกระทำที่ระบุและคุณสมบัติที่ระบุเท่านั้น อย่างไรก็ตามหากการกระทำหลายอย่างในแอปพลิเคชันมีแอตทริบิวต์ประเภทผู้ใช้หรือหนึ่งการกระทำมีคุณลักษณะของผู้ใช้หลายประเภทมันจะเหมาะสมกว่าที่จะใช้ตัวแปลงประเภททั่วโลก
ตัวแปลงประเภททั่วโลกไม่ทำงานกับคุณสมบัติที่ระบุของการกระทำที่ระบุ แต่ตามประเภทที่ระบุ ตัวอย่างเช่นมันใช้ได้กับคุณสมบัติทั้งหมดของประเภท com.jellythink.practise.user
การลงทะเบียนตัวแปลงประเภททั่วโลกควรจัดเตรียมไฟล์ Xwork-Conversion.properties ซึ่งเป็นไฟล์ตัวแปลงประเภททั่วโลก คุณต้องวางไฟล์ไว้ใต้เส้นทาง Web-Inf/คลาสโดยตรงของเว็บแอปพลิเคชัน
เนื้อหาไฟล์การแปลงประเภททั่วโลกประกอบด้วยรายการ <proptype> = <convertClass> หลายรายการ แทนที่ proptype ด้วยประเภทที่ต้องเปลี่ยนประเภทและแทนที่ convertClass ด้วยคลาสการใช้งานของตัวแปลงประเภท สำหรับคลาส USERCONVERTER ที่นำมาใช้ด้านบนจำเป็นต้องกำหนดค่าในไฟล์การแปลงประเภททั่วโลกดังนี้:
com.jellythink.practise.user = com.jellythink.practise.userconverter
"ท้องถิ่น" vs "ทั่วโลก"
การแปลงประเภทท้องถิ่นสามารถแปลงแอตทริบิวต์ที่ระบุของการกระทำที่ระบุเท่านั้น ไม่ว่าแอตทริบิวต์ของการกระทำจะเป็นอาร์เรย์หรือประเภทการรวบรวมวิธีการแปลงของตัวแปลงจะแปลงแอตทริบิวต์เพียงครั้งเดียวเท่านั้น หากการกระทำมีผู้ใช้รายการ <user> ผู้ใช้ตัวแปลงประเภทโลคัลจะเรียกเมธอด convertValue () เพียงครั้งเดียวเท่านั้นซึ่งจะแปลงพารามิเตอร์ขอพารามิเตอร์ของผู้ใช้เป็นรายการคอลเลกชันรายการ <user> ในครั้งเดียว
ตัวแปลงประเภททั่วโลกจะแปลงการกระทำเฉพาะทุกประเภท หากแอ็ตทริบิวต์ของแอ็คชั่นเป็นประเภทอาร์เรย์หรือประเภทการรวบรวมและองค์ประกอบอาร์เรย์หรือคอลเลกชันเป็นวิธีที่ต้องใช้ตัวแปลงในการแปลงดังนั้นตัวแปลงประเภทส่วนกลางจะไม่แปลงแอตทริบิวต์ชุดทั้งหมด แต่จะแปลงแต่ละองค์ประกอบของแอตทริบิวต์ชุด นั่นคือเมื่อแอตทริบิวต์เป็นอาร์เรย์หรือคอลเลกชันอาร์เรย์หรือคอลเลกชันมีองค์ประกอบหลายอย่างของประเภทจากนั้นวิธี ConvertValue () จะถูกเรียกว่าหลายครั้ง
หลังจากทำความคุ้นเคยกับความแตกต่างระหว่างทั้งสองฉันจะให้ความสนใจกับมันมากขึ้นในการทำงานในอนาคตของฉัน โดยเฉพาะอย่างยิ่งความแตกต่างระหว่างอาร์เรย์และองค์ประกอบที่ตั้งไว้เมื่อแปลง
ตัวแปลงประเภทที่กำหนดเองขึ้นอยู่กับ struts2
ข้างต้นแนะนำทิศทางการแปลงโดยสืบทอดคลาส DefaultTypeconverter ในวิธี ConvertValue ทิศทางการแปลงจะถูกตัดสินโดยการตัดสินพารามิเตอร์ TOTYPE จากนั้นตรรกะการแปลงสำหรับทิศทางการแปลงที่แตกต่างกันจะถูกนำมาใช้แยกกัน ในเฟรมเวิร์ก Struts2 เพื่อลดความซับซ้อนของการใช้งานของตัวแปลงประเภทคลาสบทคัดย่อ strutstypeconverter นั้นมีให้เป็นพิเศษซึ่งเป็นคลาสย่อยของคลาส DefaultTypeconverter มันได้ใช้วิธี ConvertValue ของคลาส DefaultTypeconverter; เมื่อใช้วิธีนี้จะเปลี่ยนการแปลงในสองทิศทางที่แตกต่างกันโดยการตัดสินพารามิเตอร์ totype ในวิธี ConvertValue เป็นวิธีการเรียกใช้สองวิธีที่แตกต่างกันต่อไปนี้:
สิ่งที่เราต้องทำคือการสืบทอดคลาสบทคัดย่อ strutstypeconverter และใช้สองวิธีที่เป็นนามธรรม: ConvertFromString และ ConvertToString
รหัสที่แก้ไขมีดังนี้:
คลาสสาธารณะ UserConverter ขยาย strutstypeconverter {วัตถุสาธารณะ ConvertFromString (บริบทแผนที่, สตริง [] ค่า, คลาส toClass) {ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); สตริง [] uservalues = ค่า [0] .split ("// |"); user.setName (uservalues [0]); user.setPassword (uservalues [1]); ผู้ใช้ส่งคืน; } String Public String ConvertToString (MAP Context, Object O) {// เมื่อจำเป็นต้องแปลงประเภทผู้ใช้เป็นผู้ใช้สตริงผู้ใช้ = (ผู้ใช้) o; ส่งคืน "<" + user.getName () + "|" + user.getPassword () + ">"; -สรุป
บทความนี้สรุปตัวแปลงประเภทที่กำหนดเองในรายละเอียด struts2 และแนวคิดโดยรวมมีดังนี้:
เพียงไม่กี่ขั้นตอนเพื่อให้ตัวแปลงประเภทที่กำหนดเองเสร็จสิ้น
โอเคข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com