<% %> : 서버측의 연산
이런게 어디에 담겨서 클라이언트한테 응답하는가?
바디에 담겨서 간다.
<%@ : 디렉티브
: '디렉티브'라고 부른다. 세가지가 있다.
<%@ page : 페이지 디렉티브
: 페이지디렉티브라고 읽는다. 설정을 담음.
정적인 데이터 : 서버에서 실행되지 않는 값. 브라우저에서 실행되는거.
MIME : 메일의 첨부파일을 의미.
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
- 위의 contetnType = "text/html"의 설명
- text/html : 내가 보내는 정보가 text정보다. 형식은 html로 되어 있다. html로 읽으면 된다.
- image/jpg : 이미지인데 jpg로 구성된 이미지이다. 이렇게 보낼테니까 너 이렇게 읽어라.
페이지 디렉토리에 쓰면 됨.
<%@ page import = "java.util.Date"%>
이런 식으로 import를 사용한다.
import해주지 않으면 밑에 코드들이 에러가 난다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import = "java.util.Calendar" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Calendar 클래스 사용</title>
</head>
<body>
<% Calendar cal = Calendar.getInstance(); %> //캘린더 객체는 이렇게 구한다.
오늘은
<%= cal.get(Calendar.YEAR) %>년
<%= cal.get(Calendar.MONTH)+1 %>월 //0월부터 시작하기 때문에 +1을 해줘야 한다.
<%= cal.get(Calendar.DATE) %>일
입니다
</body>
</html>
첫줄에 디렉티브가 날아가면 원래 공백으로 나온다.
근데 trimDirectiveWhitespaces를 사용하면, 공백을 없애고 나온다.
<%! : 선언식(정의)
: JSP 페이지의 스크립트릿이나 표현식에서 사용할 수 있는 멤버변수(맞는지 확실히 모르겠음..)나 메서드를 작성할때에는 선언부를 사용.
<% : 스크립트릿(연산)
: 자바 문법을 그대로 사용한다. (선언부도 자바 메서드를 만든다.)
<%= 표현식(출력)
: 표현식 - 값을 출력한다 = 결과에 출력한다. 응답내용으로 출력한다. 응답으로 전송될 때 정의된 값을 보낸다. 클라이언트한테 '정해놓은 그 값'을 그대로 보여준다.
먜) 그냥 String에는 적지 않고, 어떤 연산의 값을 넣을 때 '<%=' 를 사용하는 것 같음.
코드)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>합 구하기</title>
</head>
<body>
<% int sum =0;
for(int i= 1 ; i<=10 ; i++) {
sum = sum + i;
}
%>
1부터 10까지의 합은 <%= sum %>입니다.
//그냥 String이 아니라, 어떤 연산의 값을 넣을 때 '<%=' 를 사용하는 것 같음.
</body>
</html>
<%@ 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;
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<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>
결과)
코드)
<html>
<head>
<meta charset="EUC-KR">
<title>makeTable.jsp</title>
</head>
<body>
<%
for(int i =0; i<10 ; i++) {
%>
hi!<br> // 이걸 10번 반복한다. if문, switch문도 다 된다.
<%
}
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..?
표현식안에 객체가 있으면 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 = "아~ 옛날이여~ "; // 멤버변수
%>
request는 사용자의 의도가 담겨있는 객체이다.
요청할 때 라인 헤더 바디로 나눠서 정보가 전달되는데 톰캣이 이 3가지를 객체로 바꿔준다. 그 안의 값을 가지고....
웹 브라우저는 해당 웹서버에 연결한 후 요청정보를 전송하는데, 이 요청 정보를 제공하는 것이 바로 request 기본 객체이다.
💡클라이언트가 전송한 요청 파라미터 읽기 기능
💡속성 처리 기능
getRemoteAddr() : 클라이언트 ip를 확인하는 거.
getMethod() : 클라이언트가 나한테 정보를 어떻게 보냈는지(get인지 post인지) 알아보는 메서드.
getContextPath() : 현재 어플리케이션의 경로를 구한다. 내생각- getContextPath() 메소드가 반환하는 경로는 web.xml 파일에서 <display-name>
태그안에 <welcome-file>
에 정의된 값으로 설정되는 것 같음.
set이 없는 이유 : request객체는 뭘 해야 하는 지 그대로 담겨있어서 훼손하면 안된다. '이거 해줘'하면 그것만 해주면 된다. 고객의 의도를 나타내는 객체이기 때문에 그 안의 내용은 바꿀 수 없게 만들어 놨다. 그래서 set을 사용하지 않고 get를 사용한다.
: 파라미터가 요청라인안의 url안에 담겨서 날아가는 방식
입력한 값이 우리 눈에 보이는 방식.
: 파라미터가 요청바디에 담겨서 날아가는 방식
사용자가 입력한 값이 우리 눈에 보이지 않는 방식이 post방식.
파라미터가 요청라인에 담김!!! - get방식
파라미터가 요청바디에 담김!!! - post방식
이렇게 대답해야한다!!!!!!!!
아래 코드를 보고 보면 더 잘 이해할 수 있을 듯.
- get방식(요청라인에)은 사용자가 파라미터를 볼 수 있다. 입력한 값들을 url에서 볼 수 있다. 볼 수 있다는 말은 똑같이 흉내낼 수 있다.
http://localhost:8080/04.18/viewParameter.jsp?name=미미address=부산시&pet=dog&pet=cat
위처럼 url에서 파라미터가 보인다.
이러면 결제할 때 같은 경우는 나의 카드번호나 비밀번호등이 노출되고, 결제된 것이 또 결제될 수 있다.
- post방식(요청바디에)은 사용자가 파라미터를 볼 수 없다. viewParameter.jsp 무슨 값을 전달했는지 알 수 없다. 안보이니까.
http://localhost:8080/04.18/viewParameter.jsp
파라미터 보이지 않는다.
멱등 : 연산을 여러 번 적용하더라도 결과값이 달라지지 않는 일.
-> 뭐가 들어갔는 지 알고 있다. == 이걸 보여준다고 해도 아무 문제가 없다. 공개를 해놔도 아무문제가 없을 때, 사용한다.
여러번 해도 변화가 없는 일이 무엇이 있을까?
c(만들기=쓰기),r(읽기),u(수정=쓰기),d(삭제=쓰기)
쓰기작업하면 바뀐다. 파라미터를 다 공개해도 된다는 말은 어차피 니가 알아도 바뀌지 않으니까 여러번해도 상관없다는 뜻.
"r : 읽기"는 get방식이다.
"c,u,d : 쓰기"는 post방식이다.
서버측 데이터에 변화를 주는 일이 생긴다면, get방식을 쓰면 안된다.
멱등이 성립할 때는 get방식.
멱등이 성립하지 않았을 때는 post방식.
<form>코드
<html>
<head>
<meta charset="EUC-KR">
<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">돼지
// 체크박의 name : 서브밋할 때 name,address,pet이 파라미터가 된다.
<br>
<input type ="submit" value="전송">
</form>
</body>
</html>
<viewParameter>코드
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import= "java.util.Enumeration" %>
<%@ page import = "java.util.Map" %>
<% request.setCharacterEncoding("EUC-KR"); %>
// 리퀘스트 바디에 들어가있는 정보를 Euckr로 선택하겠다.
//얘는 리퀘스트 바디에만 적용된다.
//get은 요청라인에 들어가기 때문에 get방식으로 던지면 얘는 아무의미가 없어진다.
//post방식으로 써야 이게 의미가 있다. post방식으로 전송을 했을 때 이거 적기.
//get방식에 대해서는 표준이 없다!!!
//바디에만 적용. 디코딩해서 값으로 들고온다.
//파라미터에 접근하기 전에 써야한다.
//파라미터를 한번이라도 접근을 하고 사용하게 되면 안먹힌다.
//바디에 대한 인코딩 방법을 결정을 했다는 뜻이 되어서 이게 먹히지 않는다!!!!!!!!!!
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>요청 파라미터 출력</title>
</head>
<body>
<b>request.getParameter() 메서드 사용</b><br>
name 파라미터 = <%=request.getParameter("name")%><br>
//가장 중요한 메서드중 하나!!
//이건 리퀘스트에 들어와있는 파라미터 중에서 이름이 name인 놈을 가져와라.
//이름이 name이 입력한 값이 나온다.
address 파라미터= <%= request.getParameter("address") %>
//이름이 address인 놈의 값을 가져와라.
<p>
<b>request.getParameterValues()메서드 사용</b><br>
//value's' : pet이 3개인데, 3개 다 선택하면 url이 3개가 다 나온다.
//콤보박스, select 등에 쓰임.
//니가 요청한 파라미터 중에 pet이름을 가진 애들 중에 이 아이들의 값'들'을 들고 와라.
<%
String[] values = request.getParameterValues("pet");
//배열로 return한다. 복수데이터를 가져오기 때문에.
if(values != null) {
for(int i= 0; i< values.length; i++){
%>
<%= values[i] %>
<%
}
}
%>
<p>
<b>request.getParameterNames() 메서드 사용</b><br>
//map에서 keyset()과 비슷. key의 값들만 다 들고 오는 거.
//너가 요청한 정보에서 name만 다 들고 오겠다.
//key인 name,addr,pet을 들고 온다.
<%
Enumeration paramEnum = request.getParameterNames();
// 반환 값이 Enumeration유형으로
//요청 페이지의 모든 인자 이름이 저장된 목록을 반환한다.
while(paramEnum.hasMoreElements()) {
//읽어올 요소가 남아있는지 확인.
//있으면 true, 없으면 false. Iterator의 hasNext()와 같음
String name = (String)paramEnum.nextElement();
%>
<%= name %>
<%
}
%>
<p>
<b>rquest.getParamenterMap()메서드 사용</b><br>
//map으로 가져와라. key와 value쌍으로 가져와라.
//key타입을 그냥 String, value는 String[] 배열.
//그래서 name은 한칸짜리 배열, pet은 3칸짜리 배열
<%
Map parameterMap = request.getParameterMap();
String[] nameParam = (String[])parameterMap.get("name");
// 배열로 처리-> 한개짜리의 답도 있지만, 여러개를 가진 답도 있기 때문에.
if(nameParam != null) {
%>
name =<%=nameParam[0] %>
<%
}
%>
</body>
</html>
결과)
나중공부
글자를 바이트값으로 바꾸는 것을 인코딩한다고 표현.
숫자를 다시 글자로 바꾸는 것을 디코딩이라고 한다.
브라우저마다 인코딩방식이 다르다.
charset : 브라우저가 읽어들일 때 뭘로 읽을 지 결정하는 거. 이걸 보고 브라우저가 해석한다. 브라우저가 디코딩을 한다.