4/18

리무 rimu ·2023년 4월 18일

Web (jsp)

목록 보기
1/3

JSP란?

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 페이지 디렉티브(설정을 담음)
<% 스크립트릿
<%= 표현식

JSP가 제공하는 디렉티브

page
taglib
include

스크립트 요소

표현식 <%= ~ %> : 값을 출력(응답내용으로 출력, 콘솔 출력 X)
스크립트릿 <% ~ %>: 자바코드를 실행(자바문법 그대로 사용)
선언부: 자바 메서드(함수)를 만듬(자바문법 그대로 사용)

정적인 데이터
자바스크립트, CSS, HTML

기본객체 (굉장히 중요) 📢

Page 디렉티브

Page 디렉티브의 주요 속성 (나중에 배운다고 함)

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은 영문자만 나타냄
저걸 실행을 하게 되면 글자가 깨짐

import 속성

자바랑 똑같음 / 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> 을 사용해야 함!!

trimDirectiveWhitespaces

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>

📌request 기본객체

  • JSP페이지에서 가장 많이 사용되는 기본 객체로서 웹 브라우저의 요청과 관련이 있음
  • 사용자의 의도가 담겨있는 객체
  • tomcat이 쓰기편하게 객체로 만들어줌 그게 request 객체
  • 🔅클라이언트가 전송한 요청 파라미터 읽기 기능
  • 🔅속성 처리 기능

get메서드를 이용해서 클라이언트 정보를 뽑아낼 수 있음
getRemoteAddr() 클라이언트 ip 찾아낼 수 있는 메서드
getMethod() 클라이언트가 나한테 정보를 어떻게 보냈는지 get/post
getContextPath() 현재 어플리케이션의 루트, 디스크상의 위치

왜 set은 없을까?

요청은 사용자
프로그램이 동작하는 근본적인 이유는 무엇일까?
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은 전송방식
상대경로

전송방식 get/post

전달되는 값은 같으나 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 방식일 경우만 적용이 된다.

왜냐하면 요청 바디에서 적용이 되기 때문이다.

  • 그렇기 때문에 get 방식일 경우 적용이 되지 않는다.

톰캣에서 <% request.setCharacterEncoding("utf-8"); %> 인코딩 처리하기 위해서는 밑의 코드를 써주면 된다.

<%
String kor = request.getParameter("name");
kor = new String(kor.getBytes("8859_1"),"euc_kr");
%>
변환: <%= kor %>

  • 톰캣을 잘 사용하지 않으므로 굳이 알 필요는 없다.
profile
JAVA / SQL / Spring 을 공부하고 있습니다 🐥

0개의 댓글