หลายคนเคยเห็นหรือเรียนรู้เกี่ยวกับ Velocity ชื่อนี้แปลตรงตัวว่า ความเร็ว, ความเร็ว, ความรวดเร็ว มันถูกใช้ในการพัฒนาเว็บ แต่คนจำนวนมากไม่ได้ใช้มันโดยพื้นฐานแล้ว Struts และ Struts เกี่ยวข้องกับคุณคิดอย่างไรกับ Velocity ให้เราลองดูและทำความเข้าใจกับแนวคิดของ Velocity เราเน้นประเด็นในการเลือกเทคโนโลยีเพื่อให้ทุกคนสามารถพิจารณา Velocity เมื่อเลือกการพัฒนาโครงการ และยังให้ทุกคนเข้าใจแนวคิดของมันด้วย วิธีคิดที่ดีมากทำให้ทุกคนเปลี่ยนใจและมีวิธีคิดที่แตกต่างกัน
บทความนี้อิงจากข้อเท็จจริงที่ว่าคุณมีพื้นฐานในการพัฒนา Java และรู้จัก MVC, Struts และโมเดลการพัฒนาอื่นๆ
Velocity เป็นเทคโนโลยีเอนจิ้นเทมเพลต Java โครงการนี้เสนอโดย Apache และได้มาจากเทคโนโลยีเอ็นจิ้นอื่น Webmacro ดังนั้นคำจำกัดความอย่างเป็นทางการของ Velocity คืออะไร? Apache ให้คำจำกัดความว่าเป็น: เอ็นจิ้นเทมเพลตที่ใช้ Java แต่อนุญาตให้ทุกคนใช้ภาษาเทมเพลตที่เรียบง่ายและทรงพลังเพื่ออ้างอิงอ็อบเจ็กต์ที่กำหนดในโค้ด Java เวอร์ชันล่าสุดคือ 1.4 คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่ http://jakarta.apache.org/velocity/index.html
ในความเป็นจริง หากพูดตรงๆ Velocity คือการนำสถาปัตยกรรม MVC ไปใช้ แต่จะเน้นที่ความสัมพันธ์ระหว่าง Model และ View มากขึ้นเพื่อเป็นสะพานเชื่อมระหว่างกัน ฉันเชื่อว่าทุกคนคุ้นเคยกับ Struts ซึ่งเป็นสถาปัตยกรรมยอดนิยมของ MVC นักพัฒนาหลายคนใช้สถาปัตยกรรม Struts อย่างกว้างขวาง รวมถึงเวอร์ชันแพลตฟอร์มการจัดการของเทคโนโลยี Struts ของ IBM ถือเป็นแนวปฏิบัติที่ดีของ MVC และช่วยลด Java ได้อย่างมีประสิทธิภาพ โค้ดปรากฏใน View (Jsp) แต่การเชื่อมต่อระหว่าง Model และ View ยังคงอาศัยเทคโนโลยี Taglib ของ Struts ลองจินตนาการดูว่านักออกแบบเว็บไซต์ส่วนหน้าไม่คุ้นเคยกับ Struts หรือแม้แต่ Taglib (ฉันเชื่อว่ามันค่อนข้างยากที่จะคุ้นเคย รวมถึงเจ้าหน้าที่บำรุงรักษาในภายหลังด้วยเช่นเดียวกัน) ซึ่งจะทำให้นักออกแบบเว็บไซต์และวิศวกรพัฒนาส่วนหน้าทำงานร่วมกันได้ยาก และนักพัฒนาส่วนหน้าอาจมีความซับซ้อนมากขึ้น ยังมีการมีเพศสัมพันธ์ในระดับหนึ่ง เรามาดู Velocity หรือแนวคิดนี้กันดีกว่า
เรามาเริ่มด้วยตัวอย่างการพัฒนา Velocity ที่ง่ายที่สุดเพื่อแสดงให้คุณเห็นว่า Velocity ทำงานอย่างไร:
1. สร้างไฟล์ ชื่อไฟล์คือ: hellavelocity.vm ซึ่งเป็นเทมเพลตความเร็ว (จริงๆ แล้วเหมือนกับ html) เนื้อหาคือ:
ยินดีต้อนรับ $name สู่ Javayou.com!
วันนี้เป็นวันที่ $
2. สร้างไฟล์ Java HelloVelocity.java โดยมีเนื้อหา:
แพ็คเกจ com.javayou.velocity;
นำเข้า java.io.StringWriter;
นำเข้า java.util.*;
นำเข้า org.apache.velocity.app.VelocityEngine;
นำเข้า org.apache.velocity.Template;
นำเข้า org.apache.velocity.VelocityContext;
-
* @ผู้เขียน Liang.xf 14-12-2547
-
HelloVelocity คลาสสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
// เริ่มต้นและรับเครื่องมือ Velocity
VelocityEngine และ = VelocityEngine ใหม่ ();
ve.init();
//รับเทมเพลตความเร็ว
เทมเพลต t = ve.getTemplate("hellovelocity.vm");
//รับบริบทของความเร็ว
บริบท VelocityContext = VelocityContext ใหม่ ();
//กรอกข้อมูลลงในบริบท
context.put("ชื่อ", "เหลียง");
context.put("date", (วันที่ใหม่()).toString());
//สำหรับการแสดงผลในภายหลัง ให้ป้อนค่ารายการล่วงหน้า
รายการชั่วคราว = ArrayList ใหม่ ();
temp.เพิ่ม("1");
temp.เพิ่ม("2");
context.put("รายการ", อุณหภูมิ);
//กระแสเอาท์พุท
ผู้เขียน StringWriter = StringWriter ใหม่ ();
// แปลงเอาต์พุต
t.merge (บริบท, นักเขียน);
System.out.println(writer.toString());
-
-
3. ดาวน์โหลด Velocity 1.4 zip ที่ http://jakarta.apache.org/site/binindex.cgi แตกไฟล์เพื่อรับ velocity-1.4.jar และใช้เพื่อคอมไพล์คลาส HelloVelocity.java ข้างต้น
4. คัดลอก hellavelocity.vm บน 1 ไปยังไดเร็กทอรีปัจจุบันของการรัน การรัน HelloVelocity ยังจำเป็นต้องมีแพ็คเกจอื่น ๆ ซึ่งสามารถรับได้จาก velocity1.4.zip ที่ดาวน์โหลดไว้ \velocity - 1.4\build\lib และใส่ หลังจากแนะนำ commons-collections.jar และ logkit-1.0.1.jar แล้ว ให้รัน java -cp .\bin; -Djava.ext.dirs=.\lib2 com.javayou.velocity.HelloVelocity โดยถือว่าคลาสถูกคอมไพล์แล้ว ไปที่ไดเร็กทอรี .\ bin และแพ็คเกจคลาสที่เราต้องการจะถูกวางไว้ในไดเร็กทอรี .\lib2 โครงสร้างการทำงานจะเป็นดังนี้:
ยินดีต้อนรับ Liang สู่ Javayou.com!
วันนี้คือวันอังคารที่ 14 ธันวาคม เวลา 19:26:37 น. CST 2004
ข้างต้นเป็นผลลัพธ์การทำงานที่ง่ายที่สุด แล้วโปรดแจ้งให้ฉันทราบโดยประมาณ ตัวแปร $name และ $date ในเทมเพลต hellavelocity.vm ตามลำดับคือ context.put("name", "Liang") และ context.put ( "date", (new Date()).toString()) ถูกแทนที่ด้วยค่าที่ตั้งไว้
จากมุมมองนี้ การประมวลผลกระบวนการทางธุรกิจ รวมถึงผลลัพธ์ทางธุรกิจ โดยพื้นฐานแล้วทั้งหมดได้รับการแก้ไขที่เลเยอร์โมเดล ในขณะที่เลเยอร์มุมมองโดยพื้นฐานแล้วจะแสดงโดยใช้ VTL (ภาษาเทมเพลต Velocity) แบบธรรมดาเท่านั้น ด้วยวิธีนี้ Jsp จะไม่จำเป็นหรือ? ใช่ โมเดลการใช้งานนี้เหมือนกับวิธี CGI ก่อนหน้านี้เล็กน้อย :) Velocity ส่งออกโค้ดโดยอัตโนมัติ และ Velocity ก็มีความสามารถอย่างมากในเรื่องนี้ด้วย Velocity ถูกใช้ใน Turbine เพื่อสร้างโค้ดจำนวนมาก
ใน Velocity คำจำกัดความของตัวแปรเริ่มต้นด้วย "$" และ $ ทำหน้าที่เป็นตัวระบุของ Velocity ตัวอักษร ตัวเลข เส้นขีด และขีดเส้นใต้สามารถใช้เป็นตัวแปรที่กำหนดใน Velocity ได้
นอกจากนี้ เรายังต้องใส่ใจกับคำจำกัดความตัวแปรที่เป็นลักษณะเฉพาะของ Velocity ด้วย เช่น $student.No, $student.Address ซึ่งมีความหมายสองระดับ ระดับแรกคือถ้านักเรียนเป็น hashtable คีย์ No และ will ถูกแยกออกมาจาก hashtable ค่าของ Address และประเภทที่สองคืออาจเป็นวิธีการเรียก นั่นคือ ตัวแปรสองตัวข้างต้นจะถูกแปลงเป็น Student.getNo() และ Student.getAddress() Velocity มีอ็อบเจ็กต์สำหรับค่าที่ส่งคืนโดยโค้ด java ในเซิร์ฟเล็ต และยังสามารถเรียกใช้เมธอดของอ็อบเจ็กต์ได้ เช่น $student.getAddress() เป็นต้น ฉันจะไม่ยกตัวอย่างและลงรายละเอียดที่นี่
ตัวอย่างข้างต้นเป็นเพียงตัวอย่างง่ายๆ แน่นอนว่า ผู้คนจำนวนมากไม่พอใจกับตัวอย่างดังกล่าวอีกต่อไป ในการใช้งานจริง เรามักจะจำเป็นต้องสร้างการแสดงแบบเลือกและระบุข้อมูลซ้ำบางส่วน เช่น รายการ และแน่นอนว่า Velocity ( โดยเฉพาะควรเป็นภาษาเทมเพลต VTL) รองรับฟังก์ชันนี้ด้วย นอกจากนี้ยังรองรับการแสดงผลอื่นๆ ที่ใช้กันทั่วไปด้วย เช่น ตัวแปรภายในเทมเพลต (เช่น ตัวแปรใน Jsp) และอันที่มีประสิทธิภาพมากกว่า เช่น การสร้างมาโครเพื่อให้เกิดการทำงานอัตโนมัติ . ให้เราอ่านต่อ.
เรายังคงใช้ตัวอย่างข้างต้นและเปลี่ยนเนื้อหาในเทมเพลต hellavelocity.vm เป็น:
#set( $iAmVariable = "ดี!" )
ยินดีต้อนรับ $name สู่ Javayou.com!
วันนี้เป็นวันที่ $
$iAmVariable
รันคำสั่ง run ข้างต้นอีกครั้ง ผลลัพธ์คือ:
ยินดีต้อนรับ Liang สู่ Javayou.com!
วันนี้คือวันอังคารที่ 14 ธันวาคม เวลา 22:44:39 น. CST 2004
ดี!
คุณจะเห็นว่าตัวแปรในเทมเพลตถูกกำหนดเป็นคำสั่งที่ขึ้นต้นด้วย #set ซึ่งเข้าใจได้ไม่ยาก หลังจากดำเนินการ ตัวแปร $iAmVariable ในเทมเพลตจะถูกแปลงเป็นค่าที่กำหนด:
ดี!
มาดูตัวเลือกง่ายๆ กันอีกครั้ง เปลี่ยนเนื้อหาในเทมเพลต hellavelocity.vm เป็น:
#set ($ผู้ดูแลระบบ = "ผู้ดูแลระบบ")
#set ($ผู้ใช้ = "ผู้ใช้")
#if ($ผู้ดูแลระบบ == $ผู้ใช้)
ยินดีต้อนรับผู้ดูแลระบบ!
#อื่น
ยินดีต้อนรับผู้ใช้!
#จบ
ดำเนินการคำสั่ง run ผลลัพธ์คือ:
ยินดีต้อนรับผู้ใช้!
จะเห็นว่าคำตัดสินเป็นเพียง #if (), #else, #end เท่านั้น ไม่ซับซ้อนมาก
มาดูข้อมูลการวนซ้ำต่อไปและเปลี่ยนเนื้อหาในเทมเพลต hellavelocity.vm เป็น:
#foreach( $ผลิตภัณฑ์ใน $list )
$ผลิตภัณฑ์
#จบ
ดำเนินการคำสั่ง run ผลลัพธ์คือ:
#1
#2
ไม่สะดวกหรือไม่ที่จะแสดงรายการค่าที่บันทึกไว้ล่วงหน้าในรายการ VelocityContext ในตัวอย่าง เพียงใช้ #foreach ($variable ใน xx) หากรายการด้านบนถูกแทนที่ด้วย Hashtable คุณสามารถใช้ไวยากรณ์ต่อไปนี้:
#foreach($key ใน $hashVariable.keySet() )
$key ค่า: $ hashVariable.get($key)
#จบ
ฉันไม่คิดว่าสคริปต์เหล่านี้ซับซ้อนเลย
หลายคนก็จะถามเช่นกันว่าถ้าเป็น javabean ล่ะ? เอาล่ะ มาเพิ่มถั่วกันดีกว่า:
แพ็คเกจ com.javayou.velocity;
-
* @ผู้เขียน Liang.xf 14-12-2547
-
นักเรียนชั้นสาธารณะ {
//โปรดทราบว่าคุณลักษณะของคลาสเป็นแบบสาธารณะ
สาธารณะ สตริงไม่มี = "";
ที่อยู่สตริงสาธารณะ = "";
นักเรียนสาธารณะ (String _no, String _address) {
ไม่ = _ไม่;
ที่อยู่ = _ที่อยู่;
-
สตริงสาธารณะgetAddress() {
ที่อยู่ผู้ส่ง;
-
setAddress โมฆะสาธารณะ (ที่อยู่สตริง) {
this.address = ที่อยู่;
-
สตริงสาธารณะ getNo() {
หมายเลขส่งคืน;
-
โมฆะสาธารณะ setNo (หมายเลขสตริง) {
นี่.ไม่ = ไม่;
-
-
Student นี้เป็น javabean เต็มรูปแบบหรือ data bean ซึ่งเป็นคลาสทั่วไปที่ใช้ในการโหลดข้อมูล จากนั้นเราจะแก้ไข HelloVelocity.java เป็น:
temp.เพิ่ม("1");
temp.เพิ่ม("2");
แทนที่ด้วย:
temp.add(นักเรียนใหม่("123", "กวางโจว"));
temp.add(นักเรียนใหม่("456", "จูไห่"));
จากนั้นเปลี่ยนเนื้อหาของ hellavelocity.vm เป็น:
#foreach ($s ใน $students)
<$velocityCount> ที่อยู่: $s.address
#จบ
คอมไพล์ใหม่และรันคำสั่ง run ผลลัพธ์จะเป็นดังนี้:
<1> ที่อยู่: กวางโจว
<2> ที่อยู่: จูไห่
ด้วยวิธีนี้ ข้อมูลนักเรียนในรายการจะถูกพิมพ์ออกมา เท่านี้ก็เรียบร้อย! ตัวแปรในตัวของ Velocity $velocityCount ถูกใช้ที่นี่ ซึ่งอ้างอิงถึงหมายเลขลำดับการแจงนับเริ่มต้น โดยเริ่มจาก 1 นอกจากนี้ยังสามารถเปลี่ยนเป็น 0 ได้ แต่จำเป็นต้องเปลี่ยนใน Velocity.properties แพ็คเกจ velocity-1.4.jar ภายใต้ไดเร็กทอรี org\apache\velocity \runtime\defaults
จะจัดการกับการวนซ้ำที่ซับซ้อนมากขึ้นได้อย่างไร? ลองดูตัวอย่างเทมเพลตต่อไปนี้เพื่อให้ชัดเจน:
#foreach ($องค์ประกอบใน $list)
-- การเข้าถึงภายใน --
#foreach ($องค์ประกอบใน $list)
นี่คือ $องค์ประกอบ
$ความเร็วนับ
#จบ
-- การเข้าถึงภายใน --
-- ส่วนหน้าภายนอก --
นี่คือ $องค์ประกอบ
$ความเร็วนับ
-- ส่วนหน้าภายนอก --
#จบ
อย่างที่คุณเห็น Velocity รองรับการซ้อนแท็ก นี่เป็นฟังก์ชันที่ทรงพลังมาก ฉันจะไม่สาธิตเชิงลึกที่นี่ หากคุณสนใจ ลองด้วยตัวเอง
ที่จริงแล้ว หากคุณคิดถึงตัวอย่างที่เราให้ข้อมูลเชิงลึกเพิ่มเติมอีกเล็กน้อย คุณจะเห็นแล้วว่า Velocity มีประโยชน์อย่างไร นั่นคือโมเดล Servlet + Velocity นอกจากนี้ คุณยังจำโมเดลการพัฒนา Jsp ในยุคแรกของเรา Jsp+JavaBean ได้หรือไม่ ที่นี่เราเปลี่ยนเป็น Servlet+JavaBean+Velocity ลองคิดดูว่าได้แทนที่ Jsp+JavaBean และลบโค้ด Java ออกจาก Jsp (vm) อย่างละเอียดยิ่งขึ้น หากคุณใช้ Struts (Servlet+Jsp) เท่านั้น ค่าใช้จ่ายก็คือ โค้ด Java จะปรากฏไม่มากก็น้อยใน JSP เสมอ แม้ว่าจะสามารถทำได้โดยไม่ต้องใช้โค้ด Java แต่นักพัฒนาที่ทำระบบสถาปัตยกรรมที่ซับซ้อนก็รู้ดีว่าต้นทุนก็แพงมากเช่นกัน และในแง่ของการบำรุงรักษา การพัฒนาแบบรวมก็มีปัญหาบางประการเช่นกัน กับนักออกแบบเว็บไซต์ ดังนั้นเราจึงรู้สึกได้ว่าโมเดล Servlet+JavaBean+Velocity เข้าใจแนวคิดของ OOD ได้ดีขึ้น ในแง่ของประสิทธิภาพ คุณไม่ต้องกังวล ชุดค่าผสมนี้มีประสิทธิภาพมากกว่าวิธี Servlet+Jsp
น่าจะมีคนจำนวนมากที่เต็มใจที่จะเรียนรู้เกี่ยวกับ Velocity แต่อาจมีไม่มากนักที่สามารถนำไปใช้กับโปรเจ็กต์ได้จริง (บางโปรเจ็กต์ยังคงใช้มัน เช่น Jute) ท้ายที่สุดแล้ว เมื่อเปรียบเทียบกับ Jsp แล้ว Jsp นั้นมีมาตรฐานมากกว่าและใช้กันอย่างแพร่หลาย และมีการใช้เครื่องมือในการพัฒนามากมาย รองรับการพัฒนา Jsp แต่ฟังก์ชันของ Velocity ไม่ได้จำกัดอยู่เพียงการแข่งขันกับ Jsp เท่านั้น ดังที่เห็นได้จากข้างต้น ฟังก์ชันนี้มีประสิทธิภาพมากในเอาต์พุตโค้ดอัตโนมัติ ดังที่กล่าวไว้ข้างต้น Turbine ใช้ Velocity เพื่อสร้างโค้ดจำนวนมาก เป็นความคิดที่ดีที่จะสร้างให้เป็นโปรแกรมสร้างโค้ดหรือการสร้างเทมเพลตอื่นๆ
เอาล่ะ มาดูปัญหาทั่วไปบางอย่างที่ต้องให้ความสนใจหากคุณต้องการเจาะลึกลงไปใน Velocity เพื่อทำโปรเจ็กต์ ประการแรกคือปัญหาความเป็นสากล
Velocity รองรับการแปลงเทมเพลตการเข้ารหัสระหว่างประเทศ ดูวิธีการที่ Velocity มอบให้:
เทมเพลตสาธารณะ getTemplate (เทมเพลต Stirng, การเข้ารหัสสตริง)
มีการสันนิษฐานว่าแนวทางนี้ไม่สามารถบรรลุความเป็นสากลได้อย่างสมบูรณ์
แนวคิดที่ง่ายที่สุดของการทำให้เป็นสากลใน Struts คือการใช้แท็กภาษาสากลบน Jsp และแต่ละภาษาใช้ไลบรารีแท็กภาษาที่แตกต่างกัน โดยการขยาย สามารถทำได้ด้วยตนเอง ใช่ เพียงต้องการการประมวลผลด้วยตนเองเล็กน้อย
โชคดีที่มีคนแก้ไขปัญหาที่กล่าวมาข้างต้นแล้ว และสร้างเครื่องมือของ Velocity: MessageTool ซึ่งจัดเตรียมข้อความตัวแปรเพื่อให้มีป้ายกำกับที่เป็นสากล ด้วยวิธีนี้ คุณเพียงแค่ต้องเขียนโค้ดป้ายกำกับ เช่น: $text.get('title ' ) สามารถดูเนื้อหาที่เฉพาะเจาะจงเพิ่มเติมได้ที่ http://jakarta.apache.org/velocity/tools/struts/MessageTool.html
โอเค ทั้งหมดนี้ขึ้นอยู่กับการเปิดตัว Velocity เรามาพูดถึงส่วนขยายอื่นๆ กันดีกว่า บางคนแสดงความคิดเห็นว่า Velocity ไม่ใช่โครงสร้าง MVC มาตรฐาน ใช่ เรากล่าวไว้ในตอนต้นว่า Velocity เป็นเพียงการผสมผสานที่ดีระหว่าง Model และ View และเป็นเพียงเครื่องมือเทมเพลตที่ดี ท้ายที่สุดแล้ว การผสมผสานที่ดีของ MVC ยังไม่มี ถูกสร้างขึ้น โชคดีที่ Apache เปิดตัว VelocityStruts โดยอาศัยการรวมกันของ Struts และ Velocity เราสามารถแนะนำส่วนนี้ของข้อความได้ในหัวข้อถัดไป ต่อไปนี้เป็นการแนะนำโดยย่อเกี่ยวกับแนวคิด ซึ่งอิงตามโครงสร้างของ Struts และ Action of Business logic การประมวลผล ในที่สุด กระบวนการทางธุรกิจจะถูกเลื่อนไปที่เลเยอร์การแสดงผลตาม Velocity ดังนั้นจึงแทนที่ Jsp เป็นเลเยอร์ View นอกจากนี้เรายังเห็นข้างต้นว่าตัวอย่างที่อ้างถึงนั้นอิงตามหลักการและการสาธิต และไม่ได้บูรณาการอย่างใกล้ชิดกับการพัฒนาเว็บ เราจะรวมแง่มุมนี้เมื่ออธิบายเนื้อหาของ VelocityStruts
รู้เบื้องต้นเกี่ยวกับการใช้ Velocity - โค้ดใน java
1. ขั้นแรกให้เริ่มต้นวัตถุ
บริบท VelocityContext = VelocityContext ใหม่ ();
ผู้เขียน StringWriter = StringWriter ใหม่ ();
การเข้ารหัสสตริง2 = "GBK";
2. PROPERTY_PATH = TEMPLATE_INIT_PATH ในไฟล์คุณสมบัติระบบ (ระบุพาธของไฟล์คุณสมบัติที่จำเป็นสำหรับความเร็ว)
3. เนื้อหาในคุณสมบัติ
file.resource.loader.path = D:/resin/webapps/mip/files/templateupload/ (ซึ่งมีเทมเพลตอยู่)
4. จากนั้นกำหนดค่าเริ่มต้น Velocity.init(PROPERTY_PATH);
5. สอดคล้องกับป้ายกำกับความเร็วกับ java context.put(key, value);
6. จากนั้นโหลดไฟล์ Velocity.mergeTemplate(templateName, encoding2, context,writer);
7. สุดท้าย ให้เรียก Generator.writeToFile() เพื่อสร้างไฟล์
8. ฟังก์ชัน writeToFile เป็นดังนี้:
FileOutputStream ของ = FileOutputStream ใหม่ (theFile);
of.write(writer.toString().getBytes("GBK"));
// String tt =writer.toString();
ของ.ฟลัช();
ของ.ปิด();
บทความนี้มาจากบล็อก CSDN โปรดระบุแหล่งที่มาเมื่อพิมพ์ซ้ำ: http://blog.csdn.net/sunrui_work/archive/2009/12/18/5029982.aspx