แก้ปัญหาเส้นทางใน Java Web:
เส้นทางที่ใช้ใน Java แบ่งออกเป็นสองประเภท: เส้นทางสัมบูรณ์และเส้นทางสัมพัทธ์ ในที่สุด Java สามารถใช้เส้นทางที่แน่นอนเพื่อค้นหาทรัพยากรเท่านั้น วิธีการทั้งหมดในการค้นหาทรัพยากรบนเส้นทางที่สัมพันธ์กันเป็นเพียงวิธีการที่สะดวก แต่มันเป็น API ที่ช่วยให้เราสร้างเส้นทางที่แน่นอนที่ด้านล่างเพื่อค้นหาทรัพยากร!
เมื่อพัฒนาเว็บแอปพลิเคชันคุณมักจะต้องได้รับเส้นทางทางกายภาพของ webroot ปัจจุบันในเซิร์ฟเวอร์
หากเป็น servlet, action, controller หรือตัวกรอง, ผู้ฟัง, interceptor และคลาสที่เกี่ยวข้องอื่น ๆ เราจะต้องได้รับ servletContext จากนั้นใช้ servletContext.getRealAthAth ("/") เพื่อรับที่อยู่ทางกายภาพของแอปพลิเคชันปัจจุบันบนเซิร์ฟเวอร์
หาก ServletContext ไม่สามารถเรียกคืนได้ในชั้นเรียนมีสองวิธีในการทำ:
1. ใช้กลไกการโหลดคลาสของ Java เพื่อเรียก xxx.class.getClassLoader (). getResource (""); วิธีการรับ ClassPath จากนั้นดำเนินการเพื่อรับไดเรกทอรี WebRoot วิธีนี้สามารถมีผลภายใต้ WebRoot/Web-INF/คลาสเท่านั้น หากคลาสถูกบรรจุลงในไฟล์ JAR วิธีการจะไม่ถูกต้อง ในเวลานี้ควรใช้วิธีการต่อไปนี้
2. ความคิดของกรอบฤดูใบไม้ผลิ ใน web-inf/web.xml ให้สร้างพารามิเตอร์ของ WebApprootkey ระบุค่า (ค่าเริ่มต้นคือ webapp.root) เป็นค่าคีย์จากนั้นเรียกใช้สตริง webapprootkey = getServletContext () getRealPath ("/"); ผ่านผู้ฟังหรือตัวกรองหรือ servlet จากนั้นเขียน webapp.root ที่สอดคล้องกับ webapprootkey เป็นคีย์และค่าลงในคุณสมบัติของระบบคุณสมบัติระบบ จากนั้นเส้นทางทางกายภาพของ Webroot จะได้รับผ่าน System.getProperty ("WebApp.root") ในโปรแกรม
ตามแนวคิดที่สองเราสามารถขยายเพิ่มเติมได้ อย่างไรก็ตามสำหรับแอปพลิเคชันที่ปรับใช้ในเซิร์ฟเวอร์หากไม่ใช่ความต้องการของคุณโปรดอ่านมันลง
ต่อไปนี้เป็นวิธีที่จะได้รับ classpath และเส้นทางที่แน่นอนไปยังคลาสปัจจุบัน คุณสามารถใช้วิธีการเหล่านี้เพื่อให้ได้เส้นทางที่แน่นอนไปยังแหล่งข้อมูลที่คุณต้องการ:
1.
DebitNoteaction.class.getResource ("")สิ่งที่คุณได้รับคือไดเรกทอรี URI ของไฟล์ FileTest.class คลาสปัจจุบัน ไม่รวมตัวเอง!
ชอบ:
ไฟล์:/d:/eclipse/springtest/webroot/web-inf/classes/
Atcarnet/src/com/evi/modules/atacarnet/action/
2.
DebitNoteaction.class.getResource ("/")สิ่งที่คุณได้รับคือเส้นทาง URI ที่แน่นอนของ ClassPath ปัจจุบัน
ชอบ:
ไฟล์:/d:/eclipse/springtest/webroot/web-inf/classes/
3.
thread.currentthread (). getContextClassLoader (). getResource ("")สิ่งที่คุณได้รับคือเส้นทาง URI ที่แน่นอนของ classpath ปัจจุบัน
ชอบ:
ไฟล์:/d:/eclipse/springtest/webroot/web-inf/classes/
4.
DebitNoteaction.class.getClassLoader (). getResource ("")หรือ
classloader.getSystemResource ("")สิ่งที่คุณได้รับก็คือเส้นทาง URI ที่แน่นอนของ ClassPath ปัจจุบัน
ชอบ:
ไฟล์:/d:/eclipse/springtest/webroot/web-inf/classes/
5. รับพา ธ สัมพัทธ์ของเซิร์ฟเวอร์
System.getProperty ("user.dir")ตัวอย่างเช่น: E: /apache-tomcat-5.5.16/apache-tomcat-5.5.16/bin
ฉันขอแนะนำให้ใช้ thread.currentthread (). getContextclassloader (). getResource ("") เพื่อรับสัญลักษณ์ URI ของเส้นทางสัมบูรณ์ของ classpath ปัจจุบัน
6. รับเส้นทางที่แน่นอนในโครงการ
ใช้โดยทั่วไป
request.getRealPath ("/")หรือ
request.getRealPath ("/config/")แต่ไม่แนะนำให้ใช้ request.getRealPath ("/") คุณสามารถลองใช้เมธอด servletContext.getRealPath ("/") เพื่อรับเส้นทางที่แน่นอนไปยังไดเรกทอรีรูทของเว็บแอปพลิเคชัน
มันง่ายมากที่จะได้รับไฟล์ SRC เนื่องจาก SRC เป็นไดเรกทอรีสัมพัทธ์เริ่มต้น ตัวอย่างเช่นหากคุณบอกว่าคุณต้องการได้รับไฟล์ test.java ในไดเรกทอรี com ภายใต้ SRC คุณต้องการสิ่งนี้เพียงพอ
ไฟล์ f = ไฟล์ใหม่ (com/test.java);
แต่ถ้าฉันต้องการได้รับไฟล์ที่ไม่ได้อยู่ในไดเรกทอรี SRC หรือไดเรกทอรี WebRoot ฉันต้องได้รับไฟล์จาก SRC หรือ Webroot ในระดับเดียวกันเช่น DOC
วิธีการยากของฉันถูกนำไปใช้เช่นนี้:
String Path = this.getServletContext (). getRealPath ("/"); คุณสมบัติ p = คุณสมบัติใหม่ (); p.load (ใหม่ FileInputStream (ไฟล์ใหม่ (path.substring (0, (path.lastindexof ("// webroot") + 1)) "doc/db.properties"))); System.out.println (P.GetProperty ("Drivername"));ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!