Servlet ส่งคืน“ สถานะ HTTP 404 ทรัพยากรที่ร้องขอ (/ servlet) ไม่พร้อมใช้งาน”


99

ฉันมีรูปแบบ HTML ในไฟล์ JSP ในWebContent/jspsโฟลเดอร์ของฉัน ฉันมีคลาส servlet servlet.javaในแพ็คเกจเริ่มต้นของฉันในsrcโฟลเดอร์ ในของฉันweb.xmlมันถูกแมปเป็น/servlet.

ฉันได้ลอง URL หลายรายการในactionแอตทริบิวต์ของรูปแบบ HTML:

<form action="/servlet">
<form action="/servlet.java">
<form action="/src/servlet.java">
<form action="../servlet.java">

แต่ไม่มีงานเหล่านั้น พวกเขาทั้งหมดส่งคืนข้อผิดพลาด HTTP 404 ดังต่อไปนี้ใน Tomcat 6/7/8:

สถานะ HTTP 404 - / servlet

คำอธิบาย : ทรัพยากรที่ร้องขอ (/ servlet) ไม่พร้อมใช้งาน

หรือดังต่อไปนี้ใน Tomcat 8.5 / 9:

HTTP Status 404 - ไม่พบ

ข้อความ : / servlet

คำอธิบาย : เซิร์ฟเวอร์ต้นทางไม่พบการเป็นตัวแทนปัจจุบันสำหรับทรัพยากรเป้าหมายหรือไม่เต็มใจที่จะเปิดเผยว่ามีอยู่

ทำไมมันไม่ทำงาน?

คำตอบ:


131

ใส่คลาส servlet ใน package

ครั้งแรกของทั้งหมดใส่ชั้นเซิร์ฟเล็ตใน packageJava คุณควรเสมอใส่เรียน Java Reuseable สาธารณชนในแพคเกจมิฉะนั้นพวกเขาจะมองไม่เห็นจากการเรียนที่อยู่ในแพคเกจเช่นเซิร์ฟเวอร์เอง วิธีนี้ช่วยขจัดปัญหาเฉพาะสภาพแวดล้อมที่อาจเกิดขึ้นได้ servlets แบบไม่ใช้แพ็กเกจทำงานเฉพาะในชุดค่าผสม Tomcat + JDK ที่เฉพาะเจาะจงและสิ่งนี้ไม่ควรพึ่งพา

ในกรณีของโปรเจ็กต์ IDE "ธรรมดา" คลาสจะต้องถูกวางไว้ในโครงสร้างแพ็กเกจภายในโฟลเดอร์ "Java Resources" และไม่ใช่ "WebContent" ซึ่งเป็นไฟล์เว็บเช่น JSP ด้านล่างนี้เป็นตัวอย่างโครงสร้างโฟลเดอร์ของ Eclipse Dynamic Web Project ที่เป็นค่าเริ่มต้นดังที่เห็นในมุมมองNavigator :

EclipseProjectName
 |-- src
 |    `-- com
 |         `-- example
 |              `-- YourServlet.java
 |-- WebContent
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    `-- jsps
 |         `-- page.jsp
 :

ในกรณีของโครงการ Maven ชั้นจะต้องมีการวางไว้ในโครงสร้างภายในแพคเกจของมันmain/java จึงไม่ได้เช่นmain/resourcesนี้เป็นไฟล์ที่ไม่ใช่ระดับ ด้านล่างนี้เป็นตัวอย่างโครงสร้างโฟลเดอร์ของโปรเจ็กต์ Maven webapp เริ่มต้นดังที่เห็นในมุมมองNavigatorของ Eclipse :

MavenProjectName
 |-- src
 |    `-- main
 |         |-- java
 |         |    `-- com
 |         |         `-- example
 |         |              `-- YourServlet.java
 |         |-- resources
 |         `-- webapp
 |              |-- WEB-INF
 |              |    `-- web.xml
 |              `-- jsps
 |                   `-- page.jsp
 :

โปรดทราบว่า/jspsโฟลเดอร์ย่อยไม่จำเป็นอย่างยิ่ง คุณสามารถทำได้โดยไม่ต้องใช้มันและวางไฟล์ JSP โดยตรงใน webcontent / webapp root แต่ฉันแค่รับเรื่องนี้จากคำถามของคุณ

ตั้งค่า servlet URL ใน url-pattern

URL ของ servlet ถูกระบุเป็น "รูปแบบ URL" ของการแมป servlet ไม่ใช่อย่างแน่นอนตามนิยามชื่อคลาส / ชื่อไฟล์ของคลาส servlet รูปแบบ URL จะถูกระบุเป็นค่าของ@WebServletคำอธิบายประกอบ

package com.example; // Use a package!

@WebServlet("/servlet") // This is the URL of the servlet.
public class YourServlet extends HttpServlet { // Must be public and extend HttpServlet.
    // ...
}

ในกรณีที่คุณต้องการสนับสนุนพารามิเตอร์เส้นทางเช่น/servlet/foo/barให้ใช้รูปแบบ URL /servlet/*แทน โปรดดูพารามิเตอร์ Servlet และ path เช่น / xyz / {value} / test วิธีแมปใน web.xml

@WebServlet ใช้งานได้กับ Servlet 3.0 หรือใหม่กว่าเท่านั้น

เพื่อการใช้งาน@WebServletที่คุณจะต้องให้แน่ใจว่าคุณweb.xmlไฟล์ถ้ามี (มันไม่จำเป็นตั้งแต่ Servlet 3.0) มีการประกาศตาม Servlet 3.0 ขึ้นไปรุ่นจึงไม่สอดคล้องเช่นรุ่น 2.5 หรือลด ด้านล่างนี้เป็นรุ่นที่เข้ากันได้กับ Servlet 4.0 (ซึ่งตรงกับ Tomcat 9+, WildFly 11+, Payara 5+ ฯลฯ )

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0"
>
    <!-- Config here. -->
</web-app>

หรือในกรณีที่คุณยังไม่ได้ใช้ Servlet 3.0+ (เช่น Tomcat 6 หรือเก่ากว่า) ให้ลบ@WebServletคำอธิบายประกอบออก

package com.example;

public class YourServlet extends HttpServlet {
    // ...
}

และลงทะเบียน servlet แทนในweb.xmlลักษณะนี้:

<servlet>
    <servlet-name>yourServlet</servlet-name>
    <servlet-class>com.example.YourServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>yourServlet</servlet-name>
    <url-pattern>/servlet</url-pattern>  <!-- This is the URL of the servlet. -->
</servlet-mapping>

โปรดทราบว่าคุณไม่ควรใช้ทั้งสองวิธี ใช้การกำหนดค่าตามคำอธิบายประกอบหรือการกำหนดค่าตาม XML เมื่อคุณมีทั้งสองอย่างการกำหนดค่าตาม XML จะลบล้างการกำหนดค่าตามคำอธิบายประกอบ

การตรวจสอบการสร้าง / การปรับใช้

ในกรณีที่คุณใช้เครื่องมือสร้างเช่น Eclipse และ / หรือ Maven คุณต้องตรวจสอบให้แน่ใจว่าไฟล์คลาส servlet ที่คอมไพล์นั้นอยู่ในโครงสร้างแพ็คเกจใน/WEB-INF/classesโฟลเดอร์ของไฟล์ WAR ที่สร้างขึ้น ในกรณีนี้package com.example; public class YourServletจะต้องอยู่ใน/WEB-INF/classes/com/example/YourServlet.class. มิฉะนั้นคุณจะต้องเผชิญกับ@WebServletข้อผิดพลาด 404 หรือในกรณีของ<servlet>ข้อผิดพลาด HTTP 500 ดังต่อไปนี้:

สถานะ HTTP 500

เกิดข้อผิดพลาดในการสร้างอินสแตนซ์คลาส servlet com.example.YourServlet

และค้นหาในเซิร์ฟเวอร์บันทึก a java.lang.ClassNotFoundException: com.example.YourServletตามด้วย a java.lang.NoClassDefFoundError: com.example.YourServletตามด้วยjavax.servlet.ServletException: Error instantiating servlet class com.example.YourServlet.

วิธีง่ายๆในการตรวจสอบว่า servlet ถูกคอมไพล์และวางไว้ใน classpath อย่างถูกต้องหรือไม่คือการปล่อยให้เครื่องมือ build สร้างไฟล์ WAR (เช่น rightclick project, Export> WAR fileใน Eclipse) จากนั้นตรวจสอบเนื้อหาด้วยเครื่องมือ ZIP หากไม่มีคลาส servlet ใน/WEB-INF/classesหรือหากการเอ็กซ์พอร์ตทำให้เกิดข้อผิดพลาดแสดงว่าโปรเจ็กต์ถูกกำหนดค่าไม่ดีหรือค่าดีฟอลต์คอนฟิกูเรชัน IDE / โปรเจ็กต์บางอย่างถูกยกเลิกโดยไม่ถูกต้อง (เช่นProject> Build Automaticallyถูกปิดใช้งานใน Eclipse)

นอกจากนี้คุณต้องตรวจสอบให้แน่ใจว่าไอคอนโครงการไม่มีเครื่องหมายกากบาทสีแดงที่ระบุข้อผิดพลาดของการสร้าง คุณสามารถค้นหาข้อผิดพลาดที่แน่นอนได้ใน มุมมองปัญหา ( หน้าต่าง> แสดงมุมมอง> อื่น ๆ ... ) โดยปกติแล้วข้อความแสดงข้อผิดพลาดนั้นใช้ได้กับ Googlable ในกรณีที่คุณไม่มีเบาะแสวิธีที่ดีที่สุดคือเริ่มต้นใหม่ตั้งแต่ต้นและอย่าแตะค่าเริ่มต้นการกำหนดค่า IDE / โครงการ ในกรณีที่คุณใช้ Eclipse คุณสามารถดูคำแนะนำได้ในฉันจะนำเข้า javax.servlet API ในโครงการ Eclipse ของฉันได้อย่างไร

ทดสอบ servlet ทีละรายการ

โดยมีเงื่อนไขว่าเซิร์ฟเวอร์รันlocalhost:8080และ WAR ถูกปรับใช้บนพา ธ บริบทสำเร็จ/contextname(ซึ่งดีฟอลต์ชื่อโปรเจ็กต์ IDE, case sensitive!) และ servlet ไม่ล้มเหลวในการเตรียมใช้งาน (อ่านบันทึกเซิร์ฟเวอร์สำหรับการปรับใช้ / ใด ๆ ความสำเร็จ servlet / ล้มเหลวข้อความและเส้นทางบริบทและการทำแผนที่เซิร์ฟเล็ตที่เกิดขึ้นจริง) แล้วเซิร์ฟเล็ตที่มีรูปแบบ URL ของที่มีอยู่ใน/servlethttp://localhost:8080/contextname/servlet

คุณสามารถป้อนลงในแถบที่อยู่ของเบราว์เซอร์ได้โดยตรงเพื่อทดสอบไม่ถูกต้อง หากdoGet()ถูกลบล้างและใช้งานอย่างถูกต้องคุณจะเห็นผลลัพธ์ในเบราว์เซอร์ หรือถ้าคุณไม่มีdoGet()หรือหากเรียกไม่ถูกต้องข้อผิดพลาดsuper.doGet()" HTTP 405: HTTP method GET ไม่ได้รับการสนับสนุนโดย URL นี้ " จะแสดงขึ้น (ซึ่งยังดีกว่า 404 เนื่องจาก 405 เป็นหลักฐานว่า servlet พบตัวมันเอง)

เอาชนะservice()คือการปฏิบัติที่ไม่ดีถ้าคุณกำลังปฏิรูปกรอบ MVC - ซึ่งไม่น่ามากถ้าคุณเพิ่งเริ่มออกมาพร้อมกับ Servlets และ clueless เป็นปัญหาที่อธิบายไว้ในคำถามปัจจุบัน;) ดูเพิ่มเติมการออกแบบการใช้งานรูปแบบเว็บเบส

ไม่ว่า servlet จะส่งคืน 404 ไปแล้วเมื่อทดสอบโดยไม่ถูกต้องแล้วก็ไม่มีจุดหมายโดยสิ้นเชิงที่จะลองใช้รูปแบบ HTML แทน ดังนั้นจึงไม่มีจุดหมายโดยสิ้นเชิงที่จะรวมรูปแบบ HTML ใด ๆ ในคำถามเกี่ยวกับข้อผิดพลาด 404 จาก servlet

อ้างอิง servlet URL จาก HTML

เมื่อคุณตรวจสอบแล้วว่า servlet ทำงานได้ดีเมื่อเรียกใช้ทีละรายการคุณสามารถเลื่อนไปยัง HTML ได้ สำหรับปัญหาที่เป็นรูปธรรมของคุณกับรูปแบบ HTML <form action>ค่าจะต้องเป็น URL ที่ถูกต้อง <a href>เช่นเดียวกับ คุณต้องเข้าใจว่า URL สัมบูรณ์ / สัมพัทธ์ทำงานอย่างไร คุณทราบดีว่า URL คือที่อยู่เว็บที่คุณสามารถป้อน / ดูได้ในแถบที่อยู่ของเว็บเบราว์เซอร์ หากคุณกำลังระบุ URL สัมพัทธ์เป็นการดำเนินการในรูปแบบเช่นโดยไม่มีhttp://โครงร่างURL นั้นจะสัมพันธ์กับURL ปัจจุบันดังที่คุณเห็นในแถบที่อยู่ของเว็บเบราว์เซอร์ของคุณ ดังนั้นจึงไม่เกี่ยวข้องกับตำแหน่งไฟล์ JSP / HTML ในโครงสร้างโฟลเดอร์ WAR ของเซิร์ฟเวอร์อย่างที่ผู้เริ่มหลายคนคิด

ดังนั้นสมมติว่าหน้า JSP กับรูปแบบ HTML จะถูกเปิดโดยhttp://localhost:8080/contextname/jsps/page.jsp, และคุณจะต้องส่งไปยังเซิร์ฟเล็ตที่ตั้งอยู่ในhttp://localhost:8080/contextname/servletที่นี่มีหลายกรณี (ทราบว่าคุณได้อย่างปลอดภัยสามารถทดแทน<form action>กับ<a href>ที่นี่):

  • การดำเนินการแบบฟอร์มส่งไปยัง URL โดยมีเครื่องหมายทับ

      <form action="/servlet">
    

    เครื่องหมายทับนำหน้า/ทำให้ URL สัมพันธ์กับโดเมนดังนั้นแบบฟอร์มจะถูกส่งไปยัง

      http://localhost:8080/servlet
    

    แต่สิ่งนี้อาจส่งผลให้เกิด 404 เนื่องจากอยู่ในบริบทที่ไม่ถูกต้อง


  • การดำเนินการแบบฟอร์มส่งไปยัง URL โดยไม่มีเครื่องหมายทับ

      <form action="servlet">
    

    สิ่งนี้ทำให้ URL สัมพันธ์กับโฟลเดอร์ปัจจุบันของ URL ปัจจุบันดังนั้นแบบฟอร์มจะถูกส่งไปยัง

      http://localhost:8080/contextname/jsps/servlet
    

    แต่อาจส่งผลให้เกิด 404 เนื่องจากอยู่ในโฟลเดอร์ที่ไม่ถูกต้อง


  • การดำเนินการแบบฟอร์มส่งไปยัง URL ซึ่งขึ้นไปหนึ่งโฟลเดอร์

      <form action="../servlet">
    

    สิ่งนี้จะเพิ่มขึ้นหนึ่งโฟลเดอร์ (เหมือนกับในเส้นทางระบบไฟล์ดิสก์ในเครื่อง!) ดังนั้นแบบฟอร์มจะถูกส่งไปยัง

      http://localhost:8080/contextname/servlet
    

    อันนี้ต้องเวิร์ค!


  • อย่างไรก็ตามวิธีการยอมรับคือการทำให้โดเมน URL สัมพันธ์กันเพื่อที่คุณจะได้ไม่ต้องแก้ไข URL อีกครั้งเมื่อคุณย้ายไฟล์ JSP ไปยังโฟลเดอร์อื่น

      <form action="${pageContext.request.contextPath}/servlet">
    

    สิ่งนี้จะสร้าง

      <form action="/contextname/servlet">
    

    ซึ่งจะส่งไปยัง URL ที่ถูกต้องเสมอ


ใช้เครื่องหมายคำพูดตรงใน HTML

คุณต้องให้แน่ใจว่าคุณกำลังใช้คำพูดตรงใน HTML คุณลักษณะเหมือนaction="..."หรือaction='...'จึงไม่ได้คำพูดหยิกเหมือนหรือaction=”...” action=’...’HTML ไม่รองรับเครื่องหมายคำพูดแบบหยิกและจะกลายเป็นส่วนหนึ่งของมูลค่า ระวังเมื่อคัดลอกข้อมูลโค้ดจากบล็อก! เครื่องมือบล็อกบางอย่างโดยเฉพาะอย่างยิ่ง Wordpress เป็นที่รู้กันว่าโดยค่าเริ่มต้นจะใช้สิ่งที่เรียกว่า "คำพูดอัจฉริยะ" ซึ่งทำให้คำพูดในตัวอย่างโค้ดเสียหายด้วยเช่นกัน ในทางกลับกันแทนที่จะใช้รหัสคัดลอกวางลองพิมพ์ทับรหัสด้วยตัวเอง ข้อดีเพิ่มเติมของการรับโค้ดผ่านสมองและนิ้วมือของคุณคือมันจะทำให้คุณจำและเข้าใจโค้ดได้ดีขึ้นมากในระยะยาวและยังทำให้คุณเป็นนักพัฒนาที่ดีขึ้นอีกด้วย

ดูสิ่งนี้ด้วย:

กรณีอื่น ๆ ของข้อผิดพลาด HTTP Status 404:


1
web-app version = "3.1" โดยใช้ glassfish ฉันสามารถทดสอบ servlet ทีละรายการได้ดีเมื่อฉันมีการแมปใน web.xml และคำอธิบายประกอบ ฉันลบการแมปและทิ้งคำอธิบายประกอบไว้เนื่องจากฉันมีเวอร์ชันล่าสุด แต่ฉันจะได้รับข้อผิดพลาด 404?
SallyRothroat

1
สิ่งนี้อาจเกิดขึ้นได้หากคุณรวม servlet 2.5 หรือไลบรารีที่เก่ากว่าไว้ใน webapp เองแทนที่จะอาศัยรันไทม์เป้าหมายเพื่อจัดเตรียมไลบรารี servlet ด้วยตัวเอง
BalusC

@xdola: มันเปราะเพราะขึ้นอยู่กับคำขอ URI เพียงอ่านคำตอบสำหรับคำอธิบายเกี่ยวกับปัญหาของคุณและแนวทางที่ถูกต้องคืออะไร
BalusC

4

สถานการณ์ # 1:คุณนำไปใช้งานใหม่โดยไม่ได้ตั้งใจจากบรรทัดคำสั่งในขณะที่ Tomcat กำลังทำงานอยู่

คำตอบสั้น ๆ :หยุด Tomcat ลบโฟลเดอร์เป้าหมายแพ็คเกจ mvn จากนั้นปรับใช้ใหม่


สถานการณ์ # 2: request.getRequestDispatcher (" MIS_SPELLED_FILE_NAME .jsp")

คำตอบสั้น:เช็คชื่อไฟล์การสะกดคำให้ตรวจสอบกรณีที่ถูกต้อง


สถานการณ์ # 3: ไม่พบข้อยกเว้นของคลาส (คำตอบวางไว้ที่นี่เนื่องจาก: คำถาม # 17982240) ( java.lang.ClassNotFoundException สำหรับ servlet ใน tomcat ที่มี eclipse ) (ถูกทำเครื่องหมายว่าซ้ำและนำฉันมาที่นี่)

คำตอบสั้น ๆ # 3.1: web.xml มีเส้นทางแพ็กเกจไม่ถูกต้องในแท็ก servlet-class

คำตอบสั้น ๆ # 3.2: ไฟล์ java มีคำสั่งนำเข้าที่ไม่ถูกต้อง


ด้านล่างนี้เป็นรายละเอียดเพิ่มเติมสำหรับสถานการณ์ # 1:


1: หยุด Tomcat

  • ตัวเลือกที่ 1: ผ่าน CTRL + C ในเทอร์มินัล
  • ทางเลือกที่ 2: (เทอร์มินัลปิดในขณะที่ทอมแคทยังทำงานอยู่)
  • ------------ 2.1: กด: Windows + R -> พิมพ์: " services.msc "
  • ------------ 2.2: ค้นหา "Apache Tomcat #. # Tomcat #" ในคอลัมน์ชื่อของรายการ
  • ------------ 2.3: คลิกขวา -> " หยุด "

2: ลบโฟลเดอร์ "เป้าหมาย" (mvn clean จะไม่ช่วยคุณที่นี่)

3: แพ็คเกจ mvn

4: YOUR_DEPLOYMENT_COMMAND_HERE

(ของฉัน: java -jar target / dependency / webapp-runner.jar --port 5190 target / *. war)

เต็มเรื่องกลับ:


เปิดหน้าต่าง git-bash ใหม่โดยไม่ได้ตั้งใจและพยายามปรับใช้ไฟล์. war สำหรับโครงการ heroku ของฉันผ่าน:

java -jar target / dependency / webapp-runner.jar --port 5190 target / *. war

หลังจากความล้มเหลวในการปรับใช้ฉันรู้ฉันมีสองหน้าต่าง Git-ทุบตีเปิดและไม่ได้ใช้ CTLR + C เพื่อหยุดการใช้งานก่อนหน้านี้

ฉันได้พบกับ:

HTTP Status 404 - ไม่พบรายงานสถานะประเภท

ข้อความ /if-student-test.jsp

คำอธิบายเซิร์ฟเวอร์ต้นทางไม่พบการเป็นตัวแทนปัจจุบันสำหรับทรัพยากรเป้าหมายหรือไม่เต็มใจที่จะเปิดเผยว่ามีอยู่

Apache Tomcat / 8.5.31

ด้านล่างนี้เป็นรายละเอียดเพิ่มเติมสำหรับสถานการณ์ # 3:


SCENARIO 3.1: พา ธ แพ็กเกจคลาส servlet ไม่ถูกต้องในไฟล์ web.xml ของคุณ

ควรตรงกับคำสั่งแพ็กเกจที่ด้านบนสุดของคลาส java servlet ของคุณ

ไฟล์: my_stuff / MyClass.java :

   package my_stuff;

ไฟล์: PRJ_ROOT / src / main / webapp / WEB-INF / web.xml

   <servlet-class>
   my_stuff.MyClass
   </servlet-class>

สถานการณ์ 3.2:

คุณใส่คำสั่ง " package " ผิดที่ด้านบนของไฟล์ myClass.java

ตัวอย่างเช่น:

ไฟล์อยู่ในโฟลเดอร์: " / my_stuff "

คุณเขียนผิด:

package com.my_stuff

นี่เป็นเรื่องยุ่งยากเพราะ:

1: maven build (แพ็คเกจ mvn) จะไม่รายงานข้อผิดพลาดใด ๆ ที่นี่

2: สาย servlet-class ใน web.xml สามารถมีเส้นทางแพ็กเกจที่ถูกต้อง เช่น:

<servlet-class>
my_stuff.MyClass
</servlet-class>

กองที่ใช้: Notepad ++ + GitBash + Maven + Heroku Web App Runner + Tomcat9 + Windows10 :


AppName.war ของคุณและทำให้ชื่อโฟลเดอร์ที่ระเบิดไม่ตรงกับชื่อที่คุณคาดไว้ตัวอย่างเช่นเมื่อไฟล์สงครามของคุณเป็นเวอร์ชันเช่น AppName-1.0-SNAPSHOT.war และคุณกำลังพยายาม / AppName /
ก.ค.

1

ตรวจสอบว่าคุณได้ป้อนการแม็ป URL ที่ถูกต้องตามที่ระบุไว้ใน Web.xml หรือไม่

ตัวอย่างเช่น:

ใน web.xml การประกาศ servlet ของคุณอาจ:

<servlet>
        <servlet-name>ControllerA</servlet-name>
        <servlet-class>PackageName.ControllerA</servlet-class>
</servlet>

<servlet-mapping>
        <servlet-name>ControllerA</servlet-name>
        <url-pattern>/theController</url-pattern>
</servlet-mapping>

สิ่งที่ข้อมูลโค้ดนี้ทำคือ<url-pattern>/theController</url-pattern>ตั้งชื่อที่จะใช้เพื่อเรียก servlet จากส่วนหน้า (เช่น: form) ผ่าน URL ดังนั้นเมื่อคุณอ้างอิง servlet ในส่วนหน้าเพื่อให้แน่ใจว่าคำร้องขอไปที่ servlet "ControllerA" ควรอ้างอิงรูปแบบ URL ที่ระบุ "theController" จากแบบฟอร์ม

เช่น:

<form action="theController" method="POST">
</form>

0

โซลูชั่นสำหรับHTTP Status 404ใน NetBeans IDE: คลิกขวาในโครงการของคุณและไปที่คุณสมบัติของโครงการของคุณแล้วคลิกที่ทำงานแล้วป้อนข้อมูลโครงการ URL index.jspญาติของคุณเช่น

  1. โครงการ -> คุณสมบัติ
  2. คลิกที่เรียกใช้
  3. URL สัมพัทธ์: /index.jsp (เลือก URL รูทโปรเจ็กต์ของคุณ)

ป้อนคำอธิบายภาพที่นี่


0

ปัญหาของฉันคือวิธีการของฉันไม่มีคำอธิบายประกอบ @RequestBody หลังจากเพิ่มคำอธิบายประกอบแล้วฉันไม่ได้รับข้อยกเว้น 404 อีกต่อไป


0

ทำสองขั้นตอนต่อไปนี้ ฉันหวังว่ามันจะแก้ปัญหา "ไม่พบ 404" ในเซิร์ฟเวอร์ tomcat ระหว่างการพัฒนาแอปพลิเคชัน java servlet

ขั้นตอนที่ 1: Right click on the server(in the server explorer tab)->Properties->Switch Location from workspace metadata to tomcat server

ขั้นตอนที่ 2: Double Click on the server(in the server explorer tab)->Select Use tomcat installation option inside server location menu


0

ฉันลบเว็บไลบรารีเก่าซึ่งเป็นห้องสมุดกรอบสปริง และสร้างเส้นทางใหม่ของไลบรารี จากนั้นก็ใช้งานได้


0

เธรดเก่า แต่เนื่องจากฉันไม่พบที่อื่นนี่เป็นอีกหนึ่งความเป็นไปได้:

หากคุณกำลังใช้servlet-API 3.0 ขึ้นไปแล้ว web.xml ของคุณจะต้องไม่รวมถึงmetadata-complete="true"แอตทริบิวต์

ป้อนคำอธิบายภาพที่นี่

สิ่งนี้บอกให้ tomcat แมป servlets โดยใช้ข้อมูลที่กำหนดweb.xmlแทนการใช้@WebServletคำอธิบายประกอบ


0

ก่อนอื่นเรียกใช้ IDE ของคุณในฐานะผู้ดูแลระบบ หลังจากนั้นคลิกขวาที่โฟลเดอร์โครงการ -> Project Facets และตรวจสอบให้แน่ใจว่า Java Version ตั้งค่าถูกต้อง บนพีซีของฉัน (ตัวอย่างที่ 1.8) ตอนนี้ควรใช้งานได้แล้ว

อย่าเพิ่งเริ่มเซิร์ฟเวอร์ของคุณตัวอย่างเช่น Wildfly โดยใช้ cmd จะต้องเปิดใช้งานภายใน IDE และตอนนี้ไปที่ URL localhost ตัวอย่าง: http: // localhost: 8080 / HelloWorldServlet / HelloWorld


0

การแก้ไขที่ใช้ได้ผลสำหรับฉันคือ (ถ้าคุณใช้ Maven): คลิกขวาที่โครงการของคุณ Maven -> อัปเดตโครงการ สิ่งนี้อาจทำให้คุณมีข้อผิดพลาดอื่น ๆ กับ JDK และไลบรารีอื่น ๆ (ในกรณีของฉันคือตัวเชื่อมต่อ MySQL) แต่เมื่อคุณแก้ไขแล้วปัญหาเดิมของคุณควรได้รับการแก้ไข!


0

หากคุณต้องการเปิด servlet ด้วย javascript โดยไม่ใช้ปุ่ม "form" และ "submit" นี่คือรหัสต่อไปนี้:

var button = document.getElementById("<<button-id>>");
button.addEventListener("click", function() {
  window.location.href= "<<full-servlet-path>>" (eg. http://localhost:8086/xyz/servlet)
});

สำคัญ:

1) button-id: แท็ก 'id' ที่คุณมอบให้กับปุ่มของคุณในไฟล์ html / jsp

2) full-servlet-path: พา ธ ที่แสดงในเบราว์เซอร์เมื่อคุณเรียกใช้ servlet เพียงอย่างเดียว


0

การแมปใน web.xml คือสิ่งที่ฉันได้ทำไปแล้ว: -

  1. หากมีแพ็คเกจอื่นที่สร้างขึ้นสำหรับโปรแกรมใหม่เราต้องพูดถึง: -

packagename.filename ระหว่างการเปิดและปิดแท็กคลาส servlet ในไฟล์ xml

  1. หากคุณกำลังแมปไฟล์ของคุณเป็น xml และไม่ทำงานหรือแสดงข้อผิดพลาดให้แสดงความคิดเห็นในบรรทัดคำอธิบายประกอบของโค้ดในไฟล์ต่างๆ

ทั้งสองวิธีไม่สามารถใช้งานร่วมกันได้ดังนั้นฉันจึงใช้วิธีการใส่คำอธิบายประกอบของไฟล์ที่กล่าวถึงเมื่อเราสร้าง servlet หรือวิธีการแมปจากนั้นฉันจะลบหรือแสดงความคิดเห็นในบรรทัดคำอธิบายประกอบ เช่น:

 <servlet>
   <servlet-name>s1</servlet-name>
   <servlet-class>performance.FirstServ</servlet-class>
   </servlet>    
   
   <servlet-mapping>
   <servlet-name>s1</servlet-name>
   <url-pattern>/FirstServ</url-pattern>
   </servlet-mapping>
   
   <servlet>
   <servlet-name>s2</servlet-name>
   <servlet-class>performance.SecondServ</servlet-class>
   </servlet>
   
   <servlet-mapping>
   <servlet-name>s2</servlet-name>
   <url-pattern>/SecondServ</url-pattern>
   </servlet-mapping>

การแสดงความคิดเห็นบรรทัดคำอธิบายประกอบของโค้ดในไฟล์ตามลำดับหากการแมป xml เสร็จ

//@WebServlet("/FirstServ")
//@WebServlet("/SecondServ")

0

หากมีคนอยู่ที่นี่ซึ่งใช้ MySQL และรู้สึกว่ารหัสใช้งานได้ในวันก่อนหน้าและตอนนี้ไม่เป็นเช่นนั้นฉันเดาว่าคุณต้องเปิด MySQL CLI หรือ MySQL Workbench และทำการเชื่อมต่อกับฐานข้อมูลเพียงครั้งเดียว เมื่อเชื่อมต่อแล้วฐานข้อมูลก็จะเชื่อมต่อกับ Java Application ฉันเคยได้รับข้อผิดพลาด Hibernate Dialect ระบุว่ามีบางอย่างผิดปกติกับ com.mysql.jdbc.Driver ฉันคิดว่า MySQL ในคอมพิวเตอร์บางเครื่องมีปัญหาในการเริ่มต้นระบบ สิ่งนี้แก้ไขได้สำหรับฉัน


0

หากคุณเป็นนักเรียนและเพิ่งเริ่มใช้ Java อาจมีปัญหาบางอย่างเกิดขึ้นกับไฟล์ web.xml ของคุณ

  1. ลองลบไฟล์ web.xml
  2. ประการที่สองตรวจสอบว่าตัวแปรเส้นทางของคุณได้รับการตั้งค่าอย่างถูกต้องหรือไม่
  3. รีสตาร์ทเซิร์ฟเวอร์ Tomcat หรือพีซีของคุณ

ปัญหาของคุณจะได้รับการแก้ไขอย่างแน่นอน


-1

กรุณาตรวจสอบบริบท root ต้องไม่ว่างเปล่า

หากคุณกำลังใช้คราส:
คลิกขวาเลือกคุณสมบัติแล้วตั้งค่าโครงการเว็บ ตรวจสอบรูทบริบทต้องไม่ว่างเปล่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.