---
title: "Java EE 정리 09"
date: "2019-03-08"
tags: ["Java EE","JSP"]
status: archived
verified: false
---

---

## JSP(Java Server Page)

![01](/md/legacy-assets/javaEe/09/01.webp)

![02](/md/legacy-assets/javaEe/09/02.webp)

![03](/md/legacy-assets/javaEe/09/03.webp)


* **Servlet의 단점을 개선한 Servet Side Script(SSS)**
  * **JSP, ASP, php는 Server Side Script언어들**
       * JSP - Java 기반
       * ASP - Visual Basic 기반
       * php - C 기반
  * Servlet을 사용하면 개발자와 디자이너간의 업무구분이 안되지만 **JSP를 사용하면 디자이너와 개발자간의 업무구분이 어느정도 가능해진다.**
* Java EE에 제공하는 **Servlet의 개선판**
* Java SE에서 제공하는 기능(클래스, 인터페이스)을 사용할 수 있다.
* **느리다(안정적 - Thread 지원)**
* **컴파일을 개발자가 하지 않는다.(편하다)**
* **Servlet에서 제공하는 요청처리객체, 응답처리객체, 관계유지객체를 그대로 사용**
     * **HttpServletRequest**
          * 접속자의 입력값을 받기
          * 접속자의 정보(Cookie, Session 등) 받기
          * 페이지 이동(RequestDispatcher)
     * **HttpServletResponse**
          * 응답방식 설정
          * 출력 스트림을 가짐
          * 페이지 이동
     * **Cookie, HttpSession**
          * 관계 유지 
* **JSP는 HTML Tag 사이에 JSP tag들을 넣어서 정의하고 사용**

## JSP Tags

* **사용할 Java 코드를 정의하는 Tag**

![04](/md/legacy-assets/javaEe/09/04.webp)

* **구조**
  * JSP파일은 컴파일 하지 않는다.

```html
<%@ page ... %>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

    <%!   %>

    <%  /* JSP 파일 */  %>
        
    <%=   %>

</body>
</html>
```

```java
// JSP에서 변환된 java 파일
class ??? extends HttpJspBase { // HttpJspBase의 부모가 HttpServlet 

    public void _jspInit() {

    }

    public void _jspService(HttpServletRequest request, HttpServletResponse response) {

    }

    public void _jspDestroy() {

    }
}
```

* **java파일이 compile되어 class파일이 되고 instance가 HTML로 변환, 응답한다.**
* **Tomcat내에서 변환된 변환된 java파일이 저장되는 위치**

![06](/md/legacy-assets/javaEe/09/06.webp)

* **JSP 사용 예**

```html
<%@ 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>

<%
      String name="코잘잘 이재찬";
%>
안녕 JSP<br/>
내 이름은 <strong><%=name %></strong>입니다.<br/>
스릉흔드 JSP!!!

</body>
</html>
```

![05](/md/legacy-assets/javaEe/09/05.webp)


```java
...
public final class HelloJsp_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
  ...
  public void _jspInit() {
  }
  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) /* 요청,응답 처리 객체들 */
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    /* 내장 객체들 */
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

    ...
    try { // Servlet처럼 HTML로 출력
      response.setContentType("text/html; charset=UTF-8");
      ...

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      ...
      out.write("<body>\r\n");

    String name="코잘잘 이재찬";

      out.write("\r\n");
      out.write("\r\n");
      out.write("안녕 JSP<br/>\r\n");
      out.write("내 이름은 <strong>");
      out.print(name );
      out.write("</strong>입니다.<br/>\r\n");
      out.write("스릉흔드 JSP!!!\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      ...
```

* **JSP는 java로 변환되어 처리되기 때문에 에러가 발생한다면 에러난 위치를 잘 확인하고 JSP파일과 java파일 모두 확인해야 한다.**
* **아래 코드는 제대로 동작할까?**
  * **scriptlet, expression JSP Tag내용들은  내 코드는 _jspService()로 다 합쳐지기 때문에 잘 동작한다.**

```html
<body>
    <% int i = 0; %>
    ...
    <% i = 8; %>
    ...
    <%= i %>
</body>
```

```java
// 변환되면 한 메소드안에 java코드들이 들어간 셈
... _jspService(...) {
    int i = 0;
    ...
    i = 8;
    ...
    out.println(i);
}
```

* **scriptlet 사용 예 1**

```html
<% for(int j=1; j<7; j++) { %><!-- scriptlet은 한줄로도 많이 쓴다. -->
            <h<%=j %>>오늘은 불금입니다.</h<%=j %>>
<%}%>
```

![07](/md/legacy-assets/javaEe/09/07.webp)

```java
// scriptlet_jsp.java
out.write('\n');
out.write('    ');
for(int j=1; j<7; j++) {
    out.write("<!-- scriptlet은 한줄로도 많이 쓴다. --> \r\n");
    out.write("\t\t\t<h");
    out.print(j ); // 표현식을 쓴건 print method로 들어갔다
    out.write(">오늘은 불금입니다.</h");
    out.print(j ); // 표현식
    out.write(">\r\n");
    out.write("\t");
}
out.write("\r\n");
out.write("\t\r\n");
```

* **scriptlet 사용 예 2**

```html
<%
      String[] names = { "노진경", "김정윤", "박영민", "김희철",  "박소영", "이지수" };
%>
<table border='1'>
      <tr>
            <th width="100">이름</th>
      </tr>
      <%for(int j=0; j<names.length; j++){ %>
      <tr>
            <td><%=names[j] %></td>
      </tr>
      <%} %>
</table>
```

![08](/md/legacy-assets/javaEe/09/08.webp)

* **scriptlet 사용 예 3**

```html
<!-- 1~100까지 합만 출력하는 scriptlet -->
<%! int sum = 0; %>
<% for(int k=1;k<101;k++) {
      sum += k;
   }
%>
<h1>1~100 합 : <%=sum %></h1>
```

![09](/md/legacy-assets/javaEe/09/09.webp)

* **scriptlet 사용 예 4**

```html
<table border="1">
<% for(int j=1; j<10; j++) { %>
      <tr>
            <% for(int k=2; k<10; k++) { %>
            <td width="40" align="center"  onclick="alert('<%=k*j%>')"><%=k %>x<%=j %>=<%=j*k %></td>
            <%} %>
      </tr>
<%} %>
</table>
```

![10](/md/legacy-assets/javaEe/09/10.webp)

* **scriptlet 사용 예 5**
  * **서버의 시간과 접속자의 시간은 항상 같지 않다!**
     * **서버의 시간을 사용하도록 코드를 작성해야 한다.**

```javascript
$(document).ready(function() {
      var d = new Date(); // 클라이언트 시간
      var time = "";
      
      time += d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+"  "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
      
      $("#clientTime").text(time);
      
      $("#btnDate").click(function() {
            $("#serverTime").fadeOut(3000);
      });
});
```

```html
<!-- 년-월-일요일 시:분을 서버의 시간으로 얻어와서
      흘러가는 문자열로 보여주세요.
      버튼을 클릭하면 일자가 3초동안 서서히 사라지도록 만들 것
-->
<%
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  HH:MM:ss");
      String date = sdf.format(new Date()); // 서버 시간
%>
<div>
      서버 시간 : <span id="serverTime"><%=date%></span><br/>
      접속자 시간 : <span id="clientTime"></span>
</div>
<input type="button" value="클릭" id="btnDate"/>
```

![11](/md/legacy-assets/javaEe/09/11.webp)
