url(Uniform Resource Locator)
127.0.0.x : 내(클라이언트의) 컴퓨터의 ip
localhost:8080 : 내(클라이언트의) 컴퓨터의 주소:포트
주석 처리
Java :// (내용)
/* (내용) */
html :<!-- (내용) -->
<- 사용자가 확인 가능!!!! 남기면 안됨!!!!
jsp :<%-- (내용) --%>
아파치와 톰캣 차이 (웹서버와 웹어플리케이션서버 차이)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>현재 시간</title>
</head>
<body>
지금 : <%= new java.util.Date() %>
</body>
</html>
우리가 url을 요청하면 서버가 jsp를 실행해서 돌려준다.
jsp 안에는 서버사이드 언어(동적인 데이터) - 클라이언트사이드 언어(정적인 데이터)가 혼재됨
구분은 우리의 몫
브라우저가 읽어낼 수 있는 정보 형식의 데이터를 만들어내는 기능
요청은 세 가지 파트로 구성된다
전송방식/프로토콜명/프로토콜 버전 + URL GET / HTTP / 1.1 / URL (브라우저가 나머지 결정하고 사용자는 URL만 보낸다) |
1. 라인, 행 | 프로토콜명/프로토콜 버전/응답코드/응답메시지 http / 1.1 / 200 / OK |
브라우저의 정보 | 2. 헤더 | 응답에 대한 정보 |
필요할 때만 사용. 파일 데이터 등 | 3. 바디 | 웹 브라우저가 요청한 자원의 내용이 담김 |
<%@ %>
page
, taglib
, include
3가지가 존재
- MIME (Multipurpose Internet Mail Extensions)
이메일에서 첨부파일의 타입을 설명하기 위해 정의되었으나, 메일 이외의 다른 곳에서도 응답데이터의 내용을 설명하기 위해 사용한다.
<%= %>
표현식 : 값을 출력한다 (클라이언트에게 지정된 값을 String으로 보내준다)<jsp:getProperty>
or EL(${값})
로 대체<% %>
스크립트릿 : 자바 코드를 실행한다<%! %>
선언부 : 자바 메서드를 만든다getRemoteAddr()
: 연결된 클라이언트의 ip 주소 반환 (return : String)getMethod()
: 웹 브라우저가 정보를 전송한 방식(method) 반환 (return : String)getContextPath()
: JSP 페이지가 속한 웹 어플리케이션의 컨텍스트 경로를 반환 (return : String)
- contextPath
: WAS(Web Application Server)에서 웹어플리케이션을 구분하기 위한 path
http://ip:port/디스크상의 주소
<- 이 부분
getContentLength()
(return : long)getCharacterEncoding()
(return : String)getContentType()
(return : String)getProtocol()
(return : String)getRequestURI()
(return : String)getServerName()
(return : String)getServerPort()
(return : int)name
속성을 식별자로 사용
getParameter(String name)
(return : String)getParameterValues(String name)
(return : String[])getParameterNames()
(return : java.util.Enumeration)getparameterMap()
(return : java.util.Map)Map<String, String[]>
형태로 저장
- getter는 있지만, setter는 없다
-> 클라이언트 측에서 보낸 정보를 서버가 함부로 훼손해서는 안된다는 것
GET 방식과 POST 방식의 차이
- 파라미터(사용자가 보내는 정보)를 라인(URL)에 담아 보내면 GET
사용자가 볼 수 있음 ⭕ -> 사용자가 따라할 수 있음 (어디서든 다시 동일한 요청을 할 수 있음)- 파라미터를 바디에 담아 보내면 POST
사용자가 볼 수 없음 ❌- 둘을 가르는 기준 : 멱등(冪等)관계가 성립하느냐 하지않느냐
c.f.) 멱등 : 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질- 즉 CRUD 중 R(read)은 get, 나머지는 post를 사용
GET
은public static final
과 비슷한 개념
계속 똑같이 요청한다 해도 바뀌는 것이 없으므로 공개적으로 둔다!
request.setCharacterEncoding(String 디코딩 방식);
- get 방식으로 던지면 의미x, post일 때 의미있음.
- 파라미터 값 사용 전에 사용해야 하는 메서드
String 생성자 관련 <- 인코딩[디코딩] 바꾸기 가능
브라우저에서 보낼 때 미리 인코딩해서 보내기(js 사용)
하나라도 삐끗하면 글자 깨짐!!!!!!!!!!!!!!
86쪽 참고
'http 표준에는 get 방식으로 전달되는 파라미터 값을 인코딩할 때 어떤 캐릭터셋을 사용해야 하는지에 대한 규칙이 정해져 있지 않다.'
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>폼 생성</title>
</head>
<body>
<form action="viewParameter.jsp" method="get">
이름: <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>
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ 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>
<%
String kor = request.getParameter("name");
kor = new String(kor.getBytes("8859_1"), "euc_kr");
%>
<b>
request.getParameter() 메서드 사용
</b><br/>
name 파라미터 = <%= request.getParameter("name") %>
<br/>
address 파라미터 = <%= request.getParameter("address") %>
<p>
<b>
request.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] %>
<%
}
%>
</p>
</body>
</html>
캐시(Cache)
동일한 데이터를 중복으로 받아오지 않도록 임시보관소에 저장. 캐시가 지나치게 커지면 새로 데이터를 받아오는 것보다 캐시 안에서 필요한 정보를 찾는 것이 더 오래 걸릴 수 있다. 주기적으로 삭제할 것.
캐시 사용안함 설정
<% response.setHeader("Cache-Control", "no-cache"); response.addHeader("Cache-Control", "no-cache"); response.setHeader("pragma", "No-cache"); response.setDataHeader("Expires", 1L); %>
새로고침 = (브라우저에 저장된) 마지막에 보낸 요청을 다시 보내는 것
-> 새로운 요청으로 덮어씌우기
뒤로가기 = (브라우저에 저장된) 페이지를 다시 불러옴
-> 만료된 페이지입니다
리다이렉트 URL 인코딩?
굳이? 어차피 서버가 만드는 URL이기 때문에 애초에 한글을 넣지 않으면 해결됨
a => 사과, b => 바나나... 미리 연결
서버가 사용자 의도 없이 다른 주소로 보내는 기술 2가지
1. 리다이렉트
2. 포워드