웹4(스크립트)

제이·2023년 4월 18일
0

목록 보기
4/15
post-thumbnail

JSP의 구성요소

<% %> : 서버측의 연산
이런게 어디에 담겨서 클라이언트한테 응답하는가?
바디에 담겨서 간다.

<%@ : 디렉티브

: '디렉티브'라고 부른다. 세가지가 있다.

<%@ 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로 구성된 이미지이다. 이렇게 보낼테니까 너 이렇게 읽어라.

import속성

페이지 디렉토리에 쓰면 됨.
<%@ 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(중요X)

첫줄에 디렉티브가 날아가면 원래 공백으로 나온다.
근데 trimDirectiveWhitespaces를 사용하면, 공백을 없애고 나온다.

JSP의 스크립트 요소

<%! : 선언식(정의)

: 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 기본 객체

request는 사용자의 의도가 담겨있는 객체이다.
요청할 때 라인 헤더 바디로 나눠서 정보가 전달되는데 톰캣이 이 3가지를 객체로 바꿔준다. 그 안의 값을 가지고....
웹 브라우저는 해당 웹서버에 연결한 후 요청정보를 전송하는데, 이 요청 정보를 제공하는 것이 바로 request 기본 객체이다.

request 기본 객체가 제공하는 기능

💡클라이언트가 전송한 요청 파라미터 읽기 기능
💡속성 처리 기능

requset 메서드

request기본 객체의 클라이언트 및 서버 정보 관련 메서드

  • getRemoteAddr() : 클라이언트 ip를 확인하는 거.

  • getMethod() : 클라이언트가 나한테 정보를 어떻게 보냈는지(get인지 post인지) 알아보는 메서드.

  • getContextPath() : 현재 어플리케이션의 경로를 구한다. 내생각- getContextPath() 메소드가 반환하는 경로는 web.xml 파일에서 <display-name> 태그안에 <welcome-file>에 정의된 값으로 설정되는 것 같음.

  • set이 없는 이유 : request객체는 뭘 해야 하는 지 그대로 담겨있어서 훼손하면 안된다. '이거 해줘'하면 그것만 해주면 된다. 고객의 의도를 나타내는 객체이기 때문에 그 안의 내용은 바꿀 수 없게 만들어 놨다. 그래서 set을 사용하지 않고 get를 사용한다.

request 기본 객체의 파라미터 읽기 메서드⭐⭐⭐⭐

  • ⭐⭐⭐⭐⭐request.getParameter(String name) : 이름이 name인 파라미터의 값을 구한다. 리턴타입은 String
  • ⭐⭐⭐⭐⭐request.getParameterValues(String name) : 이름이 name인 모든 파라미터의 값을 배열로 구한다. 리턴타입은 String[]
  • request.getParameterNames() : 웹 브라우저가 전송한 파라미터의 이름 목록을 구한다. 리턴타입은 java.util.Enumeration
  • request.getParameterMap() : 웹브라우저가 전송한 파라미터의 맵을 구한다. 맵은 <파라미터,이름,값> 쌍으로 구성한다. 리턴타입은 java.util.Map

method의 get, post

get과 post의 차이점은?

⭐get방식

: 파라미터가 요청라인안의 url안에 담겨서 날아가는 방식
입력한 값이 우리 눈에 보이는 방식.

⭐post방식

: 파라미터가 요청바디에 담겨서 날아가는 방식
사용자가 입력한 값이 우리 눈에 보이지 않는 방식이 post방식.

파라미터가 요청라인에 담김!!! - get방식
파라미터가 요청바디에 담김!!! - post방식
이렇게 대답해야한다!!!!!!!!

언제 get쓰고, 언제 post를 쓰는가?

아래 코드를 보고 보면 더 잘 이해할 수 있을 듯.

  • 사용자 --viewParameter.jsp(뭘 원하는지, 기능! 서버가 해야할 일이 무엇인지 결정하는거)--> 서버
  • name : '미미' 이게 기능을 하는 데 필요한 정보이다. 이제 파라미터 역할같은 거. 메서드에서도 add()같은 기능을 할 때 int n 값이 필요하듯이 뷰파라미터 역할을 하려면 'name: 미미'의 값이 필요하다.
  • 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
    파라미터 보이지 않는다.

get,post를 나누는 기준은 "멱등"

멱등 : 연산을 여러 번 적용하더라도 결과값이 달라지지 않는 일.
-> 뭐가 들어갔는 지 알고 있다. == 이걸 보여준다고 해도 아무 문제가 없다. 공개를 해놔도 아무문제가 없을 때, 사용한다.

여러번 해도 변화가 없는 일이 무엇이 있을까?
c(만들기=쓰기),r(읽기),u(수정=쓰기),d(삭제=쓰기)
쓰기작업하면 바뀐다. 파라미터를 다 공개해도 된다는 말은 어차피 니가 알아도 바뀌지 않으니까 여러번해도 상관없다는 뜻.
"r : 읽기"는 get방식이다.
"c,u,d : 쓰기"는 post방식이다.

서버측 데이터에 변화를 주는 일이 생긴다면, get방식을 쓰면 안된다.

멱등이 성립할 때는 get방식.
멱등이 성립하지 않았을 때는 post방식.

request의 예시코드

<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 : 브라우저가 읽어들일 때 뭘로 읽을 지 결정하는 거. 이걸 보고 브라우저가 해석한다. 브라우저가 디코딩을 한다.

profile
Hello :)

0개의 댓글