본문 바로가기
Java/JSP & Servlet

[JSP & Servlet] 4. JSP 액션 태그

by Rosmary 2022. 10. 23.
728x90
반응형

 

 

 

 

1. JSP 액션 태그 종류

 

JSP 파일 작성을 위해 HTML 태그와 유사한 형태를 가진 태그를 사용한다. 이 태그는 꺽쇠와(<>) 퍼센트 기호(%)를 기반으로 하며 추가 기호를 통해 각 태그의 기능을 구분한다. 태그 종류는 JSP 파일을 처리하기 위한 설정 정보를 지정하는 지시자(Directive), JSP 파일을 Servlet 파일로 변환했을 때 주 클래스에서 사용할 멤버 변수, 매서드 등을 작성하는 선언자(Declaration), Servlet 파일의 service() 매서드 코드 작성에 사용되는 스크립틀릿(Scriptlet), 마지막으로 변수나 매서드 결과를 출력하는 표현자(Expression)가 있다. JSP의 기본 태그의 사용 예시는 이 포스팅을 참조하자.

 

JSP 태그는 퍼센트 기호가 포함된 기본 태그 외에도 액션 태그라 불리는, "jsp:"라는 문자열이 포함된 태그가 존재한다. 이 액션 태그는 JSP 기본 태그를 대체할 수 있으며, 다른 JSP 파일 내용을 현재의 JSP 파일에 포함하거나, 결과를 다른 JSP 파일로 포워딩하는 등의 기능을 추가로 사용할 수 있다.

 

일반 태그의 4 가지 종류는 다음의 액션 태그로 변환할 수 있다. 

 

기본 태그 종류 기본 태그 포맷 액션 태그 포맷
지시자(Directive) <%@  ...   %> <jsp:directive> ... </jsp:directive>
선언자(Declaration) <%! ... !> <jsp:declaration> ... </jsp:declaration>
스크립틀렛(Scriptlet) <% ... %> <jsp:scriptlet> ... <jsp:scriptle>
표현자(Expression) <%= ... %> <jsp:expression> ... <jsp:scriptlet>

 

여기에 액션 태그를 활용하여 추가로 사용할 수 있는 기능은 아래와 같다.

 

태그명 기능 액션 태그 포맷
include 다른 jsp의 파일 내용(service() 매서드)을 현재의 JSP 파일에 추가할 때 사용

* include 지시자로 대체할 수 있음
<%@ include file="포함할 JSP 파일명" %>
<jsp:include page="포함할 JSP 파일명"/>

또는

<jsp:include page="포함할 JSP 파일명"/>
<jsp:param name="input태그이름" value="값">
</jsp:include>
forward 이동하려는 특정 URL 주소(JSP 파일)를 다른 주소(JSP 파일)로 전환하고자 할 때 사용. <jsp:forward page="포워딩 할 JSP 파일명"/>

또는

<jsp:forward page="포워딩 할 JSP 파일명"/>
<jsp:param name="input태그명" value="값"/>
</jsp:forward>
param include, forward 액션 태그 사용 시, 특정 입력값이 전달되어야 하는 경우 사용하는 액션 태그 <jsp:param name="input 태그명" value="전달할 값" />

** 추후 포스팅 할 Bean과 관련된 액션 태그도 존재하는데, 이는 나중에 소개하려한다.

 

 

필자가 나름대로 쉬운 단어로 설명을 달아 표를 만들어보긴 했는데, 아직까지는 무슨말인지 이해가 잘 되지 않는다. 백문이 불여일견이라고, 듣는것보다는 보는 것이 낫고, 보는 것보다는 직접 해보는 것이 나으니, 예시를 통해 include와 forward 액션 태그가 어떻게 동작하는지 알아보려한다. 

 

 

1. include 지시자와 include 액션 태그

 

JSP 파일을 두 개 만들어보려한다. 하나는 Hello JSP라는 문구가 출력되도록, 다른 하나는 Hello Servlet이 출력되도록 만들어보려한다. 

 

 

 

각각의 파일을 웹 브라우저에서 호출하면 잘 출력되는 것이 확인된다. 

 

 

 

필자는 helloServlet.jsp에 출력되는 문구를 helloJSP.jsp 파일 호출 시 출력되도록 만들고 싶다. 하지만 이러한 이유로 helloJSP.jsp에 <h1>Hello Servlet!</h1> 문구를 추가하려니, 중복되는 내용을 작성해야한다는 문제가 있다. 이렇게 다른 JSP 파일의 출력 내용을 불러와야 하는 상황이 발생한다면 include 지시자나 include 액션 태그를 사용하면 된다. 

 

- include 지시자 포맷     :  <%@ include file="포함할 파일경로" %>

- include 액션 태그 포맷:  <jsp:include page="포함할 파일 경로" />

 

지시자는 JSP 파일을 file이라는 이름의 속성로 받는것과 달리, 액션 태그는 JSP 파일을 page라는 이름의 속성으로 받는다는 차이가 있다. include 지시자와 액션 태그는 다른 파일이 포함될 파일의 <body> 태그 내에 작성하면 된다. 그리고 including에 연관되는 파일은 반드시 지시자에 info 속성이 단 하나의 파일에만 표시되어 있어야 한다. 그렇지 않다면 페이지 호출과정에서 에러가 발생한다. 필자는 helloJSP.jsp 파일에만 info 정보를 남겨놓았다.

 

좌: include 지시자 사용 코드, 우: include 액션태그 사용 코드

 

 

include 지시자와 액션 태그는 다른 JSP 파일의 내용을 포함시키는 기능은 동일하나, 결과가 도출되는 과정은 조금 다르다. include 지시자는 포함하고자 하는 파일의 html 태그 내의 부분을 포함될 파일에 포함시킨 뒤 Servlet 변환과 컴파일을 진행하나, include 액션 태그는 포함하고자 하는 파일을 Servlet 변환한 내용을 include라는 매서드를 사용하여 호출한다. include 지시자와 액션태그로 만들어진 helloJSP.jsp 파일의 servlet 변환 파일 내용을 살펴보자.

 

 

좌: include 지시자에 의해 변환된 servlet 파일, 우: include 액션 태그에 의해 변환된 servlet 파일

 

 

include 사용 시, 만약 입력값이 존재하는 JSP 페이지가 존재한다면 어떻게 해야할까? 다음과 같은 JSP를 만들어보자.

 

 

 

 

코드를 보면 알겠지만, 비밀번호로 1234가 입력되면 정상적인 로그인 결과가 나타나도록 만든 것이다. 그런데, 비밀번호를 검증하는 부분이 JSP 파일 안에 고스란히 표시되기 때문에 보안에 취약할 수 밖에 없다. 따라서 Scriptlet으로 작성된 코드만 별도의 Servlet 파일로 작성하고 컴파일 된 클래스 파일을 include 한다면 안전하게 계정 로그인 절차를 처리할 수 있다. 아직 Servlet에 대한 내용은 포스팅하지 않았기 때문에 JSP 파일로 위의 문제를 해결해보려한다. 파일명은 loginProcess.jsp로 지정한다.

 

 

 

 

사용자가 login.jsp 페이지에서 로그인을 위해 ID와 Password를 입력하고 Log-in 버튼을 클릭하면 <form> 태그에 의해 loginResult.jsp 파일이 호출된다. loginResult.jsp 파일의 body 첫 부분은 사용자가 입력한 ID, Password를 Scriptlet 변수로 전환하는데, 이는 include 액션 태그에서 호출되는 loginProcess.jsp 파일이 이들 입력값을 필요로하기 때문이다. 변수화 된 입력값은 include 태그 내 <jsp:param>태그를 통해 loginProcess.jsp로 전달되며, loginProcess.jsp는 내장객체인 request의 getParameter() 매서드를 통해 입력값을 받아들이게 된다. loginProcess.jsp가 비밀번호 검증을 완료하면, 코드에 작성된 내용만 loginResult.jsp 파일에 추가되게 된다. 결과로 나타난 브라우저 화면을 우클릭하고 "페이지 소스 보기(크롬)"을 클릭하거나 F12를 눌러 "Element" 탭에서 소스를 확인해보자. 

 

 

 

 

 

 

2. foward 액션 태그

 

이번에는 forward 액션 태그에 대해 알아보려한다. forward의 기능은 include의 기능과 유사한 듯 하면서 다르다. include된 JSP, Servlet 페이지의 내용을 표시하는 것은 include와 동일하지만, include는 기존 페이지의 내용까지 같이 표시해주는 반면, forward는 include된 파일의 내용만 표시한다는 차이점이 있다. forward 액션 태그는 아래의 포맷을 가진다.

 

- forward 액션 태그 포맷:   <jsp:forward page="포함할 파일 경로" />

 

방금 위에서 실행한 loginResult.jsp 파일의 include 액션태그를 forward로 변경해보자. 그러면 loginResult.jsp 파일에서 출력해야하는 접속 시간은 결과에 나타나지 않음을 알 수 있다.

 

 

 

위 결과 페이지가 뜬 웹 브라우저에서 F12를 누른 뒤 "Source" 탭을 누르면, 현재 페이지의 소스로 동작하는 파일이 표시된다.

 

 

 

분명 화면에 출력된 내용은 loginProcess.jsp 파일에 정의된 내용이나, loginResult.jsp 파일에 의해 결과가 출력된 것처럼 보인다. 하지만 loginResult.jsp 파일에서 출력해야하는 접속 시간은 출력되지 않는다. 즉, forward는 주소창에 의해 자신이 호출되더라도 forward 대상 파일의 결과만 출력하기 때문에 일종의 페이지 전환 기능을 한다고 보면 된다.

 

 


 

필자가 생각하기에는 include와 forward는 민감한 절차가 들어있는 프로세스로부터 화면 출력이 필요한 파일이 존재하는 경우 매우 유용할 것이라 판단한다. 직접적으로 절차가 기술된 파일의 이름이 외부로 드러나지 않고, html 태그에 의해 출력되는 결과만 include, forward 액션 태그에 의해 표시될 수 있기 때문이다. 물론 이것보다 더 좋은 방법이 있겠지만...

 

 

다음 포스팅에서는 JSP의 내장객체에 대한 내용을 알아보려한다. 이 부분은 Servlet 코드와도 연결되어 있는 부분이라 가능하다면 Servlet 기본 문법까지 다룰 수 있으면 다루려 한다.

 

 

Fin.

반응형

댓글