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]의 루프 횟수가 늘어날텐데요.

    문제는 numarr을 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();
    
      // 하략
    

    이렇게 됩니다. numarrhashcode9831_jsp 클래스의 인스턴스 변수인 것이죠.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)