.jsp 연습하기 03

오늘·2021년 4월 29일
0

웹 페이지 연습

목록 보기
5/35

내장객체

: jsp 페이지에서 사용할 수 있도록 jsp 컨테이너에 미리 정의된 객체
: import문 없이 자유롭게 사용 가능
: 스크립틀릿 태그나 표현문 태그에 선언이나 객체 생성하지 않고도 직접 호출하여 사용이 가능하다

종류

  1. request : 웹 브라우저의 http 요청 정보를 저장
  2. response : 웹 브라우저의 http 요청에 대한 응답 정보를 저장
  3. out : jsp 페이지에 출력할 내용을 담고있는 출력 스트림
  4. session : 웹 브라우저의 정보를 유지하기 위한 세션 정보를 저장
  5. application : 웹 애플리케이션의 콘텍스트 정보를 저장
  6. pageContext : jsp 페이지의 정보를 저장
  7. page : jsp 페이지를 구현한 자바 클래스로 jsp 페이지 자체를 나타낸다
  8. config : jsp 페이지의 설정 정보를 저장
  9. exception : jsp 페이지의 예외 발생을 처리

request 내장 객체

: jsp 페이지에서 가장 많이 사용되는 기본 내장 객체
: 웹 브라우저에서 서버의 jsp 페이지로 전달하는 정보를 저장


요청 파라미터 관련 메소드

getParameter

폼 페이지로부터 입력된 데이터를 request.getParameter(""); 형태로 받아서 파라미터 값을 가져온다.

"request.jsp 파일"

<body>
	<p> request 내장 객체 사용 <br>
		: 요청 파라미터 값 출력하기 </p>
	<!-- 많은 값을 넘길때는 post / 주소에 붙여서 값 넘길때는 get 방식 -->
	<form action="process.jsp" method="post" />
		<p> <label> 이름 : <input type="text" name="name"></label>
		<p> <input type="submit" name="전송" >
</body>




"process.jsp 파일"
<body>
	<p> 서버 쪽 jsp인 request.jsp의 form action 에서 호출된 파일 </p>
	<%
		String name = request.getParameter("name");
	%>
	입력된 이름 : <%= name %>
</body>

"request 파일"에서 입력창으로 입력받은 내용을
"process 파일에서 변수타입 변수명 = request.getParameter(" "); 의 형태로 받아 처리한 것을 확인 할 수 있다.


클라이언트 정보 및 서버정보 보기

클라이언트가 전송한 정보와 서버정보를 볼 수 있는 메소드 제공한다

<body>
	클라이언트IP = <%= request.getRemoteAddr() %> <br>
	요청정보길이 = <%= request.getContentLength() %> <br>
	요청정보 인코딩 = <%= request.getCharacterEncoding() %> <br>
	요청정보 컨텐츠 유형 = <%= request.getContentType() %> <br>
	요청정보 프로토콜 = <%= request.getProtocol() %> <br>
	요청정보 전송방식 = <%= request.getMethod() %> <br>
	요청 URI = <%= request.getRequestURI() %> <br>
	콘텐츠 경로 = <%= request.getContextPath() %> <br>
	서버이름 = <%= request.getServerName() %> <br>
	서버포트 = <%= request.getServerPort() %> <br>
	쿼리문 = <%= request.getQueryString() %>
</body>


내 노트북으로 해당 페이지를 로드한 결과가 위와 같이 나온다.


요청 http 헤더 관련 메소드

웹 브라우저는 http 헤더에 부가적인 정보를 담아 서버로 전송하며,
HTTP 프로토콜은 헤더 정보에 부가적인 정보를 담고 있다
(브라우저 종류, 운영체제, 운영체제 버전 등)

관련 메소드의 종류는 아래와 같다

  1. getHeader(String name)
    반환 유형 : String
    설명 : 설정한 name의 헤더 값을 가져온다
  2. getHeaders(String name)
    반환 유형 : Enumeration
    설명 : 설정한 name의 헤더 목록 값을 가져온다
  3. getHeaderNames()
    반환 유형 : Enumeration
    설명 : 모든 헤더 이름을 가져온다
  4. getIntHeader(String name)
    반환 유형 : int
    설명 : 설정한 name의 헤더 값을 정수로 가져온다
  5. getDateHeader(String name)
    반환 유형 : long
    설명 : 설정한 name의 헤더 값을 시간 값으로 가져온다
  6. getCookies()
    반환 유형 : java.servlet.http.Cookie
    설명 : 모든 쿠키 값을 가져온다
<body>
	<p> request 내장객체로 모든 http 헤더 정보값 출력하기 </p>
	<%
		// getHeaderNames : 모든 헤더의 이름 가져오기
		Enumeration en = request.getHeaderNames();
		// hasMoreElements : 자료가 있으면 true / 없으면 false
		while(en.hasMoreElements()) {
			String headerName = (String) en.nextElement();
			// getHeader : 설정한 name의 헤더 값을 가져온다
			String headerValue = request.getHeader(headerName);
			// getIntHeaders : 설정한 name의 헤더값을 int로 가져온다
			int n = request.getIntHeader("headerName");
			// getDateHeader : 설정한 name의 헤더값을 시간으로 가져온다
			long lo = request.getDateHeader(headerValue);
	%>
	
		헤더 이름 : <%= headerName %> <br>
		헤더 값    : <%= headerValue %> <br>
		정수로 가져온 헤더값 : <%= n %> <br>
		시간으로 가져온 헤더값 : <%= lo %> <br>
		
		<hr>
	<%
		}
	%>
	
	
	<%
		// getHeaders : 설정한 name의 헤더 목록 값을 가져온다
		// () 에 헤더 이름을 넣으면 헤더 값이 출력된다.
		Enumeration enu = request.getHeaders("accept");
		while(enu.hasMoreElements()) {
			String headerValuee = (String) enu.nextElement();
			out.print(headerValuee + "<br>");
		}
	%>
	
	
	<%
		// 모든 쿠키 값 가져오기
		Cookie[] cArr = request.getCookies();
		String cD = cArr[0].getDomain();
		out.print(cD);
	%>
</body>


scope

폼 태그 사용시 <form action="" method="" scope=""> 와 같은 모양에서 scope란 뭘까.

scope
: 속성을 공유할 수 있는 범위
: scope = "page | request | session | application"
: 4종류 중 default는 page이다.

  • page 영역
    • 한 번의 클라이언트 요청이 오면, 하나의 JSP 페이지가 응답된다
    • page 영역은 이 때 하나의 JSP 페이지 내에서만 객체를 공유하는 영역을 의미 ( JSP only )
    • JSP 파일에는 pageContext가 내장되어 있으며, 이 객체는 page 영역에서만 유효하다.
    • JSP 파일에 <% %> 안에 변수를 사용하면 이 변수는 해당 JSP 파일 내에서만 유효한데, page 스코프에 정의된 객체이기 때문이다.


  • request 영역
    • 요청을 받아서 응답하기까지 객체가 유효한 영역
    • 클라이언트의 요청이 처리되는 동안 유효
    • forward 또는 include를 사용하게 되면, request 요청 객체가 공유되어서 request 영역이 됩니다.


  • session 영역
    • 하나의 브라우저 당 1개의 session 객체가 생성된다
      즉, 같은 브라우저 내에서 요청되는 페이지들은 같은 객체를 공유하게 되는데, 이를 세션 영역이라고 한다.
    • 세션이 종료되면 객체는 반환된다


  • application 영역
    • 하나의 애플리케이션 당 1개의 application 객체가 생성된다
      즉, 같은 애플리케이션 내에서 요청되는 페이지들은 같은 객체를 공유하게 되는데 이를 애플리케이션 영역이라고 한다.
    • 애플리케이션이 종료되면 객체는 반환됩니다.

response 내장 객체

서버에서 웹 브라우저로 응답하는 정보를 처리하기 위해, 객체 타입의 response 내장 객체를 사용하여 사용자의 요청에 응답하게 된다.

페이지 이동 = 리다이렉션(redirection)
사용자가 새로운 페이지를 요청할 때와 같이 페이지를 강제로 이동하는 것

서버는 웹 브라우저에 다른 페이지로 강제 이동하도록 response 내장 객체의 리다이렉션 메소드를 제공하며, 페이지 이동 시에는 문자 인코딩을 알맞게 설정해야 한다.


응답 http 헤더 관련 메소드

서버가 웹 브라우저에 응답하는 정보에 헤더를 추가하는 기능을 제공하며, 헤더 정보에는 주로 서버에 대한 정보가 저장되어 있다.

관련 메소드
1. setContentType(String type)
모양 : response.setContentType("text/html; charset=utf-8");
반환 유형 : void
설명 : 웹 브라우저에 응답할 MIME 유형을 설정
2. getContentType()
모양 : response.getContentType()
반환 유형 : String
설명 : 웹 브라우저에 응답할 MIME 유형을 가져온다
3. SetCharacterEncoding(String charset)
모양 : request.setCharacterEncoding("utf-8");
반환 유형 : void
설명 : 웹 브라우저에 응답할 문자 인코딩을 설정한다.
4. getCharacterEncoding()
모양 : response.getCharacterEncoding()
반환 유형 : String
설명 : 웹 브라우저에 응답할 문자 인코딩을 가져온다
5. sendError(int status_code, String message)
모양 : response.sendError(404, "에러입니다");
반환 유형: void
설명 : 오류(코드 및 오류 메시지)를 설정
6. setStatus(int statuscode)
반환 유형 : void
설명 : 응답할 http 코드를 설정


아이디/비밀번호를 받아 처리하기

값을 입력받아 넘겨주는 파일

"response.jsp" 파일
<body>
	<p> response 내장 객체로 페이지 이동하기</p>
	<form action="process.jsp" method="post" scope="page">
	<fieldset>
		<p> <lable> 아이디 <input type="text" name="id" />
			<lable> 비밀번호 <input type="passsword" name="passwd"/>
			<input type="submit" value="로그인" >
		</fieldset>
	</form>
</body>

입력된 값을 받아오는 파일

받아와서 if 문으로 조건 처리 후 맞는 페이지를 호출한다.

"process.jsp" 파일
<body>
	<P> 서버쪽 response </P>
	<%
		// 인코딩 유형은 utf-8로 설정
    		request.setCharacterEncoding("utf-8");
    		String id = request.getParameter("id");
    		String pw = request.getParameter("passwd");
    
    		if( id.equals("admin") && pw.equals("1234")){
       			response.sendRedirect("response_success.jsp");
    		} else{
       			response.sendRedirect("response_fail.jsp");
    		}
	%>
</body>

관리자 로그인 성공시 출력되는 파일

"response_success.jsp" 파일
<body>
	<h3> 로그인 되었습니다 </h3>
</body>

관리자 로그인 실패시 출력되는 파일

"response_fail.jsp" 파일
<body>
	<h3> 입력하신 아이디 / 비밀번호를 확인해주세요 </h3>
</body>

실행시 가장 먼저 뜨는 화면

만약 관리자 로그인에 성공한다면

실패한다면


응답 http 헤더에 정보 추가

<body>
	<p> 응답 http 헤더에 정보 추가하기 </p>
	<%
		response.setHeader("Catche-control", "use_cache");
		response.addHeader("contentType", "text/html; charset=utf-8");
		response.setDateHeader("date", 1L);
		response.setIntHeader("start", 5);
	%>
	Cache-Control : <%= response.getHeader("Catche-control") %> <br>
	contentType : <%= response.getHeader("contentType") %> <br>
	date : <%= response.getHeader("date") %> <br>
	start : <%= response.getHeader("start") %> <br>
</body>


5초마다 자동 새로고침 되는 페이지

<body>
	<p> 이 페이지는 5초마다 새로고침(갱신) 됩니다 </p>
	<%
		response.setIntHeader("Refresh", 5);
	%>
	<p> <%= new java.util.Date() %>
</body>

실행시 저 초 부분이 5초마다 자동으로 갱신되는 것을 확인할 수 있다.


응답 콘텐츠 관련 메소드

response 내장 객체는 웹 브라우저로 응답하기 위해 MIME 유형, 문자 인코딩, 오류 메시지, 상태 코드 등을 설정하고 가져오는 관련 메소드를 제공한다.

<body>
	<p> response 내장 객체로 오류 응답 코드와 오류 메시지 보이기 </p>
	<%
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		// 아래 코드로 실행시 pdf 파일로 저장되게끔 한다.
		// response.setContentType("application/pdf");
		// 고의로 404 에러를 발생시키는 코드
		//response.sendError(404, "에러입니다");
	%>
	문자 인코딩 : <%= response.getCharacterEncoding() %> <br>
	콘텐츠 유형 : <%= response.getContentType() %>
</body>

만약 에러발생 코드를 주석에서 풀어준다면 실행시 아래와 같이 출력된다.


out 내장 객체

웹 브라우저에 데이터를 전송하는 출력 스트림 객체

jsp 컨테이너는 jsp 페이지에 사용되는 모든 표현문 태그와 html, 일반 텍스트 등을 out 내장 객체를 통해 웹 브라우저에 그대로 전달

스크립틀릿 태그에 사용하여 단순히 값을 출력하는 표현문 태그 ( <%= ... %>) 와 같은 결과를 얻을 수 있다.

out 내장 객체 메소드

  1. print(String str)
    반환 유형 : void
    설명 : 설정된 str 값을 웹 브라우저에 출력
  2. println(String str)
    반환 유형 : void
    설명 : 설정된 str 값을 웹 브라우저에 출력, 줄바꿈 적용 안됨
  3. newLine()
    반환 유형 : void
    설명 : "줄바꿈"을 출력한다.
  4. getBufferSize()
    반환 유형 : int
    설명 : 현재 출력 버퍼의 크기를 가져온다
  5. getRemaining()
    반환 유형 : int
    설명 : 현재 남아 있는 출력 버퍼의 크기를 가져온다
  6. clear()
    반환 유형 : void
    설명 : 현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하지 '않고' 비운다. 만약 이미 버퍼가 플러시되었다면 IOException이 발생
  7. clearBuffer()
    반환 유형 : void
    설명 : 현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하지 '않고' 비운다. 만약 이미 버퍼가 플러시 되었어도 IOException이 발생하진 않는다
  8. flush()
    반환 유형 : void
    설명 : 현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하고 비운다
  9. isAutoFlush()
    반환 유형 : boolean
    설명 : 출력 버퍼가 채워졌을 때의 처리를 결정한다. 자동으로 플러시하는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환

out 객체 사용해보기

java에서는 println 자체가 print + \n 으로 줄바꿈이 포함되어 있었지만, jsp 에서는 그렇지 않다.

<body>
	<p> out 객체 사용 </p>
	<%
		out.println("jsp에서 println은" + "<br>");
		out.print("print와 같이 줄바꿈이 되지 않습니다" + "<br><br>");
		out.println("오늘 날짜와 시간 : ");
		out.print(Calendar.getInstance().getTime().toLocaleString());
	%>
</body>


라디오 / 체크박스 사용하기

라디오 / 체크박스로 값을 넘겨죽고, 받아서 출력하기

값 넘겨주는 곳

<input type="radio" name="radio_01" value="홍길동"> 홍길동
라디오 타입에서 value를 원래는 radio_input1 이런식으로 넘겨주려 했다. 하지만 받는 곳에서 어떻게 처리해야할 지 모르겠어서 그냥 한글로 넣어버렸다.

그래서 상단에 <% request.setCharacterEncoding("euc-kr"); %> 를 명시해주어 한글 처리가 가능하도록 하였다.

<body>
	<p> 체크박스 / 라디오 버튼 만들기 </p>
	<form action="out_process.jsp" method="post" scope="page" >
		<fieldset>
			<legend> 수강 과목 </legend>
				<input type="checkbox" name="check_01" value="korean" > 국어 
				<input type="checkbox" name="check_02" value="english"> 영어
				<input type="checkbox" name="check_03" value="math"> 수학
				<input type="checkbox" name="check_04" value="sing"> 가창
		</fieldset>
		
		<fieldset>	
			<legend> 상담 진행 교수 신청 </legend>
				<input type="radio" name="radio_01" value="홍길동"> 홍길동
				<input type="radio" name="radio_01" value="김자바"> 김자바
				<input type="radio" name="radio_01" value="이민규"> 이민규
				<input type="radio" name="radio_01" value="배두민"> 배두민
		</fieldset>
		
		<input type="submit" value="확인" >
	</form>
</body>

값 받아서 출력하기

체크박스에서 선택하지 않으면 값이 null로 들어가게 되고, null 이면 출력이 안되도록 하고 싶었다.

if (check_01 != null) {
	check_01 = "국어 ";
} else {
	check_01 = "";
}

그래서 값이 들어오면 원하는 단어로 바꾸고, null 이라면 출력되는 게 없도록 하였다.

<body>
	<%
		request.setCharacterEncoding("euc-kr");
	
		String check_01 = request.getParameter("check_01");
		String check_02 = request.getParameter("check_02");
		String check_03 = request.getParameter("check_03");
		String check_04 = request.getParameter("check_04");
		
		String radio = request.getParameter("radio_01");
		
		if (check_01 != null) {
			check_01 = "국어 ";
		} else {
			check_01 = "";
		}
		
		if (check_02 != null) {
			check_02 = "영어 ";
		} else {
			check_02 = "";
		}
		
		if (check_03 != null) {
			check_03 = "수학 ";
		} else {
			check_03 = "";
		}
		if (check_04 != null) {
			check_04 = "가창 ";
		} else {
			check_04 = "";
		}
	%>

	과목 명 : <%= check_01 %><%= check_02 %><%= check_03 %><%= check_04 %> <br>
	담당 교수 명 : <%= radio %>
</body>

첫 실행화면
아래와 같이 값 선택 후 전송(확인)버튼을 누르면

원하는 대로 출력되었다

0개의 댓글