JSP 태그가 반복 실행됩니다.
조회수 542회
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP & 서블릿 연습</title>
</head>
<body>
<%!
int num = 1;
String str = "테스트 문자열";
List<String> arr = new ArrayList<>();
int addNums(int n1, int n2) {
return n1 + n2;
}
%>
// [1]
<%
System.out.println("안녕 JSP!");
for (int i = 0; i < 5; ++i) {
arr.add(str + " " + num);
++num;
}
for (String s : arr) {
System.out.println(s);
}
%>
<%
if (num >= 5) {
%>
<p>if문 동작</p>
<%
} else {
%>
<p>else문 동작</p>
<%
}
%>
num의 값은 <%=num%>입니다.<br/> // [2]
<p>addNum(2, 3)의 값은 <%=addNums(2, 3)%>입니다.</p>
</body>
</html>
위 jsp 파일을 실행하면 [2]에서 num의 최종 값은 6이 되어야 하는데, 11로 출력이 됩니다. 그리고 for문은 5번만 돌아야 하는데 "테스트 문자열"이 다음과 같이 10번만큼 추가 출력됩니다.
안녕 JSP!
테스트 문자열 1
테스트 문자열 2
테스트 문자열 3
테스트 문자열 4
테스트 문자열 5
안녕 JSP!
테스트 문자열 1
테스트 문자열 2
테스트 문자열 3
테스트 문자열 4
테스트 문자열 5
테스트 문자열 6
테스트 문자열 7
테스트 문자열 8
테스트 문자열 9
테스트 문자열 10
[1] 부분이 왜 이렇게 반복되는지 모르겠네요...도움 부탁드립니다.
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
WAS 기동 후 최초의 요청에선 작성자님이 의도한대로 나옵니다만, 페이지를 새로고침 할 때마다
num
의 값은 증가하며[1]
의 루프 횟수가 늘어날텐데요.문제는
num
과arr
을 JSP 선언부<%! %>
에서 선언했다는 점입니다.JSP 선언부에서 정의한 변수는 해당 JSP의 전역 변수가 됩니다. 매 요청마다 초기화되는 로컬 변수가 아니라, 상태를 유지하는 전역 변수를
arr.add(str + " " + num)
하고++num
했으니 결과가 이상할 수밖에요.
오지랖을 더 부려보면, JSP는 우선 Java로 바뀌고 class로 컴파일되는데요. 질문의 코드가 실제 Java로 어떻게 바뀌는지를 보면:
public final class hashcode9831_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { int num = 1; String str = "테스트 문자열"; List<String> arr = new ArrayList<>(); int addNums(int n1, int n2) { return n1 + n2; } private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); // 하략
이렇게 됩니다.
num
과arr
은hashcode9831_jsp
클래스의 인스턴스 변수인 것이죠.
댓글 입력