JSP&Servlet

폼태그의 요청 경로설정(절대경로) / JSTL 문법과 EL표현식을 활용한 ContextPath Root(절대경로) 참조법

유혁스쿨 2020. 8. 29. 02:07
728x90
반응형
<%@ 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만 적으면 됬었는데......

아시는분들은 댓글바랍니다 ^^

 

728x90
반응형