<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 |