• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

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

Java EE 정리 09

08 Mar 2019

Reading time ~3 minutes

Java EE 정리 09 - JSP, JSP Tags


JSP(Java Server Page)

01

02

03

  • 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

  • 구조
    • JSP파일은 컴파일 하지 않는다.
<%@ page ... %>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

    <%!   %>

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

</body>
</html>
// 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

  • JSP 사용 예
<%@ 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

...
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()로 다 합쳐지기 때문에 잘 동작한다.
<body>
    <% int i = 0; %>
    ...
    <% i = 8; %>
    ...
    <%= i %>
</body>
// 변환되면 한 메소드안에 java코드들이 들어간 셈
... _jspService(...) {
    int i = 0;
    ...
    i = 8;
    ...
    out.println(i);
}
  • scriptlet 사용 예 1
<% for(int j=1; j<7; j++) { %><!-- scriptlet은 한줄로도 많이 쓴다. -->
            <h<%=j %>>오늘은 불금입니다.</h<%=j %>>
<%}%>

07

// 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
<%
      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

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

09

  • scriptlet 사용 예 4
<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

  • scriptlet 사용 예 5
    • 서버의 시간과 접속자의 시간은 항상 같지 않다!
      • 서버의 시간을 사용하도록 코드를 작성해야 한다.
$(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);
      });
});
<!-- 년-월-일요일 시:분을 서버의 시간으로 얻어와서
      흘러가는 문자열로 보여주세요.
      버튼을 클릭하면 일자가 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



Java EEJSP