웹6(get,post방식/리다이렉트/출력버퍼/getContextPath()/기본객체)

제이·2023년 4월 20일
0

목록 보기
6/15
post-thumbnail

get방식과 post방식(리다이렉트)

클라이언트는 'url : 기능'를 보낸다.
예를 들어 cafe.naver.com 과 map.naver.com은 url이 아예 다른 것이다.
'파라미터'는 url 즉, 기능을 수행할 때 필요한 정보이다.
요청은 라인,헤더,바디로 구성되는데 이건 클라이언트가 만든다.

url은 무조건 라인에 들어간다.
파라미터는 get방식을 할 때는 라인에 따라 들어가고,
post방식에서는 바디에 들어간다.

get방식은 모든 정보를 오픈한다. 누군가가 그대로 흉내낼 수 있다.
post방식일때는 사용자 의도를 서버가 알아차리기 어렵다. 그대로 흉내낼 수 없다.
흉내낼 수 있는 지의 여부로 언제 get을 쓰고 언제 post를 쓸 지 결정하면 된다.

'새로고침'은 url과 파라미터를 몰라도 마지막 요청이 그대로 날아가는 거라서 무조건 흉내낼 수 있는 것이다.
그래서 어떻게 보면 ‘새로고침’은 get과 post와 관련이 없을 수도 있다.


(퍼온 사진)

(퍼온 내용)
https://ip99202.github.io/posts/JSP-Servlet-Request,-Response-%EA%B0%9D%EC%B2%B4/

Request, Response 과정
웹 브라우저에 URL을 입력
웹 브라우저는 도메인과 포트 번호를 이용해서 서버에 접속
path 정보, 클라이언트의 IP 등의 요청 정보를 서버에 전송
WAS가 HttpServletRequest라는 객체와 HttpServletResponse라는 객체를 생성
생성된 두 개의 객체를 요청 정보에 있는 path로 매핑된 서블릿에게 전달
전달된 객체는 service(), doGet(), doPost() 같은 메서드에 파라미터로 전달되서 사용

HttpServletRequest
http 프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽는 메소드를 가지고 있다.
Body의 Stream을 읽어 들이는 메소드를 가지고 있다.

HttpServletResponse
WAS는 요청을 보낸 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서블릿에게 전달한다.
서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지등을 전송한다.


WAS(request객체)

브라우저(클라이언트)->웹서버->WAS로 간다. WAS가 request객체에 감싸서 정보를 주고, response객체도 같이 ->jsp에게 준다.
그리고 다시 jsp->WAS->웹서버(정적데이터)->클라이언트(브라우저)에게 준다.

웹서버와 WAS를 묶어서 WAS라고 쳐라.
jsp가 쓸 수 있도록 만들어준다.
url과 파라미터를 WAS에 넘겨주면
WAS가 request의 객체로 만들어서 jsp에게 넘겨준다.
그래서 getParameter()같은 것을 뽑아 올 수 있다.
우리는 jsp만 하면 된다.
jsp의 실행된 결과를 response객체의 바디에 담아서 보낸다.
어떤 웹서버를 쓰더라도 request는 쓰는 방법이 똑같다.
jsp는 요청한 결과 보게 되는 것이다.

리다이렉트

리다이렉트에서는 요청이 두번 생긴다!!! 이게 제일 중요하다.
요청이 2번으로 끝난 것이다.
리다이렉트를 하면 마지막요청이 b.jsp가 되기 때문에, 새로고침해도 b.jsp된다.
요청이 되면 응답은 무조건 일어난다.
새로고침은 브라우저에 저장이 되어 있는 것이라서 서버가 막을 수가 없다.
새로고침을 ‘막는 게 아니라’ 새로고침을 통해서 ‘일어나는 일을 바꾸면 된다.’ ->이게 리다이렉트인듯.
뒤로가기를 두번 눌러도 그냥 만료된 페이지같은 게 나온다.


JSP주석

<!-- --> html주석 : 사용자가 확인을 할 수 있다. - 이걸 쓸 일이 거의 없다.
<%-- --%> jsp주석 : 이건 남들이 볼 수 없다. 사용자가 확일을 할 수 없다.
스크립트릿, 선언부는 자바코드라서 //주석처리가 된다. 이것도 사용자가 확인 할 수 없다.


JSP처리과정

브라우저->WAS-->a.jsp --> java로 변환 --> jsp로부터 자바 코드 생성 --> 컴파일 --> class파일

서블릿 = jsp에서 변환된 자바소스코드이다.
그래서 WAS가 컴파일을 해준다. 그러면 클래스파일를 만든다.

최초실행과 a.jsp과 변경되었을 때는 저기의 파란색의 순서로 시행된다.
다시 a.jsp를 요청하면(재요청) 바로 clss파일로 가서 그걸 들고 바로 실행한다. 처음 실행하면 서블릿으로 한다.

D:\am\kjw\web.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\04.20\org\apache\jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<%
	String str = "hi~";
%>
<title>Insert title here</title>
</head>
<body>
	<h1>Hello</h1><%= str %>
</body>
</html>
<%!
	private void todo() {
		System.out.println("todo");
	}

	private int num = 4;
%>

코드를 바꿨는데 결과가 바뀌지 않을 때

hello_jsp : 'jsp'를 '서블릿'(자바코드)으로 표현한 거. 엄청 길다.
jsp에서 에러가 났을 때 서블릿으로 변환된 부분에서 예외처리를 할 수 있는 경우가 있다.

정적데이터이기 때문에 css,HTML 걔들은 WAS가 인지를 못한다. 코드를 바꿨음에도 불구하고 결과가 바뀌지 않는 경우가 있다. -> 특히 파일을 외부로 꺼내놨을때!

1.그럴 경우에는 서블릿 파일을 지우고 다시 실행한다. 그러면 WAS가 다시 서블릿파일을 만들어준다. hello_jsp를 지워버려도 된다. 어차피 실행하면 다시 만들어진다.

2.브라우저에서 캐시도 삭제해야한다. 서블릿이 자바의 웹표준이다.

워크스페이스 : D:\am\kjw\web

D:\am\kjw\web.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost 이거를 바탕화면 바로가기 만들어놓기

jsp의 기본객체를 선언을 안해도 쓸 수 있다. 어떻게?

서블릿의 파일에 보면, jspService()의 파라미터에 HttpServletRequest를 넣어준다. 이걸 WAS가 넣어준다.(WAS가 request객체를 만들어 줌) 서블릿 파일의 메소드안에 기본객체가 있다.

서블릿은 세가지 메소드로 구성된다.
1.init() : 서블릿이 생성될 때 딱 한번만 호출됨.
2.destroy() : 그담은 삭제될 때
3.service() : 이 안에 request와 response가 들어가 있음.

  • 스크립트릿, 표현식, HTML -> jsp가 서블릿으로 변환될 때 service()메서드 안으로 들어간다.
    service메서드 안에 request와 response가 들어가 있어서 기본객체로서 사용할 수 있다.
    모든 jsp기본객체에 대해서
    선언, 정의가 들어가고 그 밑에 스크립트릿, 표현식, HTML 가 들어간다.
    그래서 jsp에서는 기본객체라는 애들을 사용할 수 있게 된다.

  • 선언부로 정의된 부분 -> 서블릿의 멤버변수로 등록되고, 서블릿의 메서드 등록된다. 얘는 서비스의 메서드에 들어가지 않는다.

결국 jsp라고 하는 것도 자바클래스의 일부분일 뿐이다.

출력버퍼와 응답

WAS의 출력버퍼라는 게 있는데 거기에 쓴다.
세칸짜리 출력버퍼가 있다면, class에서 출력버퍼를 하나씩 채우고 3칸이 차면 와스가 브라우저에 보낸다.
jsp가 실행된다는게 버퍼를 하나씩 채운다는 의미이다.

버퍼 저장 후 한꺼번에 브라우저에 전송할 때의 장점

1.데이터 전송 성능 향상
2.JSP 실행 도중에 버퍼를 비우고 새로운 내용 전송 가능
3.버퍼가 다 차기 전까지 첫번째 헤더 변경 가능

<설명>
2. JSP 실행 도중에 버퍼를 비우고 새로운 내용 전송 가능
버퍼가 있다는 얘기는 다이렉트로 바로 안간다는 의미. 버퍼가 있음으로 인해서 다이렉트로 전송 안된다.
버퍼라는 게 다 차야지 나간다.
그것때문에 flush()를 한다.
3칸중에 2칸이 찼을 경우에 아직 브라우저에 안나갔는데, 그때 그 안의 2칸의 내용을 없앨 수 있다.(수정할 수 있음)
버퍼안을 비울 수 있다. 중간에 취소가 된다.
그래서 flush()되기 전까지 그 안의 내용을 바꿀 수 있다.
출력버퍼에 잠깐 저장했다가 보낸다. 그래서 수정할 수 있다.

3.버퍼가 다 차기 전까지 첫번째 헤더 변경 가능
헤더는 '헤더'와 '라인'을 같이 말하는 거
응답헤더(응답코드가 들어간다)는 '첫번째 버퍼(a,b,c)'가 전송이 될 때 200번코드(정상)가 들어간다.
헤더값은 첫번째에만 전송이 되고 그다음에는 바디가 전송이된다. 헤더를 안읽고 바디만 읽어온다.
그러면 그 뒤(d,e)에 예외가 발생했을 때, 오류코드 500번이 날아가야 되는데 이미 헤더가 전송이 되었기 때문에 500번을 못 날린다.
응답코드의 문제가 생길 수 있다.
첫번째 버퍼가 전송되지 않았으면 우리는 정보를 변경할 수 있다.

페이지디렉티브를 통해서 버퍼크기를 지정할 수 있다. 를 알기.
버퍼는 안쓰면 8kb를 사용한다.

버퍼크기를 수작업으로 정해줘야 할 일이 생길 수도 있으니 원리를 이해하고 있어라.

출력버퍼는 respose 바디에 들어가는 것을 얘기하는 것이다.

웹 어플리케이션의 배포

다 만들어 졌을 때 어떻게 배포하는가?
EXPORT!!

와르~ 웹어플리케이션 배포할 때는 '.war'로 배포한다.

export source files : 체크 안하면 자바 파일이 아니라 클래스파일만 뽑아줌.
인위적으로 변경하는 걸 막기위해서 실행만 되게 클래스파일만 준다.

만든 파일을 톰캣설치된 폴더에 그 안에 'webapps폴더'에 만든 파일을(war형태의 zip파일)그대로 옮긴다.
그럼 배포완료된 것이다!

톰캣 폴더 안에 binary : startup.baet를 누르면 안의 폴더가 풀려있어서 서버가 읽을 수 있다.
결과값이 나온다.

웹어플리케이션 폴더 구성과 url매핑

http://localhost:8080/04_20/hello.jsp
D:\am\web\apache-tomcat-6.0.53\webapps04_20\hello.jsp

http://localhost:8080** : 얘만 치면 톰캣 홈페이지가 나온다.

이클립스에서 서버를 등록.

d:/tomcat
eclipse안에 tomcat-설정이 있다.(설정1번:8080번 설정2번:8180번을 만들 수 있다.)

실제 톰캣의 설정을 바꾸지 않고, 이클립스를 통해서 톰캣을 설정할 수 있다. 내가 선택해서 실행시킬 수 있다.
톰캣을 직접설정하면 1번했다가 다시 바꿔서 2번으로 하고 해야되는데,
이클립스는 논리적으로 설정을 여러개를 만들 수 있게 해준다.
이클립스에 등록된 서버중에 뭘로 선택할 지 하는 창이 나온다.

톰캣 폴더 안에 binary : shutup.bat 누르면 서버가 꺼진다...
이렇게 해도 안되면 작업관리자에서 꺼라.


여기서 4.20만 남겨두고 사용하기. 그게 좋다.


request.getContextPath()

request.getContextPath()
하면url에서 .../04.20/...만 들고온다.(폴더이름만 들고 오는 느낌.)


기본객체

기본객체
request, response, pageContext

out기본객체 : 스트림, write한다.

뭐 사용되는 곳이 있긴 한데..사실상 쓸모가 없다.
<useOutObject.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>
<%
	out.println("안녕하세요");	//사실상 쓸모가 없다. 
%>
<br>
out 기본 객체를 사용하여
<%
	out.println("출력한 결과입니다");
%>
</body>
</html>

<결과>

앞서 배운 출력버프는 'out의 버퍼'이다!!

pageContext기본객체⭐

pageContext 기본 객체는 JSP페이지와 일대일로 연결된 객체다 = jsp가 바뀌면 pageContext 객체도 바뀐다.중요!

기본객체구하기
기본객체메서드는 나중에 서블릿할 때는 기본객체가 없기 때문에 여기 있는 메서드를 사용한다는 것 같음.

우리가 보고 있는 request는 HttpServletRequest이다.
getRequest()가 들고오는 것은 ServletRequest이다.

ServletRequest <-상속관계 HttpServletRequest.
그럼 pageContext.getRequest()를 사용하려면 형변화해줘야한다!!

getServletContext()는 application이다.

profile
Hello :)

0개의 댓글