• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Java EE 정리 10

11 Mar 2019

Reading time ~6 minutes

Java EE 정리 10 - JSP Tags(2), JSP 요청방법, 내장객체


JSP Tags - Expression(표현식)

<%= 값 %>
  • Web Browser에 출력할 때 사용
  • 값을 하나만 출력할 수 있다.
  • 값에는 ‘;’을 붙일 수 없다. * 표현식은 out.println( 값 ); 으로 변경되어 들어감.* * 때문에 println메소드의 매개변수는 1개만 입력 가능하고 ‘;’이 들어가지 않는다.
  • expression 사용 예
<%
      // scriptlet
      String name = "김정윤";
      String addr = "서울시 강남구 역삼동";
%>
<ul>
      <li>이름 : <%=name %></li>
      <li>주소 : <%=addr %></li>
</ul>

01

JSP Tags - Declaration (선언)

<%! ...  %>
  • 정의되는 코드는 class field에 생성된다.
    • 때문에 선언 내에서는 내장객체를 사용할 수 없다.
<!-- jsp -->
<%! // declaration
    int i;
    public void test() {
        ...
    }
%>
// java로 변환된 jsp
public Test extedns HttpJSPBase {

    int i;
    public void test() {
        ...
    }

    public void _jspService(HttpServletRequest req, HttpServletResponse res) {
        // 선언 내에서는 내장 객체를 사용할 수 없음
        ...
    }
}
  • declaration 사용 예
<%! // declaration
      int i; // instance 변수, 자동 초기화된다.
%>
i=<%= i %>

02

<% // scriptlet
      int i; // 지역 변수
%>
i=<%= i %>

03

<%! // declaration
      public String test() {
            return "공선의";
      }
%>

이름 : <%=test() %>

04

<%
      //int i; // instance 변수
      
      /* public String test() {
            return "공선의";
      } */
%>

05

<%-- JSP 주석 <%
      //int i; // instance 변수
      
      /* public String test() {
            return "공선의";
      } */
%> --%>

06

07

  • scriptlet, expression 사용 예
<%
      String[] names = { "공선의","김건하","이재찬","정택성","김희철" };
%>    
<table>
      <tr>
            <th id="nameTitle">이름</th>
            <th id="scoreTitle">점수</th>
      </tr>
      <% for(int i=0; i<names.length; i++) { %>
      <tr>
            <td><%=names[i] %></td>
            <td>
                  <% for(int j=0; j<11; j++) { %>
                  <input type="radio" name="score_<%=i %>"  value="<%=j %>"/><%=j %>점
                  <%} %>
            </td>
      </tr>
      <%} %>
</table>

08

  • 위 예제에서 라디오버튼을 만드는 걸 method로 처리
<%! // declaration
/**
      라디오버튼을 생성하는 method
      createRadio(라디오버튼개수, 라디오버튼이름, 기본체크값)
*/
      public String createRadio(int rCnt, String rName, int rDefault) {  
            StringBuilder radio = new StringBuilder();

            if(rCnt < rDefault) { // 선택할 버튼 수보다 기본체크값이 크면 0으로 설정
                  rDefault = 0;
            }
            
            for(int i=0; i<=rCnt; i++) {
                  radio.append("<input type='radio'  name='").append(rName)
                  .append("' value='").append(i).append("'");
                  
                  if (i == rDefault) {
                        radio.append(" checked='checked'");
                  }
                  
                  radio.append(">").append(i).append("점&nbsp;");
            }
            
            return radio.toString();
      }
%>    
...
<% // scriptlet
      String[] names = { "공선의","김건하","이재찬","정택성","김희철" };
%>    
<table>
      <tr>
            <th id="nameTitle">이름</th>
            <th id="scoreTitle">점수</th>
      </tr>
      <% for(int i=0; i<names.length; i++) { %>
      <tr>
            <td><%=names[i] %></td>
            <td>
                  <%= createRadio(11, "name_"+i, 5) %>
            </td>
      </tr>
      <%} %>
</table>

09

JSP Tags - Comment (주석)

  • JSP Tag의 실행을 막을 때 사용
  • 감싸고 있는 JSP 태그의 코드 생성을 막는 일을 함.
<%-- ... --%>

JSP Tags - Page Directive (페이지 지시자)

  • 일반적으로 JSP 파일 첫 줄에 기술 * 지시자의 위치는 상관 없음
  • 속성은 설정하지 않으면 기본값을 갖는다. * 속성명은 대소문자 구분
<%@ page 속성="값" %> <%@ page 속성="값" %> ... 
<!-- 한 속성을 갖는 여러 지시자 정의 또는 한 지시자 안에 여러 속성 정의-->
<%@ page 속성="값" 속성명="값" ... %>

10

  • 페이지 지시자 사용 예
<!--  지시자 하나에 여러 속성을 사용하는 경우 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" info="Page Directive 연습"%>
<!--  지시자 하나 당 한 속성을 사용하는 경우 -->
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat,java.util.Calendar" %>
...
<strong>EL(Expression Language)</strong>
<br/>
3+11 = ${ 3+11 }<br/>

11

web parameter : <%=request.getParameter("name") %><br/>
web parameter(EL) : ${param.name}<br/>
<a href="page_directive.jsp?name=heechul">요청</a>

12

<!-- isELIgnored 속성을 true로 하면 EL이 무시된다. -->
<%@ page isELIgnored="true" %>

13

  • 페이지 지시자 errorPage, isErrorPage 속성 사용 예
<!-- page_directive.jsp -->
<!-- 에러가 발생 시 이동할 페이지를 설정할 수 있다. -->
<!-- 에러 발생 시 페이지 이동은 foward, URL은 바뀌지 않는다. -->
<%@ page errorPage="page_directive1.jsp" %>
...
<%
    if(new Random().nextBoolean()) {
        throw new Exception("예외 강제 발생");
    }
%>
<!-- page_directive1.jsp -->
<!-- 예외를 처리할 페이지 -->
<!--  isErrorPage가 false라면 이전페이지에서 발생한 예외(exception)를 받을 수 없다.  -->
<%@ page isErrorPage="true" %>
...
에러의 이유 : <%=exception %>
<div>
문제발생 : 요청하신 페이지에서 문제가 발생했습니다.
</div>

14

  • 페이지 지시자 session 속성 사용 예
<%@ page session="true" %>
<!-- 페이지 지시자 session속성에 따라 session을 사용여부를 설정 -->
<%
    session.setAttribute("name", "정택성"); // false면 에러발생
%>

15

JSP Tags - Include Directive (인크루드 지시자)

  • 브라우저에서 여러개의 JSP를 동시에 보여줘야 할 때
<!-- include directive와 동일한 include일을 하는 태그들(동작은 다름) -->
<jsp:include>, <c:import> 
<!-- include directive> -->
<%@ include file="끼워넣을 jsp의 URI" %>
  • JSP가 하나의 소스코드로 생성된다.
  • 다른 include보다 속도가 빠르다.
  • 변수나 메소드가 공유된다. * 페이지 지시자의 충돌이 발생가능 * contentType, pageEncoding, … 등 설정한 값이 다르다면 에러 발생 * 모든 JSP가 같은 값을 가져야 한다.
  • 많은 JSP에서 공통 소스코드를 병합할 때 사용 * 세션에 대한 체크 등

16

<!-- include_a.jsp, 외부 JSP -->
<div>
      외부 JSP
      <div>
            <%@ include file="include_b.jsp" %>
      </div>
      외부 JSP
</div>
<!-- include_b.jsp, 내부 JSP -->
<body>
      <strong>끼워지는 JSP</strong>
</body>

17

<!-- include_b.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 끼워지는 JSP에서는 코드가 들어가는 태그의 자식 태그로 들어가기 때문에
      <html>은 가지지 않고 포함되는 태그로만 구성한다. -->
<strong>끼워지는 JSP</strong>

18

  • 외부 JSP에서 제공하는 변수는 외부 JSP에 존재할 수도 있고 존재하지 않을 수도 있다. * 따라서 내부 JSP에서 외부 JSP의 변수를 사용하는 코드는 에러를 유발하는 원인이 될 수도 있다. * 가급적이면 내부 JSP에선 외부 JSP의 변수를 사용하지 않는다.
<!-- include_a.jsp -->
<div>
      외부 JSP
      <%
            String name = "김정윤";
      %>
      <div>
            <%@ include file="include_b.jsp" %>
      </div>
      외부 JSP
      <br/>
      <!--  외부 JSP에서 끼워지는 JSP의 변수는 에러없이 사용할 수 있다.  -->
      나이 : <%=age %>, 주소 : <%=addr %>
</div>
<!-- include_b.jsp -->
<%
      // 끼워지는 모든 JSP에서의 공통코드를 정의
      int age = 30;
      String addr = "서울시 강남구 역삼동";
%>
<div>
      <strong>끼워지는 JSP</strong>
      나이 : <%=age %><br/>
      주소 : <%=addr %><br/>
      <strong>외부 JSP 변수 : <%=name %></strong>
</div>

19

  • 페이지 지시자 충돌 예
    • 한글자라도 다르면 충돌발생
    • 똑같이 사용해줘야 한다.
<!-- include_a.jsp -->
<%@ page ... info="include 연습"%>
...
<!-- include_b.jsp -->
<%@ page ... info="include 연습 "%><!-- 공백 하나 차이로 에러가 발생 -->
...

20

JSP 요청처리

  • JSP는 요청이 GET방식이든 POST방식이든 모두 가능하다. * 어떤 방식의 요청이든 _jspService가 처리한다.
<!-- call_jsp.jsp -->
<script  src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
      $(function() {
            $("#btnGet").click(function() {
                  $("[method='get']").submit();
            });
            $("#btnPost").click(function() {
                  $("[method='post']").submit();
            });
            $("#btnLoc1").click(function() {
                  location.href="call.jsp";
            });   
            $("#btnLoc2").click(function() {
                  location.replace("call.jsp");
            });   
      });
</script>
...
<div id="container">
<div>
      <strong>GET방식으로 JSP 요청</strong>
      <ul>
            <li><a href="call.jsp">GET 요청</a></li>
            <li>
                  <form action="call.jsp" method="get">
                        <input type="button" value="GET방식 요청"  class="btn" id="btnGet">
                  </form>
            </li>
            <li><input type="button" value="location.href사용 요청"  class="btn" id="btnLoc1"/></li>
            <li><input type="button" value="location.replace사용 요청"  class="btn" id="btnLoc2"/></li>
      </ul>
</div>
<div>
      <strong>POST방식으로 JSP 요청</strong>
      <ul>
            <li>
                  <form action="call.jsp" method="post">
                        <input type="button" value="POST방식 요청"  class="btn" id="btnPost">
                  </form>
            </li>
      </ul>
</div>
</div>
<!-- call.jsp -->
<style type="text/css">
      <% if("GET".equals(request.getMethod())) { %>
      #method { font-weight: bold; font-size:14px; color:#00FFFF; }
      <% } else { %>
      #method { font-weight: bold; font-size:16px; color:#FF00FF; }
      <% } %>
</style>
...
<div id="container">
<ul>
      <li><strong>요청방식</strong> :<span id="method"><%=request.getMethod() %></span></li>
      <li><strong>접속자의 IP Address</strong> :  <%=request.getRemoteAddr() %></li>
      <li><a href="javascript:history.back();">뒤로</a></li>
</ul>
</div>

21

내장(내재) 객체

  • _jspService method안에 선언된 객체들
  • scope 객체(pageContext, request, session, application)
    • JSP에서 발생한 값을 저장하고 사용하는 객체
    • 객체마다 사용범위가 달라진다.

22

  • 내장객체 request 사용 예
<div id="container">
      <ul>
            <li><strong>접속 URL</strong> : <%=request.getRequestURL()  %></li>
            <li><strong>요청 Protocol</strong> :  <%=request.getProtocol() %></li>
            <li><strong>요청 서버명</strong> :  <%=request.getServerName() %></li>
            <li><strong>요청 서버명</strong> :  <%=request.getServerPort() %></li>
            <li><strong>요청 URI</strong> : <%=request.getRequestURI()  %></li>
            <li><strong>요청 Servlet Path</strong> :  <%=request.getServletPath() %></li>
            <li><strong>요청 Context Path</strong> :  <%=request.getContextPath() %></li>
            <li><a  href="request.jsp?name=jinkyung&addr=강서구&age=30">JSP QueryString  요청</a></li>
            <li><strong>요청 Query String</strong> :  <%=request.getQueryString() %></li>
            <li><strong>요청 Parameter</strong> :  <%=request.getParameter("name") %></li>
            <li><strong>요청 방식</strong> : <%=request.getMethod()  %></li>
            <li><strong>접속자 IP Address</strong> :  <%=request.getRemoteAddr() %></li>
            <li><strong>접속자 PORT</strong> :  <%=request.getRemotePort() %></li>
      </ul>
</div>

23



Java EEJSP