본문 바로가기

JavaWeb

java web_1017

<form action="/login" method="get">
	<input type="text" name="id">
	<input type="password" name="pw">
	<input type="submit" value="로그인"><button type="reset" value="다시입력"/>다시입력
</form>

입력서식을 통해 get방식으로 요청하면 화면단의 사용자 입력값(parameter) 전송과 함께 요청을 처리하는 컨트롤러 호출

http://localhost:8080/login?id=ididid&pw=1234

*이후에 db연동도 함께 하면 화면에서 받아온 입력값을 가지고 쿼리 작업 후 반환값을 화면에 전달해서 보여줄 수 있음

여러개의 값 전송 후 getParameterValues()로 배열에 담아 param 값 확인

*uri 문자열 copy하면 http://localhost:8080/reqTest?id=id&pw=23&subject=%EC%9E%90%EB%B0%94&subject=c%EC%96%B8%EC%96%B4&subject=jsp 이런식으로 나오는데 이때는 decodeURI("http://localhost:8080/reqTest?id=id&pw=23&subject=%EC%9E%90%EB%B0%94&subject=c%EC%96%B8%EC%96%B4&subject=jsp")로 디코딩해주면 아래와 같이 확인 가능

> 'http://localhost:8080/reqTest?id=id&pw=23&subject=자바&subject=c언어&subject=jsp'

<form action="/reqTest" method="get">
    아이디 : <input type="text" name="id"><br>
    비번 : <input type="text" name="pw"><br>
    <input type="checkbox" name="subject" value="자바" checked="checked">자바
    <input type="checkbox" name="subject" value="c언어">c언어
    <input type="checkbox" name="subject" value="jsp">jsp
    <input type="checkbox" name="subject" value="안드로이드">안드로이드<br>
    <input type="submit">전송
    <input type="reset">초기화
</form>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String id = req.getParameter("id");
    String pw = req.getParameter("pw");
    String[] arr = req.getParameterValues("subject");
    for(String a : arr) {
        System.out.println(a);
    }
}

 

> 서블릿 응답 처리 방법 :: javax.servlet.http.HttpServletResponse객체 사용

* 클라이언트와 서블릿 통신은 자바 I/O의 기능인 스트림을 이용(setContentType()을 이용해 클라이언트에 전송할 데이터 종류 MIME-TYPE 지정) 

> 서버에서 브라우저로 데이터를 전송할 때는 어떤 종류의 데이터를 전송하는지 알려주어야 함 

- HTML로 전송시 : text/html  

- 일반 텍스트 : text/plain

- XML 데이터 : application/xml 

@WebServlet("/reqTest2")
public class ReqTest2 extends HttpServlet{
	@Override
	public void init(ServletConfig config) throws ServletException {
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html; charset=utf-8");
		PrintWriter out = resp.getWriter();
		String id = req.getParameter("id");
		String pw = req.getParameter("pw");
		
		String data ="<html>";
			data += "<body>";
			data += "아이디 : " + id;
			data += "<br>";
			data += "비번 : " + pw;
			data += "</body>";
			data += "</html>";
			out.print(data);
	}
}

'http://localhost:8080/reqTest.html'   > get 요청

'http://localhost:8080/reqTest2?id=responseTestID&pw=1234&subject=자바&subject=jsp&subject=안드로이드'  > get응답

**print write stream :: 문자기반 출력 스트림 / print stream :: 바이트 기반 출력 스트림

==========================================================================================

웹브라우저 < 서블릿으로 데이터 전송 (GET/POST)

GET :: URL주소에 데이터를 ?name = value 형태로 붙여서 전송하는 방식 / 조회시 사용

POST :: TCP/IP의 header부분에 데이터를 숨겨서 전송 / 파일 전송시에는 필수적으로 post 사용

> 자바스크립트로 서블릿에 요청하기 :: 전송 데이터에 대한 유효성 검증할때 주로 사용 / JS함수 호출 후 유효성 검사 후 함수에서 서블릿에 요청

// js
<script>
 	function fn_validate(){
 		let frmLogin = document.frmLogin;
 		let id = frmLogin.id.value;
 		let pw = frmLogin.pw.value;
 		
 		if((id.length == 0 || id == "") || (pw.length == 0 || pw == "")){
 			alert("아이디/비번 미입력")
 		}else{
 			frmLogin.method = "post";
 			frmLogin.action = "/reqTest3";
 			frmLogin.submit();
 		}
 	}
 </script>
 
 // 화면
 <body>
	<form action="/reqTest3" method="post" name="frmLogin" enctype="utf-8">
		아이디 : <input type="text" name="id"><br>
		비번 : <input type="text" name="pw"><br>
		<input type="hidden" name="address" value="주소샘플">
		<input type="submit">전송
		<input type="reset">초기화
	</form> 
</body>

// Controller
@WebServlet("/reqTest3")
public class ReqTest3 extends HttpServlet{
	@Override
	public void init(ServletConfig config) throws ServletException {
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html; charset=utf-8");
		System.out.println("post왔당");
		System.out.println(req.getParameter("address")); 
	}
}

> post 요청시 post 처리해줄 화면을 먼저 그려주고 script 수행(controller 호출)  

>>> 요청에 대한 응답은 사용자 입력값에 따라 화면을 구현하는 기능 ***** 매우 중요!

========================================================================6장 끝

> 서블릿 비즈니스 로직 처리  :: 서블릿이 클라이언트로 부터 요청을 받으면 해당 요청에 대한 작업 수행 후 클라이언트에 결과 전송하여 화면에 보여줌 >> CRUD 서블릿(컨트롤러) 핵심 기능

*SQL 문으로 DB에 접근해서 작업 후 클라이언트에 통신

스프링을 해보고 나서 다시 이 책을 보면 스프링이나 마이바티스가 얼마나 편리한지 새삼 느끼게 됨... 감사하며 쓰자..

DB관련해서는 교재 읽으면서 내용 정리했으니 뒤에 마이바티스 쪽에서 더 연습하는 걸로 하고 바로 8장 서블릿 확장 API사용으로 넘어감~~ 안녕 ~~

> 포워드 / 바인딩 / 어노테이션 

포워드 :: 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법 / 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 함 / 요청에 포함된 정보를 다른 서블릿과 JSP에게 공유 및 전달 가능

>> 요청을 공유/전달 할때 추가 데이터를 포함시켜서 함께 공유/전달 함  

보통 post 방식을 통해 요청을 공유하기 때문에 dispatch 방식은 넘어가고 get요청에서 자주 쓰이는 방식만 정리해도 될듯

js >> location.href = '요청할 서블릿 또는 jsp'; / a 태그 href 속성 = '요청 주소';

Servlet Context 클래스 사용법

 Servelt Context :: 톰캣 실행 시 각 컨텍스트(=웹 애플리케이션=프로젝트) 마다 한개의 Servlet Context 객체를 생성함 / 웹 애플리케이션이 실행되면서 애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩하여 서블릿들이 공유해서 사용함

> 톰캣 종료 시 소멸됨 (톰캣으로 프로젝트 실행하는 동안 컨트롤러들끼리 공통 자원 공유)

========================================================================7, 8장 끝

> 쿠키/세션 을 이용한 웹 페이지 연동 기능 

세션 트래킹 :: 무상태성(=비연결성)을 탈피하기 위한 방법/  HTTP프로토콜로 통신하는 각각의 웹 페이지들은 서로 어떤 정보도 공유하지 않기 때문에 개발자가 별도로 세션 트래킹이라는 웹 페이지 연결 기능을 구현해야 함 

- <hidden> 태그 :: HTML의 hidden태그를 이용해 웹 페이지들의 정보 공유 == 폼에 의한 파라미터 처리 

쿠키 :: 클라이언트 pc(=사용자 pc)의 cookie 파일에 정보 저장 후 웹 페이지들끼리 공유함(도메인당 한개 생성)

> 주로 세션 쿠키를 통해 사이트 접속 시 session 유지할 때 사용 / 브라우저 메모리에 생성하고 브라우저 종료시 소멸

> 웹사이트 최초 접속 시 쿠키 생성하여 클라이언트에 전송 > 브라우저는 쿠키를 파일로 저장함 > 이후 재접속 시 서버가 브라우저에 쿠키 전송을 요청하면 브라우저는 쿠키 정보를 서버에 전송하고 서버는 쿠키를 이용해 작업함 ex) 팝업창 해제

세션 :: 서버 메모리에 정보 저장 후 웹 페이지 간 서로 공유/ 재입장 시 다시 서버에 보여주는 출입증과 같은 것 

ex) 로그인 상태, 장바구니 담기

> 브라우저당 한개의 세션 아이디가 생성됨 / 세션의 기본 유효시간 30분 

> 서블릿에서 생성된 세션 id는 브라우저로 전송되어 세션 쿠키에 jsessionID라는 이름으로 저장되어 있음 

 

+ 세션을 이용한 로그인 정보 바인딩 실습부터 이어하기 

로그인 상태와 같은 사용자 관련 정보를 바인딩해서  사용할 때는 세션을 이용하는 것이 편리함  >세션은 사용자 당 한개씩 생성되기 때문 (톰캣 종료 후에도 세션이 메모리에 남아있는 경우가 있기 때문에 세션 저장 기능 비활성화해줄 것 -> 톰캣 context.xml에 있는 <Manager pathname="" /> 주석 해제)

>> 브라우저에서만 사용하는 정보를 세션에 바인딩하여 사용하면 편리함

'JavaWeb' 카테고리의 다른 글

java web_1014  (0) 2022.10.14
java web_1013  (0) 2022.10.13