<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/request/join" method="post"></form>
</body>
</html>
form태그에서 action 속성에 지정할 경로로는 주로 절대경로로 작성해줘야 합니다.
절대경로는 ContextPath Root부터 기입합니다.
ContextPath + URL매핑주소(uri주소)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/web/request/join" method="post"></form>
</body>
</html>
하지만 ContextPath Root는 언제든지 바뀔 수 있습니다.
우리가 지금 contextPath Root를 /web이라고 해주는데 나중에 바뀌면 어떡하지?
그럼 그럴때마다 절대경로를 선언했던 곳을 전부 다 고쳐야합니다.
이때 우리는 변수를 사용해서 변수에 path경로를 담아주고 미리 변수로만 선언해준다면
path경로를 바꿔도 참조를 하기때문에 변수로 선언된 모든영역은 수정할 필요가 없게됩니다.
# 1
첫번째 방법으로는 EL 표현식 $()을 사용하여 불러오는 방법이 있습니다.
먼저 JSTL CoreTagLib를 사용하면 ${EL} EL문법으로 참조할 수 있는 변수를 지정할수 있어야 합니다.
태그라이브러리를 사용할수 있도록 taglib c:core 을 선언 주겠습니다.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL CoreTagLib 코드입니다. jsp파일 상단인 <!DOCTYPE html> 태그 위에 지정해줍니다.
지정된 JSTL 코어태그립을 활용하여 path라는 var속성의 변수를 지정해주고,
value속성으로 ContextPath Root를 넣어줍니다.
<c:set var="path" value="<%=request.getContextPath() %>" />
getContextPath()메서드는 현재 주소창의 컨텍스트패스 루트 경로를 추출합니다.
<c:set var="path" value="<%=request.getContextPath() %>" scope="application"/>
scope속성을 주고 application으로 지정해주면 현재 페이지 뿐만 아니라 모든 페이지에서 path변수를 사용할 수 있습니다. (단, $(EL) el문법을 사용해서만 가능합니다.)
<form action="${path}/request/join" method="post">
<form action="${path}/request/join" method="post">
<form> 태그의 action 속성에 지정한 경로중 컨텍스트 패스 경로인 "/web" 을 JSTL 코어 태그립을 활용하여 현재페이지의 컨텍스트 패스경로를 담아주도록 선언한 변수 path를 el표현식 문법을 사용하여 변경합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="<%=request.getContextPath() %>" scope="application"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${path}/request/join" method="post">
</form>
</body>
</html>
첫번째 방법의 완성된 JSP 코드입니다.
해당 코드를 정리해 보자면 먼저,
요청 정보를 통해서 우리의 컨텍스트패스의 경로를 읽어들어서 path변수에 저장합니다.
c:set var 태그를 사용한 변수 선언문 이며 EL변수로 사용하겠다는 뜻 입니다.
이 jsp파일 안에서는 path변수를 어떠한 영역에서든 사용할수있고, 만약 다른 곳에서도 쓰고싶다면 scope="application"로 지정하여, 변수의 path의 scope를 application범위로 늘린다면
모든 페이지에서 이 contextpath의 변수 path를 사용할수있습니다 라고 정의를 해 줍니다.
(단,EL로 사용할때 가능)
# 2
두번째방법 또한 JSTL의 코어태그립 c : 태그를 이용하는데요
사용될 코드는 다음과 같습니다.
<c:url value='/request/join'/>
c:url이라는 태그의 value속성에
이런 방법의 태그를 쓰면 contextpath경로를 제외하더라도 알아서 절대경로에 붙여줍니다.
그래서 이런 방법을 사용한다면 path경로를 따로 지정하지 않아도 되는것 입니다.
<form action="<c:url value='/request/join'/>" method="post">
<form action="<c:url value='/request/join'/>" method="post">
해당 태그를 <form>태그의 action속성 , ""안에 넣어줍니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<c:url value='/request/join'/>" method="post">
</form>
</body>
</html>
완성된 두번째 방식의 코드입니다.
<form action="join" method="post"></form>
이렇게 이런저런 실험을 했는데 결론은 그냥 contextPath경로와 공통uri 를 빼고 메서드의 uri주소만 적으면 정상적으로 찾아갑니다....
단, 이때에는 uri주소앞에 / 슬래시를 무조건 빼야합니다.
메서드에 등록된 매핑주소가 /join이면 join이라고 입력해야합니다
두시간동안 블로그 작성하다가 열이 받습니다...
무슨차이일까요? 내부적으로 알아서 찾아가주는건가..?
JSP 서블릿에서도 uri만 적으면 됬었는데......
아시는분들은 댓글바랍니다 ^^
'JSP&Servlet' 카테고리의 다른 글
IFrame을 사용하여 form의 action 요청 페이지 불러오기 (파라미터값 포함) (0) | 2020.10.05 |
---|---|
jsp:useBean / jsp:setProperty / jsp:getProperty jsp 유즈빈 액션태그 (0) | 2020.08.29 |