Java EE 정리 09
08 Mar 2019
Reading time ~3 minutes
Java EE 정리 09 - JSP, JSP Tags
JSP(Java Server Page)
- Servlet의 단점을 개선한 Servet Side Script(SSS)
- JSP, ASP, php는 Server Side Script언어들
- JSP - Java 기반
- ASP - Visual Basic 기반
- php - C 기반
- Servlet을 사용하면 개발자와 디자이너간의 업무구분이 안되지만 JSP를 사용하면 디자이너와 개발자간의 업무구분이 어느정도 가능해진다.
- JSP, ASP, php는 Server Side Script언어들
- Java EE에 제공하는 Servlet의 개선판
- Java SE에서 제공하는 기능(클래스, 인터페이스)을 사용할 수 있다.
- 느리다(안정적 - Thread 지원)
- 컴파일을 개발자가 하지 않는다.(편하다)
- Servlet에서 제공하는 요청처리객체, 응답처리객체, 관계유지객체를 그대로 사용
- HttpServletRequest
- 접속자의 입력값을 받기
- 접속자의 정보(Cookie, Session 등) 받기
- 페이지 이동(RequestDispatcher)
- HttpServletResponse
- 응답방식 설정
- 출력 스트림을 가짐
- 페이지 이동
- Cookie, HttpSession
- 관계 유지
- HttpServletRequest
- JSP는 HTML Tag 사이에 JSP tag들을 넣어서 정의하고 사용
JSP Tags
- 사용할 Java 코드를 정의하는 Tag
- 구조
- 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파일이 저장되는 위치
- 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>
...
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 %>>
<%}%>
// 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>
- scriptlet 사용 예 3
<!-- 1~100까지 합만 출력하는 scriptlet -->
<%! int sum = 0; %>
<% for(int k=1;k<101;k++) {
sum += k;
}
%>
<h1>1~100 합 : <%=sum %></h1>
- 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>
- 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"/>