서블릿이 "HTTP 상태 404 요청한 리소스 (/ servlet)를 사용할 수 없습니다."를 반환합니다.
내 WebContent/jsps
폴더 의 JSP 파일에 HTML 양식이 있습니다. 폴더의 servlet.java
기본 패키지에 서블릿 클래스 가 src
있습니다. 내에서 web.xml
그 같이 매핑됩니다 /servlet
.
action
HTML 양식의 속성으로 여러 URL을 시도했습니다 .
<form action="/servlet">
<form action="/servlet.java">
<form action="/src/servlet.java">
<form action="../servlet.java">
그러나 그 어느 것도 작동하지 않습니다. 그들은 모두 Tomcat 6/7/8에서 아래와 같이 HTTP 404 오류를 계속 반환합니다.
HTTP 상태 404 — / servlet
설명 : 요청 된 리소스 (/ servlet)를 사용할 수 없습니다.
또는 Tomcat 8.5 / 9에서 아래와 같이 :
HTTP 상태 404 — 찾을 수 없음
메시지 : / servlet
설명 : 원본 서버가 대상 리소스에 대한 현재 표현을 찾지 못했거나 존재 여부를 공개하지 않습니다.
왜 작동하지 않습니까?
서블릿 클래스를 package
우선 서블릿 클래스를 Java에 넣으십시오 package
. 당신은해야한다 항상 그렇지 않으면 같은 서버 자체와 같은 패키지에있는 클래스에 보이지 않는, 패키지에 공개적으로 재사용 가능한 자바 클래스를 넣어. 이렇게하면 잠재적 인 환경 관련 문제를 최소화 할 수 있습니다. 패키지없는 서블릿은 특정 Tomcat + JDK 조합에서만 작동하며 절대로 신뢰할 수 없습니다.
"일반"IDE 프로젝트의 경우 클래스는 "Java Resources"폴더 내의 패키지 구조에 배치되어야합니다. 따라서 "WebContent"가 아닌 JSP와 같은 웹 파일 용입니다. 다음은 네비게이터 보기에 표시 되는 기본 Eclipse 동적 웹 프로젝트 의 폴더 구조 예제입니다 .
EclipseProjectName
|-- src
| `-- com
| `-- example
| `-- YourServlet.java
|-- WebContent
| |-- WEB-INF
| | `-- web.xml
| `-- jsps
| `-- page.jsp
:
메이븐 프로젝트의 경우, 클래스는 패키지 구조 내부에 배치 될 필요가 main/java
있으므로 하지 예를 들어 main/resources
,이 비 클래스 파일입니다 . 다음은 Eclipse의 Navigator 보기 에서 볼 수있는 기본 Maven 웹앱 프로젝트의 폴더 구조 예입니다 .
MavenProjectName
|-- src
| `-- main
| |-- java
| | `-- com
| | `-- example
| | `-- YourServlet.java
| |-- resources
| `-- webapp
| |-- WEB-INF
| | `-- web.xml
| `-- jsps
| `-- page.jsp
:
점을 유의 /jsps
하위 폴더가 엄격하게 필요하지 않습니다. 그것 없이도 할 수 있고 JSP 파일을 webcontent / webapp 루트에 직접 넣을 수도 있지만 귀하의 질문에서 이것을 인계하고 있습니다.
에서 서블릿 URL 설정 url-pattern
서블릿 URL은 서블릿 매핑의 "URL 패턴"으로 지정됩니다. 정의에 따라 서블릿 클래스의 클래스 이름 / 파일 이름은 절대 아닙니다. 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
하려면 /servlet/*
대신 URL 패턴을 사용하십시오. / xyz / {value} / test와 같은 서블릿 및 경로 매개 변수 도 참조하십시오 . web.xml에서 매핑하는 방법은 무엇입니까?
@WebServlet
Servlet 3.0 이상에서만 작동합니다.
사용하려면 @WebServlet
, 당신은 당신 있는지 확인해야합니다 web.xml
어떤이 (가 서블릿 3.0 이후 옵션의) 경우, 선언 된 파일이 서블릿 3.0 버전을 준수 하므로 하지 예를 들어 2.5 버전을 준수 이하 . 아래는 Servlet 3.1과 호환되는 것입니다 (Tomcat 8+, WildFly 8+, GlassFish 4+ 등과 일치).
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1"
>
<!-- Config here. -->
</web-app>
또는 아직 Servlet 3.0 이상이 아닌 경우 (Tomcat 7 이상은 아니지만 Tomcat 6 이상) @WebServlet
주석 을 제거하십시오 .
package com.example;
public class YourServlet extends HttpServlet {
// ...
}
그리고 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과 같은 빌드 도구를 사용하는 경우 컴파일 된 서블릿 클래스 파일 /WEB-INF/classes
이 생성 된 WAR 파일의 폴더에있는 패키지 구조에 있는지 절대적으로 확인해야 합니다. 의 경우에 package com.example; public class YourServlet
있어야합니다 /WEB-INF/classes/com/example/YourServlet.class
. 그렇지 않으면 @WebServlet
404 오류가 발생하거나 <servlet>
아래와 같은 HTTP 500 오류가 발생합니다.
HTTP 상태 500
서블릿 클래스 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
.
서블릿이 올바르게 컴파일되고 클래스 경로에 배치되었는지 확인하는 쉬운 방법은 빌드 도구가 WAR 파일을 생성하도록 한 다음 (예 : 프로젝트에서 마우스 오른쪽 버튼 클릭, Eclipse에서 내보내기> WAR 파일 ) ZIP 도구로 해당 내용을 검사하는 것입니다. 에서 서블릿 클래스가 누락 된 /WEB-INF/classes
경우 프로젝트가 잘못 구성되었거나 일부 IDE / 프로젝트 구성 기본값이 실수로 되 돌린 것입니다 (예 : Eclipse에서 프로젝트> 자동 빌드 가 비활성화 됨). 단서가없는 경우에는 처음부터 다시 시작하고 IDE / 프로젝트 구성 기본값을 건드리지 않는 것이 가장 좋습니다.
개별적으로 서블릿 테스트
서버가에서 실행되고 localhost:8080
WAR이 컨텍스트 경로 /contextname
(기본값은 IDE 프로젝트 이름, 대소 문자 구분) 에 성공적으로 배포되었으며 서블릿이 초기화에 실패하지 않은 경우 (배포 / 서블릿 성공 / 실패 메시지와 실제 컨텍스트 경로 및 서블릿 매핑) URL 패턴이있는 서블릿 /servlet
은에서 사용할 수 있습니다 http://localhost:8080/contextname/servlet
.
브라우저의 주소 표시 줄에 직접 입력하여 개별적으로 테스트 할 수 있습니다. 그것의 경우 doGet()
제대로 오버라이드 (override) 및 구현, 당신은 브라우저에서 출력을 볼 수 있습니다. 또는 이 URL이 없거나doGet()
잘못 호출 super.doGet()
하는 경우 ' HTTP 405 : HTTP 메소드 GET이이 URL에서 지원되지 않습니다 '오류가 표시됩니다 (405가 서블릿이 있다는 증거이므로 404보다 낫습니다. 그 자체가 실제로 발견됩니다).
오버 라이딩 service()
은 MVC 프레임 워크를 재창조하지 않는 한 나쁜 습관입니다. 서블릿으로 시작하고 현재 질문에 설명 된 문제에 대해 단서가없는 경우 가능성이 거의 없습니다.) Design Patterns web based applications를 참조하십시오 .
그럼에도 불구하고 서블릿이 개별적으로 테스트했을 때 이미 404를 반환한다면 HTML 양식을 대신 사용해 보는 것은 전혀 의미가 없습니다. 따라서 논리적으로 서블릿의 404 오류에 대한 질문에 HTML 양식을 포함하는 것은 전적으로 의미가 없습니다.
HTML에서 서블릿 URL 참조
서블릿이 개별적으로 호출 될 때 제대로 작동하는지 확인한 후에는 HTML로 이동할 수 있습니다. HTML 양식의 구체적인 문제와 관련하여 <form action>
값은 유효한 URL이어야합니다. 에도 동일하게 적용됩니다 <a href>
. 절대 / 상대 URL의 작동 방식을 이해해야합니다. 알다시피 URL은 웹 브라우저의 주소 표시 줄에 입력 / 볼 수있는 웹 주소입니다. 즉, http://
스키마 없이 양식 작업으로 상대 URL을 지정하는 경우 웹 브라우저의 주소 표시 줄에 표시되는 것처럼 현재 URL에 상대적이 됩니다. 따라서 많은 초보자가 생각하는 것처럼 서버의 WAR 폴더 구조에서 JSP / HTML 파일 위치와 절대적으로 관련이 없습니다.
그래서, HTML 양식 JSP 페이지를 열 것을 가정 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을 도메인에 상대적으로 만들어 JSP 파일을 다른 폴더로 이동할 때 URL을 다시 수정할 필요가 없도록하는 것입니다.
<form action="${pageContext.request.contextPath}/servlet">
이것은 생성됩니다
<form action="/contextname/servlet">
따라서 항상 올바른 URL로 제출됩니다.
HTML에서 곧은 따옴표 사용
HTML은 같은 속성에서 당신은 당신이 바로 따옴표를 사용하고 절대적으로 만들 필요가 action="..."
또는 action='...'
이렇게하고 있지 곱슬 같은 따옴표 action=”...”
나 action=’...’
. 둥근 따옴표는 HTML에서 지원되지 않으며 단순히 값의 일부가됩니다.
또한보십시오:
- 서블릿 위키 페이지 -hello world 예제 포함
- HTML 형식에서 서블릿 클래스를 호출하는 방법
- 서블릿의 doGet 및 doPost
- JSP 페이지에서 하이퍼 링크 또는 버튼을 클릭하여 현재 항목을 Java 메소드로 전달하는 방법은 무엇입니까?
HTTP 상태 404 오류의 다른 경우 :
- HTTP 상태 404-Servlet [ServletName]을 사용할 수 없습니다.
- HTTP 상태 404-요청 된 리소스 (/ ProjectName /)를 사용할 수 없습니다.
- HTTP 상태 404-요청 된 리소스 (/)를 사용할 수 없습니다.
- / WEB-INF의 JSP가 "HTTP 상태 404 요청한 리소스를 사용할 수 없습니다"를 반환합니다.
- JSP 파일의 WEB-INF 폴더에있는 리소스를 참조하면 리소스에서 HTTP 404가 반환됩니다.
- 브라우저는 JSP로 전달되는 서블릿을 호출 할 때 CSS, 이미지 및 링크와 같은 관련 리소스에 액세스하거나 찾을 수 없습니다.
시나리오 # 1 : 당신은 accidentially 다시 배치 바람둥이 동안 명령 줄에서 이미 실행 .
짧은 답변 : Tomcat을 중지하고 대상 폴더 , mvn 패키지를 삭제 한 다음 다시 배포하십시오.
시나리오 # 2 : request.getRequestDispatcher ( " MIS_SPELLED_FILE_NAME .jsp")
짧은 답변 : 파일 이름 철자 를 확인하고 대소 문자 가 올바른지 확인하세요 .
시나리오 # 3 : 클래스를 찾을 수 없음 예외 (답변은 다음과 같은 이유로 여기에 넣었습니다 : Question # 17982240) ( Eclipse가있는 바람둥이의 서블릿에 대한 java.lang.ClassNotFoundException ) (중복으로 표시되고 여기로 안내했습니다)
짧은 답변 # 3.1 : web.xml의 servlet-class 태그에 잘못된 패키지 경로가 있습니다.
짧은 답변 # 3.2 : Java 파일에 잘못된 import 문이 있습니다.
다음은 시나리오 # 1에 대한 자세한 내용입니다.
1 : Tomcat 중지
- 옵션 1 : 터미널에서 CTRL + C를 통해.
- 옵션 2 : (톰캣이 실행되는 동안 터미널이 닫힘)
- ------------ 2.1 : 누르기 : Windows + R- > type : " services.msc "
- ------------ 2.2 : 목록의 이름 열에서 "Apache Tomcat #. # Tomcat #"을 찾습니다.
- ------------ 2.3 : 오른쪽 클릭-> " stop "
2 : "대상"폴더를 삭제합니다. (mvn clean은 여기서 도움이되지 않습니다)
3 : mvn 패키지
4 : YOUR_DEPLOYMENT_COMMAND_HERE
(내 : java -jar target / dependency / webapp-runner.jar --port 5190 target / *. war)
전체 뒷이야기 :
실수로 새 git-bash 창을 열고 다음을 통해 내 heroku 프로젝트에 대한 .war 파일을 배포하려고했습니다.
java -jar target / dependency / webapp-runner.jar --port 5190 target / *. war
After a failure to deploy, I realized I had two git-bash windows open, and had not used CTLR+C to stop the previous deployment.
I was met with:
HTTP Status 404 – Not Found Type Status Report
Message /if-student-test.jsp
Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
Apache Tomcat/8.5.31
Below is further details for Scenario #3:
SCENARIO 3.1: The servlet-class package path is wrong in your web.xml file.
It should MATCH the package statement at top of your java servlet class.
File: my_stuff/MyClass.java:
package my_stuff;
File: PRJ_ROOT/src/main/webapp/WEB-INF/web.xml
<servlet-class>
my_stuff.MyClass
</servlet-class>
SCENARIO 3.2:
You put the wrong "package" statement at top of your myClass.java file.
For example:
File is in: "/my_stuff" folder
You mistakenly write:
package com.my_stuff
This is tricky because:
1: The maven build (mvn package) will not report any errors here.
2: servlet-class line in web.xml can have CORRECT package path. E.g:
<servlet-class>
my_stuff.MyClass
</servlet-class>
Stack Used: Notepad++ + GitBash + Maven + Heroku Web App Runner + Tomcat9 + Windows10:
Solution for HTTP Status 404
in NetBeans IDE: Right click on your project and go to your project properties, then click on run, then input your project relative URL like index.jsp
.
- Project->Properties
- Click on Run
- Relative URL:/index.jsp (Select your project root URL)
My issue was that my method was missing the @RequestBody annotation. After adding the annotation I no longer received the 404 exception.
Do the following two steps. I hope, it will solve the "404 not found" issue in tomcat server during the development of java servlet application.
Step 1: Right click on the server(in the server explorer tab)->Properties->Switch Location from workspace metadata to tomcat server
Step 2: Double Click on the server(in the server explorer tab)->Select Use tomcat installation option inside server location menu
I removed the old web library such that are spring framework libraries. And build a new path of the libraries. Then it works.
An old thread, but since I didn't find it elsewhere, here is one more possibility:
If you're using servlet-api 3.0+, then your web.xml must NOT include metadata-complete="true"
attribute
This tells tomcat to map the servlets using data given in web.xml
instead of using the @WebServlet
annotation.
First of all, run your IDE as Admin. After that, right click the project folder -> Project Facets and make sure that the Java Version is set correct. On my PC. (For Example 1.8) Now it should work.
Don't just start your server, for example Wildfly, using the cmd. It has to be launched within the IDE and now visit your localhost URL. Example: http://localhost:8080/HelloWorldServlet/HelloWorld
Please check context root cannot be empty.
If you're using eclipse:
right click, select properties, then web project settings. Check the context root cannot be empty
'Nice programing' 카테고리의 다른 글
만약 ' (0) | 2020.10.05 |
---|---|
Java 메서드 선언에서 throw를 사용하는 경우 (0) | 2020.10.05 |
경고 : 상수 :: Fixnum은 새 모델을 생성 할 때 더 이상 사용되지 않습니다. (0) | 2020.10.05 |
추상 클래스보다 특성을 사용하는 장점은 무엇입니까? (0) | 2020.10.05 |
실용적인 자바 스크립트 객체 지향 디자인 패턴의 예 (0) | 2020.10.05 |