1. ความหมายของการแปลงประเภท
สำหรับกรอบงาน MVC อัจฉริยะ เป็นสิ่งที่หลีกเลี่ยงไม่ได้ที่จะใช้การแปลงประเภท เนื่องจากพารามิเตอร์คำขอของแอปพลิเคชันโครงสร้าง B/S (เบราว์เซอร์/เซิร์ฟเวอร์) ถูกส่งไปยังเซิร์ฟเวอร์ผ่านเบราว์เซอร์ พารามิเตอร์เหล่านี้จึงไม่สามารถมีประเภทข้อมูลที่หลากหลายได้ ดังนั้นประเภทข้อมูล การแปลงจะต้องเสร็จสิ้นบนฝั่งเซิร์ฟเวอร์
กรอบงาน MVC เป็นโซลูชันเลเยอร์การนำเสนอและควรให้การสนับสนุนการแปลงประเภท Struts2 ให้การสนับสนุนการแปลงประเภทที่มีประสิทธิภาพมาก
2. การประมวลผลข้อมูลเลเยอร์การนำเสนอ
1. สำหรับเว็บแอปพลิเคชัน เลเยอร์การนำเสนอส่วนใหญ่จะใช้เพื่อโต้ตอบกับผู้ใช้ รวมถึงการรวบรวมข้อมูลอินพุตของผู้ใช้และการนำเสนอสถานะของเซิร์ฟเวอร์แก่ผู้ใช้ ดังนั้นการไหลของข้อมูลในเลเยอร์การนำเสนอจึงมีสองทิศทางเป็นหลัก: ข้อมูลอินพุตและข้อมูลเอาต์พุต
2. สำหรับข้อมูลอินพุต: จำเป็นต้องแปลงข้อมูลสตริงเป็นข้อมูลหลายประเภทให้เสร็จสิ้น โดยปกติแล้วโปรแกรมจะไม่สามารถดำเนินการให้เสร็จสิ้นได้โดยอัตโนมัติ และจำเป็นต้องแปลงเป็นโค้ดด้วยตนเอง
3. สำหรับข้อมูลเอาต์พุต: ทั้ง java และ jsp รองรับเอาต์พุตโดยตรงของข้อมูลหลายประเภท
4. การประมวลผลข้อมูลอีกอย่างหนึ่งในเลเยอร์การนำเสนอคือ: การตรวจสอบข้อมูล ซึ่งแบ่งออกเป็นการตรวจสอบไคลเอนต์และการตรวจสอบฝั่งเซิร์ฟเวอร์ ซึ่งจะอธิบายรายละเอียดในภายหลัง
3. การแปลงประเภท
1. พารามิเตอร์ HTTP เป็นประเภทสตริงทั้งหมด ข้อมูลที่บันทึกไว้อาจเป็นสตริง ตัวเลข บูลีน วันที่และเวลา ฯลฯ หรือประเภท JavaBean การแปลงชนิดด้วยตนเอง เช่น การแปลงสตริงเป็นวันที่ โดย: รับสตริงผ่านเมธอด request.getParameter ตรวจสอบว่าสตริงว่างเปล่าหรือไม่ การแปลงสตริงเป็นอ็อบเจ็กต์ Date ผ่านเมธอด DateFormat.parse
2. การแปลงแบบ Struts2
การแปลงชนิดในตัว Struts2
สตริงและบูลีนทำให้การแปลงระหว่างค่าสตริงและบูลีนเสร็จสมบูรณ์
การแปลงสตริงและถ่านระหว่างสตริงและอักขระธรรมดา
String, int และ Integer ทำการแปลงระหว่างสตริงและจำนวนเต็มให้เสร็จสมบูรณ์
สตริงและลองการแปลงระหว่างค่าสตริงและจำนวนเต็มยาวเสร็จสมบูรณ์
สตริง สอง และสองเท่าทำให้การแปลงสตริงและค่าจุดทศนิยมที่มีความแม่นยำสองเท่าสมบูรณ์
สตริงและโฟลตทำให้การแปลงระหว่างสตริงและจุดลอยตัวที่มีความแม่นยำเดียวเสร็จสมบูรณ์
สตริงและวันที่ทำการแปลงระหว่างประเภทสตริงและวันที่ให้เสร็จสมบูรณ์ รูปแบบวันที่ใช้รูปแบบ SHORT ของ Locale ที่ผู้ใช้ร้องขอรูปแบบ
สตริงและอาร์เรย์ ในกรณีเริ่มต้น องค์ประกอบอาร์เรย์จะเป็นสตริง หากผู้ใช้กำหนดตัวแปลงชนิด ก็สามารถเป็นชนิดข้อมูลคอมโพสิตอื่นๆ ได้เช่นกัน
สตริงและแผนที่และรายการ
การแปลงชนิดในตัว Struts2
สตริงและบูลีนทำให้การแปลงระหว่างค่าสตริงและบูลีนเสร็จสมบูรณ์
การแปลงสตริงและถ่านระหว่างสตริงและอักขระธรรมดา
String, int และ Integer ทำการแปลงระหว่างสตริงและจำนวนเต็มให้เสร็จสมบูรณ์
สตริงและลองการแปลงระหว่างค่าสตริงและจำนวนเต็มยาวเสร็จสมบูรณ์
สตริง สอง และสองเท่าทำให้การแปลงสตริงและค่าจุดทศนิยมที่มีความแม่นยำสองเท่าสมบูรณ์
สตริงและโฟลตทำให้การแปลงระหว่างสตริงและจุดลอยตัวที่มีความแม่นยำเดียวเสร็จสมบูรณ์
สตริงและวันที่ทำการแปลงระหว่างประเภทสตริงและวันที่ให้เสร็จสมบูรณ์ รูปแบบวันที่ใช้รูปแบบ SHORT ของ Locale ที่ผู้ใช้ร้องขอรูปแบบ
สตริงและอาร์เรย์ ในกรณีเริ่มต้น องค์ประกอบอาร์เรย์จะเป็นสตริง หากผู้ใช้กำหนดตัวแปลงชนิด ก็สามารถเป็นชนิดข้อมูลคอมโพสิตอื่นๆ ได้เช่นกัน
สตริงและแผนที่และรายการ
3. การแปลงชนิดในตัว
4. API การแปลงประเภท Struts
ตัวแปลงประเภทของ Struts2 ถูกนำมาใช้จริงตาม OGNL มีอินเทอร์เฟซ ognl.TypeConverter ในโปรเจ็กต์ OGNL อินเทอร์เฟซนี้เป็นอินเทอร์เฟซที่ต้องนำไปใช้เพื่อใช้ตัวแปลงประเภท อินเทอร์เฟซถูกกำหนดดังนี้:
TypeConverter อินเทอร์เฟซสาธารณะ {
วัตถุสาธารณะแปลงค่า (แมป arg0, วัตถุ arg1, สมาชิก arg2, สตริง arg3,
วัตถุ arg4, คลาส arg5) {
กลับเป็นโมฆะ;
-
หากต้องการใช้ตัวแปลงประเภท คุณต้องใช้ TypeConverter ด้านบน อย่างไรก็ตาม วิธีการในอินเทอร์เฟซด้านบนนั้นซับซ้อนเกินไป ดังนั้นโปรเจ็กต์ OGNL จึงจัดเตรียมคลาสการใช้งานของอินเทอร์เฟซนี้: ognl.DefaultTypeConverter คุณสามารถใช้ตัวแปลงประเภทของคุณเองได้ สืบทอดคลาสนี้ คลาสถูกกำหนดดังนี้:
คลาสสาธารณะ DefaultTypeConverter ขยายวัตถุที่ใช้ TypeConverter {
วัตถุสาธารณะ ConvertValue (แมป <สตริง, วัตถุ> บริบท, Objectvalue, ClasstoType) {
-
……//วิธีการอื่นๆ
-
บทบาทของวิธี ConvertValue คือการแปลงประเภทให้เสร็จสมบูรณ์ แต่การแปลงชนิดนี้เป็นแบบสองทิศทาง เมื่อจำเป็นต้องแปลงสตริงเป็นอินสแตนซ์ของวัตถุ วิธีการนี้ก็จะถูกใช้ เมื่ออินสแตนซ์ของวัตถุถูกแปลงเป็นสตริง วิธีการนี้ก็จะถูกแปลงเช่นกัน ใช้แล้ว. การแปลงนี้ดำเนินการผ่านประเภทพารามิเตอร์ toType ซึ่งเป็นประเภทเป้าหมายที่ต้องแปลง ดังนั้น จึงสามารถกำหนดทิศทางการแปลงตามพารามิเตอร์ toType
พารามิเตอร์วิธี ConvertValue และความหมายที่ส่งคืน พารามิเตอร์แรก: บริบทคือบริบทของสภาพแวดล้อมการแปลงประเภท พารามิเตอร์ตัวที่สอง: value คือพารามิเตอร์ที่ต้องแปลงด้วย
พารามิเตอร์ที่สาม: toType คือประเภทเป้าหมายที่แปลงแล้ว ค่าที่ส่งคืนของวิธีนี้คือมูลค่าหลังการแปลงประเภท ประเภทของค่าจะเปลี่ยนไปตามทิศทางของการแปลงด้วย จะเห็นได้ว่าเมธอด ConvertValue ที่แปลงแล้วยอมรับค่าที่จำเป็นต้องแปลง ประเภทเป้าหมายที่ต้องแปลงคือพารามิเตอร์ จากนั้นจะส่งกลับค่าเป้าหมายที่แปลงแล้ว
เหตุใด Value จึงเป็นอาร์เรย์สตริง
สำหรับตัวแปลง DefaultTypeConverter จะต้องคำนึงถึงสถานการณ์ที่พบบ่อยที่สุด ดังนั้นจึงถือว่าพารามิเตอร์คำขอทั้งหมดเป็นอาร์เรย์สตริงแทนที่จะเป็นสตริง เทียบเท่ากับค่าพารามิเตอร์ที่ได้รับจาก getParameterValues()
4. การใช้ตัวแปลงประเภท
1. หน้าลงทะเบียนขั้นตอนแรก
2. ขั้นตอนที่สอง: ใช้คลาสการห่อหุ้มผู้ใช้
3. ขั้นตอนที่สาม: ปรับใช้คลาส Action
5. ขั้นตอนที่ 5: ลงทะเบียนตัวแปลงประเภท มีวิธีการลงทะเบียนสามวิธี:
1. ลงทะเบียนตัวแปลงชนิดโลคัล: ตัวแปลงชนิดโลคัลใช้งานได้กับคุณสมบัติของการดำเนินการบางอย่างเท่านั้น
2. ลงทะเบียนตัวแปลงประเภทสากล: ตัวแปลงประเภทสากลจะมีผลกับคุณลักษณะเฉพาะทั้งหมดของการดำเนินการ
3. ใช้คำอธิบายประกอบ JDK1.5 เพื่อลงทะเบียนตัวแปลงประเภท: สร้างตัวแปลงประเภทผ่านการลงทะเบียน
6. รูปแบบชื่อไฟล์การลงทะเบียนการลงทะเบียนตัวแปลงบางส่วน: ActionName-conversion.properties: ActionName คือชื่อคลาสของการดำเนินการที่ต้องการให้ตัวแปลงมีผล และสตริง -conversion.properties ต่อไปนี้เป็นไฟล์คุณสมบัติทั่วไปเมื่อทำการแก้ไขบางส่วนหรือ ของไฟล์มากขึ้น ประกอบด้วยคู่คีย์-ค่า เนื้อหาของไฟล์คือ: propertyName = type คลาสตัวแปลง ต่อไปนี้เป็นเนื้อหาของไฟล์ UserAction-conversion.properties:
#ระบุว่าแอตทริบิวต์ผู้ใช้ใน UserAction จำเป็นต้องใช้คลาส redarmy.user.UserConverter เพื่อทำการแปลงประเภทให้เสร็จสมบูรณ์
ผู้ใช้=redarmy.user.UserConverter
หมายเหตุ: ไฟล์คุณสมบัติข้างต้นจะต้องอยู่ในแพ็คเกจเดียวกันกับ UserAction นั่นคือ ในกรณีข้างต้น สามารถใช้วิธีการข้างต้นเพื่อให้ได้การแปลงประเภทท้องถิ่น
7. รูปแบบไฟล์ของชื่อการลงทะเบียนตัวแปลงประเภทสากล: ไฟล์ xwork-conversion.properties ไฟล์นี้เป็นไฟล์คุณสมบัติด้วย และเนื้อหายังประกอบด้วยรายการ "ประเภทคอมโพสิต = คลาสตัวแปลงประเภทที่สอดคล้องกัน"
ต่อไปนี้เป็นเนื้อหาของไฟล์ xwork-conversion.properties:
#ระบุตัวแปลงประเภทของคลาส redarmy.user.User ทั้งหมดเป็น redarmy.user.UserConverter
redarmy.user.User=redarmy.user.UserConverter
หมายเหตุ: ไฟล์ xwork-conversion.properties ต้องถูกสร้างขึ้นภายใต้โฟลเดอร์คลาส นั่นคือภายใต้ src
5. การแปลงประเภทแบบกำหนดเอง Struts2
คลาส StrutsTypeConverter มีอยู่ใน Struts2 เพื่อทำให้การออกแบบการแปลงประเภทแบบกำหนดเองง่ายขึ้น คลาสนี้มีวิธีนามธรรมสองวิธีที่ต้องนำไปใช้:
(1) วัตถุสาธารณะแปลงจากสตริง (บริบทแมป, ค่าสตริง [], คลาส toClass);
พารามิเตอร์วิธีการประมวลผลที่ใช้ในการแปลงข้อมูลประเภทสตริงเป็นประเภทที่กำหนดเอง:
บริบท --- ข้อมูลเชิงบริบทที่เกี่ยวข้องกับการดำเนินการ
ค่า ---- ค่าพารามิเตอร์ที่ได้รับจากคำขอ
toClass --- ประเภทเป้าหมายที่ต้องการแปลง
(2) สตริงสาธารณะ ConvertToString (บริบทของแผนที่, วัตถุ obj);
ใช้เพื่อแปลงประเภทที่กำหนดเองเป็นสตริง
พารามิเตอร์:
บริบท --- ข้อมูลเชิงบริบทที่เกี่ยวข้องกับการดำเนินการ
obj --- วัตถุประเภทที่กำหนดเอง
ตัวอย่างการวิเคราะห์: การออกแบบและการกำหนดค่าการแปลงประเภทวันที่
(1) ออกแบบ MyDateTypeConverter สืบทอด StrutsTypeConverter และครอบคลุมสองวิธี โค้ดอ้างอิงมีดังนี้:
วัตถุสาธารณะ ConvertFromString (บริบทแมป ค่าสตริง [] คลาส toClass) {
SimpleDateFormat sdf = SimpleDateFormat ใหม่ ("yyyy-MM-dd");
พยายาม{
วันที่ v = sdf.parse (ค่า [0]);
กลับวี;
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
คืนวันที่ใหม่ ();
-
-
ต่อ
สตริงสาธารณะ ConvertToString (บริบทของแผนที่, วัตถุ obj) {
SimpleDateFormat sdf = SimpleDateFormat ใหม่ ("ปปปป ปี MM เดือน dd วัน");
วันที่ v = (วันที่)obj;
กลับ sdf.format(v);
-
แม้ว่า Struts2 จะรองรับการแปลงสตริงและวันที่ตามค่าเริ่มต้น แต่จะรองรับเฉพาะรูปแบบสั้นและการแปลงรูปแบบวันที่ที่แปลเป็นภาษาท้องถิ่นเท่านั้น ซึ่งอาจไม่ตรงตามความต้องการของคุณ เราจำเป็นต้องใช้การแปลงประเภทของเราเอง
(2) เพิ่มแอตทริบิวต์วันเกิดให้กับคลาส UserInfo ซึ่งมีประเภทเป็น java.util.Date
ข้อมูลผู้ใช้คลาสสาธารณะ {
รหัสจำนวนเต็มส่วนตัว
ชื่อสตริงส่วนตัว
รหัสผ่านสตริงส่วนตัว
วันเกิดส่วนตัว;
-
-
(3) กำหนดค่าตัวแปลงประเภทสำหรับส่วนประกอบ UserInfo ขั้นแรก สร้างไฟล์คุณสมบัติตามชื่อคลาสของส่วนประกอบ UserInfo รูปแบบการตั้งชื่อไฟล์คือ class name-conversion.properties
ตัวอย่างเช่น UserInfo-conversion.properties
ไฟล์นี้ต้องอยู่ในแพ็คเกจเดียวกันกับคอมโพเนนต์ UserInfo
รูปแบบเนื้อหาของไฟล์ฟีเจอร์นี้เป็นดังนี้:
วันเกิด=demo.converter.MyDateTypeConverter
แสดงให้เห็น:
birthday เป็นชื่อแอ็ตทริบิวต์ของประเภท java.util.Date ในคอมโพเนนต์ UserInfo
demo.converter.MyDateTypeConverter เป็นคลาสการใช้งานการแปลงแบบกำหนดเอง
กรอบงาน Strus2 คำนึงถึงเรื่องนี้และให้วิธีง่ายๆ ในการจัดการ
หากต้องการกำหนดค่าตัวแปลงชนิดในระดับโกลบอล เพียงเขียนไฟล์คุณสมบัติชื่อ xwork-conversion.properties ซึ่งจะต้องอยู่ในไดเร็กทอรี /WEB-INF/classes โดยมีเนื้อหาดังต่อไปนี้:
java.util.Date=demo.converter.MyDateTypeConverter
6. ตัวแปลงประเภทแบบกำหนดเอง
คุณสมบัติประเภท java.util.Date สามารถรับค่าพารามิเตอร์คำขอในรูปแบบ 2009-07-20 แต่หากเราต้องการรับพารามิเตอร์คำขอในรูปแบบ 20091221 เราจะต้องกำหนดตัวแปลงประเภท ไม่เช่นนั้น struts2 จะไม่สามารถแปลงประเภทให้เสร็จสิ้นได้โดยอัตโนมัติ
นำเข้า java.util.Date;
HelloWorldAction คลาสสาธารณะ {
เวลาสร้างวันที่ส่วนตัว
วันที่สาธารณะ getCreatetime () {
ส่งคืนเวลาสร้างสรรค์;
-
โมฆะสาธารณะ setCreatetime (วันที่สร้างเวลา) {
นี้.createtime = createtime;
-
-
DateConverter คลาสสาธารณะขยาย DefaultTypeConverter {
@Override วัตถุสาธารณะ ConvertValue (บริบทของแผนที่, ค่าวัตถุ, Class toType) {
SimpleDateFormat dateFormat = SimpleDateFormat ใหม่ ("yyyyMMdd");
พยายาม {
if(toType == Date.class){//เมื่อสตริงถูกแปลงเป็นประเภทวันที่
สตริง [] params = (สตริง []) ค่า; // Request.getParameterValues ()
วันที่ส่งคืนFormat.parse(params[0]);
}else if(toType == String.class){//เมื่อ Date ถูกแปลงเป็นสตริง
วันที่ วันที่ = ค่า (วันที่);
วันที่ส่งคืนFormat.format (วันที่);
-
} จับ (ParseException อี) {}
กลับเป็นโมฆะ;
-
-
ลงทะเบียนตัวแปลงประเภทข้างต้นเป็นตัวแปลงประเภทในเครื่อง:
วางไฟล์ ActionClassName-conversion.properties ไว้ใต้แพ็กเกจซึ่งมีคลาส Action อยู่ ชื่อคลาสของ Action และ -conversion.properties ต่อไปนี้เป็นวิธีการเขียนแบบตายตัว สำหรับตัวอย่างนี้ ชื่อของไฟล์ควรเป็น HelloWorldAction-conversion.properties เนื้อหาในไฟล์คุณสมบัติคือ:
ชื่อคุณสมบัติ = ชื่อคลาสเต็มของตัวแปลงชนิด สำหรับตัวอย่างนี้ เนื้อหาของไฟล์ HelloWorldAction-conversion.properties คือ:
createtime= cn.csdn.conversion.DateConverter
ลงทะเบียนตัวแปลงประเภทข้างต้นเป็นตัวแปลงประเภทสากล:
วางไฟล์ xwork-conversion.properties ไว้ใต้ WEB-INF/classes เนื้อหาในไฟล์คุณสมบัติคือ:
ประเภทที่จะแปลง = ชื่อคลาสแบบเต็มของตัวแปลงประเภท สำหรับตัวอย่างนี้ เนื้อหาของไฟล์ xwork-conversion.properties คือ:
java.util.Date= cn.csdn.conversion.DateConverter
คุณสมบัติประเภท java.util.Date สามารถรับค่าพารามิเตอร์คำขอในรูปแบบ 2009-07-20 แต่หากเราต้องการรับพารามิเตอร์คำขอในรูปแบบ 20091221 เราจะต้องกำหนดตัวแปลงประเภท ไม่เช่นนั้น struts2 จะไม่สามารถแปลงประเภทให้เสร็จสิ้นได้โดยอัตโนมัติ
นำเข้า java.util.Date;
HelloWorldAction ระดับสาธารณะ {
เวลาสร้างวันที่ส่วนตัว
วันที่สาธารณะ getCreatetime () {
ส่งคืนเวลาสร้างสรรค์;
-
โมฆะสาธารณะ setCreatetime (วันที่เวลาสร้าง) {
this.createtime = เวลาสร้างสรรค์;
-
-
DateConverter คลาสสาธารณะขยาย DefaultTypeConverter {
@Override วัตถุสาธารณะ ConvertValue (บริบทของแผนที่, ค่าวัตถุ, Class toType) {
SimpleDateFormat dateFormat = SimpleDateFormat ใหม่ ("yyyyMMdd");
พยายาม {
if(toType == Date.class){//เมื่อสตริงถูกแปลงเป็นประเภทวันที่
สตริง [] params = (สตริง []) ค่า; // Request.getParameterValues ()
วันที่ส่งคืนFormat.parse(params[0]);
}else if(toType == String.class){//เมื่อ Date ถูกแปลงเป็นสตริง
วันที่ วันที่ = ค่า (วันที่);
วันที่ส่งคืนFormat.format (วันที่);
-
} จับ (ParseException อี) {}
กลับเป็นโมฆะ;
-
-
ลงทะเบียนตัวแปลงประเภทข้างต้นเป็นตัวแปลงประเภทในเครื่อง:
วางไฟล์ ActionClassName-conversion.properties ไว้ใต้แพ็กเกจซึ่งมีคลาส Action อยู่ ชื่อคลาสของ Action และ -conversion.properties ต่อไปนี้เป็นวิธีการเขียนแบบตายตัว สำหรับตัวอย่างนี้ ชื่อของไฟล์ควรเป็น HelloWorldAction-conversion.properties เนื้อหาในไฟล์คุณสมบัติคือ:
ชื่อคุณสมบัติ = ชื่อคลาสเต็มของตัวแปลงชนิด สำหรับตัวอย่างนี้ เนื้อหาของไฟล์ HelloWorldAction-conversion.properties คือ:
createtime= cn.csdn.conversion.DateConverter
ลงทะเบียนตัวแปลงประเภทข้างต้นเป็นตัวแปลงประเภทสากล:
วางไฟล์ xwork-conversion.properties ไว้ใต้ WEB-INF/classes เนื้อหาในไฟล์คุณสมบัติคือ:
ประเภทที่จะแปลง = ชื่อคลาสแบบเต็มของตัวแปลงประเภท สำหรับตัวอย่างนี้ เนื้อหาของไฟล์ xwork-conversion.properties คือ:
java.util.Date= cn.csdnconversion.DateConverter