บทความนี้แนะนำกฎการจับคู่ url-pattern ของ servlets และแบ่งปันกับคุณ รายละเอียดมีดังนี้:
ก่อนอื่นเราต้องชี้แจงกฎที่สับสนเล็กน้อย:
1. กฎการจับคู่ในคอนเทนเนอร์ servlet ไม่ใช่ไวด์การ์ดง่าย ๆ หรือการแสดงออกปกติ แต่เป็นกฎเฉพาะ ดังนั้นอย่าใช้ wildcards หรือกฎการจับคู่นิพจน์ปกติเพื่อดูรูปแบบ URL ของ servlet
2. เริ่มต้นจาก Servlet 2.5, servlet สามารถใช้กฎ URL หลายรูปแบบ แท็ก <servlet-mapping> ประกาศกฎการจับคู่ที่สอดคล้องกับ servlet และแท็ก <url-pattern> แต่ละรายการแสดงถึงกฎการจับคู่ 1 รายการ
3. เมื่อคอนเทนเนอร์ servlet ได้รับคำขอ URL ที่เริ่มต้นโดยเบราว์เซอร์คอนเทนเนอร์จะใช้ URL เพื่อลบเส้นทางบริบทของแอปพลิเคชันปัจจุบันและใช้สตริงที่เหลือเป็นการแมป servlet หาก URL เป็น http: // localhost: 8080/appdemo/index.html และบริบทของแอปพลิเคชันคือ AppDemo คอนเทนเนอร์จะลบ http: // localhost: 8080/appdemo และใช้ส่วนที่เหลือ /index.html
4. กระบวนการจับคู่การทำแผนที่ URL มีลำดับความสำคัญ
5. และเมื่อ servlet เข้าคู่กันได้สำเร็จ servlets ที่เหลือจะไม่ได้รับความสนใจ
1. กฎการจับคู่สี่ประการ
1 การจับคู่ที่แน่นอน
รายการที่กำหนดค่าใน <url-pattern> จะต้องตรงกับ URL อย่างแน่นอน
<servlet-mapping> <servlet-name> myservlet </servlet-name> <url-pattern> /user/users.html </url-pattern> <url-pattern> /index.html </url-pattern> <url-pattern>
เมื่อป้อน URL ต่อไปนี้ในเบราว์เซอร์พวกเขาจะถูกจับคู่กับ servlet
http: // localhost: 8080/appdemo/user/users.html
http: // localhost: 8080/appdemo/index.html
http: // localhost: 8080/appdemo/user/adduser.action
สังเกต:
http: // localhost: 8080/appdemo/user/adduser/เป็น URL ที่ผิดกฎหมายและจะไม่ได้รับการยอมรับว่าเป็น http: // localhost: 8080/appdemo/user/adduser
นอกจากนี้ URL ข้างต้นสามารถตามด้วยเงื่อนไขการสืบค้นใด ๆ และจะถูกจับคู่เช่น
http: // localhost: 8080/appdemo/user/adduser? ชื่อผู้ใช้ = Tom & Age = 23 จะถูกจับคู่กับ MyServlet
2 เส้นทางจับคู่
สตริงที่เริ่มต้นด้วยอักขระ "/" และลงท้ายด้วย "/*" ใช้สำหรับการจับคู่เส้นทาง
<servlet-mapping> <servlet-name> myservlet </servlet-name> <url-pattern>/ผู้ใช้/*</url-pattern> </servlet-mapping>
พา ธ เริ่มต้นด้วย /ผู้ใช้ /และเส้นทางต่อไปนี้อาจเป็นไปได้โดยพลการ ตัวอย่างเช่น URL ต่อไปนี้จะถูกจับคู่
http: // localhost: 8080/appdemo/user/users.html
http: // localhost: 8080/appdemo/user/adduser.action
http: // localhost: 8080/appdemo/user/updateUser.actionl
3 การจับคู่ส่วนขยาย
สตริงเริ่มต้นด้วย "*." ใช้สำหรับการจับคู่ส่วนขยาย
<servlet-mapping> <servlet-name> myservlet </servlet-name> <url-pattern>*. jsp </url-pattern> <url-pattern>*. การกระทำ </url-pattern> </servlet-mapping>
จากนั้นคำขอ URL ใด ๆ กับส่วนขยาย JSP หรือการกระทำจะตรงกันเช่น URL ต่อไปนี้จะถูกจับคู่
http: // localhost: 8080/appdemo/user/users.jsp
http: // localhost: 8080/appdemo/tohome.action
4 การจับคู่เริ่มต้น
<servlet-mapping> <servlet-name> myservlet </servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2. คำสั่งจับคู่
1. การจับคู่ที่แน่นอน, servlet-mapping1: <url-pattern> /user/users.html </url-pattern>, servlet-mapping2: <url-pattern>/*</url-pattern> เมื่อคำขอ http: // localhost: 8080/appdemo/user/users.html มาถึงการจับคู่ servlet-mapping1 และไม่ตรงกับ servlet-mapping2 อีกต่อไป
2. การจับคู่พา ธ การจับคู่เส้นทางที่ยาวที่สุดก่อนจากนั้นจับคู่เส้นทางที่สั้นที่สุด servlet-mapping1: <url-pattern>/ผู้ใช้/*</url-pattern>, servlet-mapping2: <url-pattern>/*</url-pattern> เมื่อคำขอ http: // localhost: 8080/appdemo/user/users.html มาถึงการจับคู่ servlet-mapping1 และไม่ตรงกับ servlet-mapping2 อีกต่อไป
3. การจับคู่ส่วนขยาย, servlet-mapping1: <url-pattern>/ผู้ใช้/*</url-pattern>, servlet-mapping2: <url-pattern>*. การกระทำ </url-pattern> เมื่อคำขอ http: // localhost: 8080/appdemo/user/adduser.action มาการจับคู่ servlet-mapping1 และไม่ตรงกับ servlet-mapping2 อีกต่อไป
4. การจับคู่เริ่มต้นไม่พบใน servlet ด้านบนดังนั้นใช้ servlet เริ่มต้นและกำหนดค่าเป็น <url-pattern>/</url-pattern>
ปัญหาที่จะสังเกต
ไม่สามารถตั้งค่าการจับคู่เส้นทางและการจับคู่ส่วนขยายได้ในเวลาเดียวกัน
มีวิธีการจับคู่เพียงสามวิธีเท่านั้นไม่ว่าจะเป็นการจับคู่เส้นทาง (เริ่มต้นด้วยอักขระ "/" และลงท้ายด้วย "/*") การจับคู่ส่วนขยาย (เริ่มต้นด้วย "*.") หรือการจับคู่ที่แน่นอน วิธีการจับคู่ทั้งสามไม่สามารถรวมกันได้ดังนั้นอย่าใช้มันเพื่อให้ได้รับอนุญาตให้ใช้ไวด์การ์ดหรือกฎปกติ
ตัวอย่างเช่น <url-pattern>/user/*. action </url-pattern> เป็นสิ่งผิดกฎหมาย
หมายเหตุ: <url-pattern>/aa/*/bb </url-pattern> เป็นการจับคู่ที่แน่นอนและถูกกฎหมาย * นี่ไม่ใช่ความหมายของการจับคู่ป่า
2 "/*" และ "/" มีความหมายที่แตกต่างกัน
Tomcat กำหนดค่า servlet เริ่มต้นในไฟล์ %catalina_home %/conf/web.xml และรหัสการกำหนดค่ามีดังนี้
<servlet> <servlet-name> ค่าเริ่มต้น </servlet-name> <servlet-lass> org.apache.catalina.servlets.defaultservlet </servlet-lass> <init-param> <param-name> debug </param-name> <param-value> false </param-value> </init-param> <load-on-startup> 1 </load-on-startup> </servlet> <servlet> <servlet-name> jsp </servlet-name> <param-value> false </param-value> </init-param> <init-Param> <param-Name> XPoweredBy </param-name> <param-value> false </param-value> </init-param> <load-on-startup> 3 </load-on-startup> <url-pattern>/</url-pattern> </servlet-mapping> <!-การแมปสำหรับ jsp servlet-> <servlet-mapping> <servlet-name> jsp </servlet-name> <url-pattern>*. jsp </url-pattern> <url-pattern>*
iv. ยกตัวอย่าง
| การทำแผนที่ URL | servlet ที่สอดคล้องกัน |
| /สวัสดี | servlet1 |
| /bbs/admin/* | servlet2 |
| /bbs/* | servlet3 |
| *.jsp | servlet4 |
| - | servlet5 |
ผลลัพธ์ของการทำแผนที่คำขอจริง
ลบเส้นทางที่เหลือของเส้นทางบริบท | servlet ที่จัดการคำขอ |
/สวัสดี | servlet1 |
/bbs/admin/login | servlet2 |
/bbs/admin/index.jsp | servlet2 |
/bbs/จอแสดงผล | servlet3 |
/bbs/index.jsp | servlet3 |
/BBS | servlet3 |
/index.jsp | Servler4 |
/hello/index.jsp | servlet4 |
/hello/index.html | servlet5 |
/ข่าว | servlet5 |
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น