2023. 6. 29. 14:03ㆍ프로그래밍/웹 개발
문제상황 : Servlet을 이용해 웹 서버에서 설정해놓은 클래스를 통해 페이지를 이동시키게끔 구현한 실습을 진행중이었다.
그러나 아예 클래스 파일에 접근조차 하지 못하는 문제가 발생했다(이는 클래스 내에 여러가지 메서드에 출력문과 404 Not Found 에러를 통해 유추할 수 있었다.). 즉 매핑방식이라던지 매핑된 URL에 접근하는 방법이 잘못됨을 뜻했다.
그래서 기존에 annotation 매핑으로 진행했던 실습을 xml로 진행해보았음에도 동일했다.
RequestDispatcher dis = req.getRequestDispatcher("JSP_MVC/servlet/01_joinView.jsp");// 톰캣서버가 기본경로로 잡고있는 건 제외하고 pacakage이름을 설정해준다.
* 주의 : 같은 404라도 어디에서 404가 발생했는지 확인하고 에러를 찾아나가야 한다.
필자의 경우 처음부터 클래스를 읽어오지 못해서 404가 발생하고 있음을 클래스내의 doGet(), doPost(), init()메서드를 통해 알고 있었기 때문에 매핑된 class를 찾는 방법에 초점을 두고 문제를 해결했으나 위와 같이 디스패처의 주소가 잘못돼 404가 뜰 수도 있으니 명확히 구분하고 에러에 접근할 것을 권장함.
결론적으로 말하자면 form태그에서 넘기는 action 태그의 url 설정 방식이 잘못됐었다.
구글링을 해봐도 form태그의 action에는 모두 URL에서 /를 빼고 어노테이션 매핑이나 xml파일의 <url-pattern>태그에만 url 앞에 /를 붙이라고 헀다. 그러나 나의 경우에는 달랐다. 매핑방법은 다음과 같았다.
1. xml 매핑
2. 어노테이션 매핑
1. xml 매핑
<?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"
>
<servlet>
<servlet-name>na</servlet-name>
<servlet-class>servlet.JoinAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>na</servlet-name>
<url-pattern>/joinAction</url-pattern>
</servlet-mapping>
<!-- 어노테이션 매핑이 안돼 설정한 web.xml파일의 서블릿 매핑 방식 -->
</web-app>
xml 매핑의 경우 과거에 쓰던 방식인 것 같다. web.xml파일에서 web abb태그내에 이렇게 두개의 태그를 작성해주면 된다. 세부적인 태그에 대한 설명은 설명하지 않아도 어떤식으로 동작하는지 알 수 있을 것이다.
2. 어노테이션 매핑
@WebServlet("/joinAction")
public class JoinAction extends HttpServlet {
2번의 경우 어노테이션 매핑방법이다. 매핑하고자 하는 src폴더의 java클래스에 위와 같이 작성한다.
이렇게 매핑시킨 클래스에 접근하기 위해서는 html태그에서 매핑시 설정했던 url 패턴으로 지정해야 하는데 여기서 나는 에러가 발생했다. 보통 html의 action 부분에는 슬래쉬(/)없이 uri를 적었는데 나같은경우에는 html태그에도 슬래쉬를 붙여줘야 했다.
아래는 위와 같이 매핑했을 때에 에러를 발생시킨 코드와 정상 작동한 html 코드이다(정확히 말하면 에러라기 보다 애초에 클래스 파일을 찾지를 못함).
필자 기준 에러 발생
<form method="post" action="joinAction"> <!-- 왜 이렇게 해줘야하지?-->
정상 작동한 코드 (URL앞에 /가 붙어있음)
<form method="post" action="/joinAction"> <!-- 왜 이렇게 해줘야하지?-->
실행환경 : 맥북 에어 m1 / ventura OS 13버전 이상 , 툴은 intellij, 서버 환경은 tomcat 9.0.74버전이다. JAVA EE version은 9버전으로 톰캣과 EE버전의 호환성도 맞춰준 상태였다. html의 태그를 위와 같이 설정했을 시에는 매핑 방식으로 xml에 태그를 추가하든 java클래스에 어노테이션을 추가하든 정상작동 했다.
'프로그래밍 > 웹 개발' 카테고리의 다른 글
[Mybatis]페이지 무한로딩 문제 해결 (0) | 2023.07.10 |
---|---|
[Intellij] 웹 프로젝트에 라이브러리 경로 적용(WEB-INF에 lib의 jar파일이 적용되지 않는 문제 해결) (0) | 2023.07.05 |
[Tomcat,JSP]서버에 파일 데이터가 올라가는 원리 (0) | 2023.06.29 |
[JSP] QueryString으로 데이터 넘기는 법(feat. form태그 GET Method) (0) | 2023.06.21 |
[IntelliJ] IntelliJ에서 MySQL과 JDBC를 연동한 웹 프로젝트 생성하기 (0) | 2023.06.20 |