
JSP는 "JAVA Server Pages"의 각 첫 자로 만들어진 용어이며 사전적인 의미로 해석하면 자바로 작성한 서버 페이지로 해설될 수 있습니다.
https://hyojin96.tistory.com/entry/HTTP-%ED%86%B5%EC%8B%A0



respond body에 담겨서 전송됨
% 모듈러
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ 디렉티브: JSP페이지에 대한 설정정보를 지정할 때 사용
%@ page 페이지 디렉티브(설정을 담음)
<% 스크립트릿
<%= 표현식
page
taglib
include
표현식 <%= ~ %> : 값을 출력(응답내용으로 출력, 콘솔 출력 X)
스크립트릿 <% ~ %>: 자바코드를 실행(자바문법 그대로 사용)
선언부: 자바 메서드(함수)를 만듬(자바문법 그대로 사용)
정적인 데이터
자바스크립트, CSS, HTML
MIME(마임)
메일의 첨부파일을 의미 text/html 브라우저한테 지금 보내는 응답이 무엇인지 알려주는것! (html형식을 가지고 있을거야 그렇게 읽으면 돼!)
image/jpg 이건 이미진데 jpg로 구성된 이미지야~~~!
ISO-8859-1 영어와 서유럽어의 문자만 포함, 한글은 표현 불가
EUC-KR 한국어를 포함하는 캐릭터 셋 (charset)
UTF-8은 전 세계언어를 다 나타냄
EUC-KR보다 UTF-8이 전송하는 데이터가 커짐
목적성이 없이 UTF-8을 쓰지말자!!
EUC-KR이면 한글 전송 할때는 2byte면 되는데 UTF-8는 크기가 큼
📌될 수 있으면 주고 받는 데이터가 작아야 한다~
네트워크는 항상 지연이 생기기 때문!!!!!!!!!!!!!!!!!
p.58
charset=iso-8859-1은 영문자만 나타냄
저걸 실행을 하게 되면 글자가 깨짐
자바랑 똑같음 / page 디렉티브에 쓰면 됨



<%@ page contentType ="text/html; charset=utf-8" %>
<%@ page import = "java.util.Calendar" %>
<html>
<head></head><title>Calendar 클래스 사용</title></head>
<body>
<%
Calendar cal = Calendar.getInstance();
%>
오늘은
<%= cal.get(Calendar.YEAR)%>년
<%= cal.get(Calendar.MONTH)+1%>월
<%= cal.get(Calendar.DATE) %>일
입니다
</body>
</html>
월에 +1 되어있는 이유가 0월로 시작하기 때문에 꼭 더해줘야 함!!
html에는 엔터가 먹히지 않음<br>을 사용해야 함!!
default값은 false
true면 공백이 생김
trim 자바에서 여백없애는 메서드였음
응답으로 날아가면 빈줄이 생김
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head><title>합 구하기</title></head>
<body>
<%
int sum = 0;
for(int i=1; i<=10; i++){
sum = sum + i;
}
%>
1부터 10까지의 합은 <%= sum %> 입니다.
<br>
<%
int sum2 = 0;
for(int i = 11; i<=20; i++){
sum2 = sum2+i;
}
%>
11부터 20까지의 합은 <%= sum2 %> 입니다.
</body>
</html>

서버측에서 연산이 되고 클라이언트에게 값만 전달됨!
<%@ page contentType ="text/html; charset=utf-8" %>
<%@ page import = "java.util.Calendar" %>
<html>
<head></head><title>Calendar 클래스 사용</title></head>
<body>
<%
for(int i=0; i<10; i++) {
%>
hi<br>
<%
}
int num = 3;
if(num<3){
%>
3보다 적다
<%
}else{
%>
3보다 크거나 같다
<%
}
%>
</body>
</html>
이거면 이거 보여주고는 하지만 (if문, for문) 실제로 안에서 로직을 표현하진 않음
<%@ page contentType ="text/html; charset=utf-8" %>
<%@ page import = "java.util.Calendar" %>
<html>
<head></head><title>Calendar 클래스 사용</title></head>
<body>
<%
for(int i=0; i<10; i++) {
%>
hi<br>
<%
}
int num = 3;
if(num<3){
%>
3보다 적다
<%
}else{
%>
3보다 크거나 같다
<%
}
%>
<table border = "1">
<tr>
<td>이름1</td>
<td>이름2</td>
<td>이름3</td>
</tr>
<%
for(int i=0; i<10; i++) {
%>
<tr>
<td><%= i + 1 %>행 1열 내용</td>
<td><%= i + 1 %>행 2열 내용</td>
<td><%= i + 1 %>행 3열 내용</td>
</tr>
<%
}
%>
</table>
</body>
</html>

표현식안에 객체가 있으면 객체는 toString 리턴값으로 바껴서 나옴
표현식은 목적자체가 출력!
<%!: 멤버변수나 메서드를 선언할 때 사용
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%!
// 주석
public String greeting(){
return "hi~ everyone!!";
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>useMethod</title>
</head>
<body>
// 지역변수라고 생각
<%= some %>
<%
String result = greeting();
%>
<%= result %>
</body>
</html>
// 멤버변수라고 생각
<%!
String some = "아~~~옛날이여~~~";
%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%!
public int add(int a, int b) {
int c = a + b;
return c;
}
public int subtract(int a, int b) {
int c = a - b;
return c;
}
%>
<html>
<head>
<head><title>스크립트릿에서 선언부 사용하기</title></head>
<body>
<%
int value1 = 3;
int value2 = 9;
int addResult = add(value1, value2);
int subtractResult = subtract(value1, value2);
%>
<%= value1 %> + <%= value2 %> = <%= addResult %>
<br>
<%= value1 %> - <%= value2 %> = <%= subtractResult %>
</body>
</html>

get메서드를 이용해서 클라이언트 정보를 뽑아낼 수 있음
getRemoteAddr()클라이언트 ip 찾아낼 수 있는 메서드
getMethod()클라이언트가 나한테 정보를 어떻게 보냈는지 get/post
getContextPath()현재 어플리케이션의 루트, 디스크상의 위치
요청은 사용자
프로그램이 동작하는 근본적인 이유는 무엇일까?
resquest는 이벤트리스너와 비슷함
훼손하면 안되기때문에 set이 없음
고객이 해달라는대로 해야지 자기맘대로 해선 안됨!
바꿀 수 없게 해놔서 꺼내서 쓰는 것밖에 할 수 없음
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head><title>폼 생성</title></head>
<body>
<form action="viewParameter.jsp" method="post">
이름: <input type = "text" name = "name" size = "10"> <br>
주소: <input type = "text" name = "address" size = "30"> <br>
좋아하는 동물:
<input type = "checkbox" name = "pet" value = "dog"> 강아지
<input type = "checkbox" name = "pet" value = "cat"> 고양이
<input type = "checkbox" name = "pet" value = "pig"> 돼지
<br>
<input type = "submit" value = "전송">
</form>
</body>
</html>


action은 전송방식
상대경로
전달되는 값은 같으나 url이 다름
파라미터가 요청라인(행)에 url에 포함되서 날아가는게 get
사용자 눈에 보이는 방식이 get
get방식은 읽기라고 생각
http://localhost:8080/04_18/viewParameter.jsp
파라미터는 사용자가 입력한 값
우리 눈에 보이지 않고 바디에 붙어서 날아가는 방식이 post
ViewParameter.jsp로 값을 보낼 때
둘 다 파라미터가 전달되는데 볼 수 있고 없고의 차이
get과 post를 나누는 기준을
멱등관계가 성립하는지의 차이
멱등: 연산을 여러 번 적용하더라도 결괏값이 달라지지 않는 일
멱등관계가 성립하면 get, 성립하지않으면 post
즉, 뭐가 들어갔는지 알고 있다는 뜻
이걸 보여준다고해도 아무 문제가 없다라는 의미
get방식으로는 카드정보가 날아가서 카드정보가 보여서 나중에 복사해서
이중결제가 될 가능성이 있음? 똑같은 결과를 만들어낼 수 없게 하기 위해서는
post방식을 사용해야 함
서버측 데이터에 변화를 줄 땐 get방식을 써선 안된다
💦면접 단골 질문
파라미터가 요청라인에 담겨가는게 get방식
바디라인에 담겨가는게 post방식
메서드 속성으로 결정난다!!
뉴스기사는 get방식을 사용
왜냐? 링크돌려서 많은 사람들이 보게 하기 위해서!!
이름이 같은 파라미터가 여러개 있을 수 있다
그럴때 쓰는게
String[] = values = requset.getParameterValues("pet");
니가 요청한 파라미터중에 펫을 들고오는데 펫으로 정의된 값들을 가지고 와라
String로 리턴함!
request.getParameterNames()메서드
map형식으로 니가 지금 요청한 정보에서 name만 다 들고 오겠다!
Enumeration => StringTokenizer
다음꺼 있습니까? 있으면 들고 오세여~
request.getParameterMap()메서드
톰캣이 받아서 처리 할땐,
String / String[]
name : abc
address : def
pet: cat, dog
배열로 처리하면 한개로도 처리할 수있고 복수로도 처리할 수 있음
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import = "java.util.Enumeration" %>
<%@ page import = "java.util.Map" %>
<%
request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>요청 파라미터 출력</title>
</head>
<body>
<b>request.getParameter() 메서드 사용 </b><br>
name 파라미터 = <%= request.getParameter("name") %> <br>
address 파라미터 = <%= request.getParameter("address") %>
<p>
<b>requset.getParameterValues() 메서드 사용 </b><br>
<%
String[] values = request.getParameterValues("pet");
if(values != null) {
for(int i = 0; i < values.length; i++){
%>
<%= values[i] %>
<%
}
}
%>
<p>
<b>request.getParameterNames() 메서드 사용</b><br>
<%
Enumeration paramEnum = request.getParameterNames();
while(paramEnum.hasMoreElements()){
String name = (String)paramEnum.nextElement();
%>
<%= name %>
<%
}
%>
<p>
<b>request.getParameterMap() 메서드 사용 </b><br>
<%
Map parameterMap = request.getParameterMap();
String[] nameParam = (String[])parameterMap.get("name");
if(nameParam != null){
%>
name = <%= nameParam[0]%>
<%
}
%>
</body>
</html>
post방식으로 전송이 됐을때는 request.setCharacterEncoding("utf-8");
charSet과 동일하게 넣어주면 글자가 깨지지않음! *포스트방식일때만!
HTTP표준에는 get방식으로 전달되는 파라미터 값을 인코딩할 때 어떤 캐릭터셋을 사용해야하는지에 대한 규칙이 정해져 있지 않음
이름:form.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head><title>폼 생성</title></head> <body>
글자를 byte값(숫자)으로 바꾸는게 인코딩
그 숫자를 다시 글자로 바꾸는게 디코딩
charset=utf-8
이걸 보고 브라우저가 맞춰서 디코딩(해석)함

톰캣8부터 utf-8이라 우린 톰캣6로 사용~

<% request.setCharacterEncoding("utf-8"); %>
여기서 post 방식일 경우만 적용이 된다.
왜냐하면 요청 바디에서 적용이 되기 때문이다.
톰캣에서 <% request.setCharacterEncoding("utf-8"); %> 인코딩 처리하기 위해서는 밑의 코드를 써주면 된다.
<%
String kor = request.getParameter("name");
kor = new String(kor.getBytes("8859_1"),"euc_kr");
%>
변환: <%= kor %>