package kr.ac.kopo.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// http://localhost:9999/Lecture-WEB/servlet/table?row=3&col=3
/*
-------------------------------------
| (0, 0) | (0, 1) | (0, 2) |
-------------------------------------
| (1, 0) | (1, 1) | (1, 2) |
-------------------------------------
| (2, 0) | (2, 1) | (2, 2) |
-------------------------------------
*/
// http://localhost:9999/Lecture-WEB/servlet/table --> 5 X 5 테이블 응답
// http://localhost:9999/Lecture-WEB/servlet/tableExam --> 5 X 5 테이블 응답
// web.xml을 대체하는 기술이다. 이미 있는 매핑된 정보를 어노테이션에 쓰면 중복 에러가 난다.
@WebServlet(urlPatterns = {"/tableExam", "/table"})
public class TableServletExam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String strRow = request.getParameter("row");
String strCol = request.getParameter("col");
int row = 5, col = 5;
if(strRow != null && !strRow.equals(""))
row = Integer.parseInt(strRow);
if(strCol != null && !strCol.equals(""))
col = Integer.parseInt(strCol);
// 응답
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
StringBuilder sb = new StringBuilder();
sb.append("<html>");
sb.append("<head>");
sb.append(" <title>테이블 생성 연습</title>");
sb.append(" <style>");
sb.append(" table { ");
sb.append(" background-color : yellow; ");
sb.append(" } ");
sb.append(" </style>");
sb.append("</head>");
sb.append("<body>");
sb.append(" <table border='1'>");
for(int i = 0; i < row; i++) {
sb.append("<tr>");
for(int j = 0; j < col; j++) {
sb.append("<td>");
sb.append("(" + i + ", " + j + ")");
sb.append("</td>");
}
sb.append("</tr>");
}
sb.append(" </table>");
sb.append("</body>");
sb.append("</html>");
out.println(sb.toString());
out.flush();
out.close();
}
}
Serlvet으로 html 코드를 작성하는 것이 굉장히 불편했다.
StringBuilder 객체로 append 해서 코드들을 작성했다.
그리고 PrintWriter 객체로 println 해주고, flush 한 다음 close 해서 종료했다.
그러나, 이러한 방식으로는 에러난 부분을 눈으로 확인 하는 것이 굉장히 불편하다.
그래서 등장한 것이 JSP이다.
JSP 보이는 모습은 HTML 같지만, WAS 내부에서는 Servlet으로 해석된다.
<!doctype html>
<html>
</html>
HTML이 위의 형태로 시작하는 것처럼, JSP 시작은 아래와 같이 시작한다.
<%@page>
<html>
</html>
주석에도 차이가 있다.
클라이언트에 보낼 때, JSP 주석은 안보낸다.
하지만, Content 주석은 보낸다. 그러나 주석처리되어 있기 때문에 브라우저에서 나타나지 않을 뿐이다.
일반적으로 주석은 클라이언트에게 보낼 필요가 없으므로 JSP 주석을 더 많이 사용한다.
<%-- --%> : JSP 주석
<!-- --> : Content 주석
<%@ 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>
<%--
JSP 주석 : 서블릿으로 변환되지 않기 때문에 화면에 전송되지 않음.
--%>
<!--
컨텐트 주석 : 서블릿으로 변환되어 브라우저에 전송 되지만, 웹브라우저에서 해석하지 않아 화면에 보이지 않음.
-->
주석이 화면에 보입니까?
</body>
</html>
.jsp 를 요청하면 WAS 서버는 servlet 으로 변환시켜서 out.println 으로 response 한다.
맨처음 접속할 때는 .jsp를 servlet 코드로 변환시켜주기 때문에 느리다. 두 번째 부터는 빠르다.
최초 jsp 파일을 실행한 뒤,
JSP 엔진이 Servlet 파일로 변환한 모습이다.
참조
1. A: 개발자가 web-workspace 밑에 jsp 파일을 만든다.
2. B: 이클립스가 자동으로 해당 파일(web-workspace 밑의 jsp 파일)을, 톰캣 파일의 deploy path에 복사해준다. (? ㅠㅠ)
3. C: JSP 엔진이 work > 카탈리나 밑에 있는 jsp 파일을 찾아서 servlet 으로 변환시킨다. (? ㅠㅠ)
JSP 내에 JAVA 코드를 입력할 수 있다.
또한, 아래의 for 반복문 내에 out이라는 객체를 사용하고 있는데,
우리가 선언한 적이 없음에도 실행이 된다.
왜냐하면 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>
<h1>1~ 10 사이의 정수 출력</h1>
<%
for (int i = 1; i <= 10; i++){
out.println(i + "<br>");
}
%>
</body>
</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>
<h1>1~10 사이의 정수 출력</h1>
<%-- <%
for(int i = 1; i <= 10; i++){
out.write(i + "<br>");
}
%> --%>
<%
int sum = 0;
for(int i = 1; i <= 10; i++){
sum += i;
%>
<%= i%><br>
<%
}
%>
<%-- <%= "1~10 사이의 총합 :" sum %><br> --%>
1~10 사이의 총합 : <%=sum %><br>
</body>
</html>
<%@page import="java.util.Random"%>
<%@ 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>
<h1>1 ~ 10 사이의 임의의 정수 출력</h1>
<%
//java.util.Random r = new java.util.Random();
Random r = new Random();
int random = r.nextInt(10) + 1;
%>
추출된 정수 : <%= random %> <!-- 표현식 내에는 수식 혹은 변수만 써야한다. 예를 들어 3 * 6 또는 sumVar 등등-->
</body>
</html>
'웹 프로그래밍 > JSP' 카테고리의 다른 글
[JSP] include(지시자와 액션태그) + jstl import (0) | 2020.07.21 |
---|---|
[JSP] 절대 경로 주의 (include, forward, .xml) (0) | 2020.07.20 |
[JSTL] c:import VS jsp:include (0) | 2020.07.20 |
[EL] 자바빈즈, 맵을 활용한 EL (0) | 2020.07.15 |
[JSP] JSP 객체, EL 객체를 사용할 수 있는 이유 (0) | 2020.07.14 |