ทรัพยากรที่ร้องขอ (/xxx.html) ไม่สามารถใช้งานได้เมื่อเปลี่ยนเส้นทาง

ฉันทำการบ้านจริงๆ เพื่อดูว่าทำไม แต่ฉันก็ยังดิ้นรนอยู่ กรุณาช่วย!

ฉันมี Servlet ซึ่งทำงานได้ดีโดยไม่มีหน้าใด ๆ มาก่อนวันนี้ (tomcat 7 & eclipse)

ตอนนี้ฉันหวังว่าจะลองเพิ่มหน้าบางหน้าและเปลี่ยนเส้นทางไปยังหน้าเหล่านั้น ฉันเพิ่มบรรทัดของ

response.sendRedirect("/userhelp.html");

เพื่อทดสอบว่าเพจใช้งานได้หรือไม่

ฉันวาง userhelp.html ไว้ใต้ foler ของ WebContent สำหรับการทดสอบ ฉันได้ลองคัดลอกลงใน WEB-INF แล้ว แต่ก็ไม่ได้ผล

และถ้าฉันแทนที่ "/userhelp.html" เป็น "userhelp.html" มันไม่มีหน้าข้อผิดพลาด แต่มี "การเปลี่ยนเส้นทางแบบเรียกซ้ำ"

ด้านล่างนี้เป็นรหัสของฉันซึ่งสัมพันธ์กัน

@WebServlet(name="core",urlPatterns={"/"})
public class CoreServlet extends HttpServlet {


protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    response.setCharacterEncoding("UTF-8");
    response.sendRedirect("/userhelp.html");    

person JaskeyLam    schedule 26.07.2014    source แหล่งที่มา
comment
การเปลี่ยนเส้นทางแบบเรียกซ้ำหมายความว่าอย่างไร   -  person Abhijeet Panwar    schedule 26.07.2014
comment
ขออภัย เนื่องจาก Chrome ของฉันเป็นเวอร์ชันภาษาจีน ดังนั้นฉันจึงแปลมัน จึงควรหมายถึง PageA--›PageA--›PageA--›PageA....อะไรทำนองนี้ เพราะฉันเห็นว่า Tomcat ของฉันกำลังทำงานโดยมีค่าว่างสำหรับ เป็นเวลานานด้วยแถบกระบวนการสีเขียว แต่ฉันคิดว่ามันควรจะใช้ได้กับ /userhelp.html ทำไม 404 กรุณาช่วยด้วย!   -  person JaskeyLam    schedule 26.07.2014


คำตอบ (1)


คุณต้องแก้ไข sendrederct ของคุณเป็น:

response.sendRedirect("/ProjectName/userhelp.html");

คุณมี response.sendRedirect("/userhelp.html"); การโต้แย้งกับ sendRedirect ของคุณเริ่มต้นด้วยเครื่องหมายทับ ซึ่งหมายความว่า 'เป็นจริงถึงรูทของคอนเทนเนอร์' ดังนั้นคอนเทนเนอร์จึงสร้าง URL ที่สัมพันธ์กับ URL ดั้งเดิมของคำขอ

หน้า userhelp.html ของคุณออกจากเนื้อหาเว็บของโปรเจ็กต์ของคุณ เส้นทางสัมพัทธ์จากรูทของคอนเทนเนอร์ควรเป็น /Projectname/userhelp.html ดังนั้นคุณต้องแก้ไขเส้นทางของคุณใน response.sendRedirect

แก้ไข : ปัญหาอยู่ในการแมปเซิร์ฟเล็ตของคุณเนื่องจาก @servletmapping(/) หมายความว่าสิ่งใดก็ตามที่มาสำหรับรูปแบบ url นี้(/) ควรถูกส่งไปยังเซิร์ฟเล็ตนี้ ดังนั้นสิ่งที่เกิดขึ้นจริงคือเมื่อเซิร์ฟเล็ตของคุณถูกเรียกครั้งแรกและการตอบกลับ sendredirect() ถูกเรียกว่า ออบเจ็กต์คำขอใหม่จะถูกสร้างขึ้นและเป็นพาธสำหรับมันคือ / ดังนั้นเซิร์ฟเล็ตของคุณจะถูกเรียกอีกครั้งและกระบวนการแบบเรียกซ้ำนี้เริ่มต้นขึ้น

ดังนั้นวิธีแก้ปัญหานี้คือเปลี่ยนการแมปเซิร์ฟเล็ตเป็น : @servletmapping(/test) จากนั้นเรียกเซิร์ฟเล็ตนี้โดยการเรียก yourlocalhost/test/ ดังนั้นเมื่อการเปลี่ยนเส้นทางในเวลานี้เสร็จสิ้น Servlet จะไม่ถูกเรียกเช่นนั้น

person Abhijeet Panwar    schedule 26.07.2014
comment
นี่ไม่ได้ผลสำหรับฉัน เมื่อฉันใช้ project/userhelp.html ฉันได้รับสถานการณ์แปลก ๆ ก็คือเมื่อฉันมี log enter doget เมื่อ enter doGet() วิธีการและมันก็พิมพ์ enter doget ต่อไปเพื่อหาวิธีแก้ปัญหาของคุณ และไม่มีอะไรเกิดขึ้น! - person JaskeyLam; 26.07.2014
comment
คุณเรียกเซิร์ฟเล็ตของคุณอย่างไร กรุณาโพสต์โค้ดของคุณที่เรียกเซิร์ฟเล็ตของคุณ - person Abhijeet Panwar; 26.07.2014
comment
คุณหมายถึงอะไรที่เรียกว่าพิมพ์บันทึกดังนั้นวิธีการ do get จึงเข้ามา - person JaskeyLam; 26.07.2014
comment
ใช่ มันอยู่ใน แต่ทำไมการพิมพ์ 'อย่างต่อเนื่อง' จึงเข้าสู่ doget?เซิร์ฟเล็ตของคุณถูกเรียกซ้ำ ๆ หรือไม่ ถ้าใช่มากกว่าที่ฉันคิดว่านั่นคือเหตุผล แม้แต่คุณได้กล่าวถึงในคำถามของคุณเกี่ยวกับเพจแบบเรียกซ้ำ a . ฉันคิดว่าปัญหาคือบางสิ่ง อื่น - person Abhijeet Panwar; 26.07.2014
comment
แต่ปัญหาคือทำไมเขาถึงทำซ้ำ ถ้าฉันลบรหัสนี้ (เปลี่ยนเส้นทาง) ทุกอย่างจะโอเค - person JaskeyLam; 26.07.2014
comment
เฮ้ลองใส่ return หลังจาก response.sendRedirect :) - person Abhijeet Panwar; 26.07.2014
comment
ให้เราสนทนาต่อในการแชท - person JaskeyLam; 26.07.2014