ตัวอย่างในบทความนี้สรุปวิธีการประมวลผลทั่วไปของไฟล์สแตติกใน Javaweb ซึ่งมีประโยชน์อย่างมากในการพัฒนาโปรแกรม Javaweb โดยสรุปวิธีการเฉพาะได้ดังนี้:
วิธีที่ 1: เปิดใช้งาน defaultServlet ของ Tomcat เพื่อประมวลผลไฟล์คงที่
เพิ่มใน web.xml:
<servlet-mapping> <servlet-name>ค่าเริ่มต้น</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ค่าเริ่มต้น</ servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ค่าเริ่มต้น</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
หมายเหตุ: ควรเขียนไว้หน้า DispatcherServlet และปล่อยให้ defaultServlet สกัดกั้นคำขอก่อน เพื่อว่าคำขอจะไม่เข้าสู่ Spring ฉันคิดว่าประสิทธิภาพดีที่สุด
ชื่อของ Servlet เริ่มต้นที่มาพร้อมกับ Tomcat, Jetty, JBoss และ GlassFish -- "default"
ชื่อของ Servlet เริ่มต้นที่มาพร้อมกับ Google App Engine -- "_ah_default"
ชื่อของ Servlet เริ่มต้นที่มาพร้อมกับ Resin -- "resin-file"
ชื่อของ Servlet เริ่มต้นที่มาพร้อมกับ WebLogic -- "FileServlet"
ชื่อของ Servlet เริ่มต้นที่มาพร้อมกับ WebSphere -- "SimpleFileServlet"
วิธีที่ 2: mvc:resources มีให้ใน spring 3.0.4 และเวอร์ชันที่ใหม่กว่า วิธีใช้:
<!-- การเข้าถึงไฟล์ทรัพยากรคงที่--> <mvc:resources mapping="/images/**" location="/images/" />
คำอธิบาย: /images/** ถูกแมปกับ ResourceHttpRequestHandler สำหรับการประมวลผล และตำแหน่งจะระบุตำแหน่งของทรัพยากรแบบคงที่ โดยอาจอยู่ภายใต้ไดเร็กทอรีรากของเว็บแอปพลิเคชันหรือภายในแพ็กเกจ jar เพื่อให้สามารถบีบอัดทรัพยากรแบบคงที่ได้ แพ็คเกจโถ ระยะเวลาแคชสามารถเปิดใช้งานทรัพยากรแบบคงที่ให้เป็นเว็บแคชได้
วิธีที่สาม ใช้ <mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
URL "/**" จะถูกลงทะเบียนใน urlMap ของ SimpleUrlHandlerMapping และการเข้าถึงทรัพยากรแบบคงที่จะถูกโอนจาก HandlerMapping ไปยัง org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler สำหรับการประมวลผลและการส่งคืน
DefaultServletHttpRequestHandler ใช้ Servlet เริ่มต้นของแต่ละคอนเทนเนอร์ Servlet
หมายเหตุเพิ่มเติม: ปัญหาเกี่ยวกับลำดับการดำเนินการของ HandlerMappings หลายรายการ:
ค่าแอตทริบิวต์การสั่งซื้อของ DefaultAnnotationHandlerMapping คือ: 0
<mvc:resources/>ค่าแอตทริบิวต์การสั่งซื้อของ SimpleUrlHandlerMapping ที่ลงทะเบียนโดยอัตโนมัติคือ: 2147483646
<mvc:default-servlet-handler/>ค่าแอตทริบิวต์การสั่งซื้อของ SimpleUrlHandlerMapping ที่ลงทะเบียนโดยอัตโนมัติคือ: 2147483647
Spring จะดำเนินการตามคำสั่งที่มีค่าน้อยกว่าก่อน เมื่อเข้าถึงไฟล์รูปภาพ a.jpg ขั้นแรกให้ค้นหาตัวประมวลผลผ่าน DefaultAnnotationHandlerMapping จากนั้นค้นหาตามลำดับมูลค่าจากน้อยไปมาก เนื่องจาก SimpleUrlHandlerMapping ล่าสุดตรงกับ "/**" จึงจะตรงกันอย่างแน่นอนและคุณสามารถตอบสนองต่อรูปภาพได้
หากต้องการเข้าถึงรูปภาพ คุณต้องผ่านการจับคู่หลายชั้น ไม่รู้ว่าผลงานเป็นยังไงบ้าง?
สุดท้ายนี้ ให้ฉันอธิบายว่าเมื่อเข้าถึงทรัพยากรคงที่ใน Scheme 2 และ Scheme 3 หากมี Interceptor ทั้งหมดที่ตรงกัน (โดยประมาณ) Interceptor จะถูกนำมาใช้ หากคุณใช้การตรวจสอบสิทธิ์ในการสกัดกั้น โปรดใช้ความระมัดระวังในการกรองคำขอเหล่านี้สำหรับไฟล์คงที่
หาก DispatcherServlet ของคุณสกัดกั้นส่วนต่อท้าย URL เช่น *.do ปัญหาข้างต้นจะหมดไป ก็ยังสะดวกที่จะมีคำต่อท้าย