7주차에 배운 내용 정리 및 복습하기!
<form action=”abc1” method=”get/post”>
HttpServlet 클래스에 포함되어있음. 상속받아서 서블릿 오버라이딩 할 수 있음
doGet | HttpServlet 오버라이딩 |
doGet | HttpServlet 오버라이딩 |
init | 서버 시작 후 최초 서블릿 실행시 1번만 |
destroy | 서블릿 객체 메모리 삭제시 = 재컴파일 또는 서버 종료시 |
package test;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/flow")
public class FlowServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
System.out.println("1.init 호출");
}
public void destroy() {
System.out.println("n.destroy 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("n.doGet 호출");
}
}
1, n 나오고 수정 후 저장하면 몇 초 지나서 destroy나옴
매핑된 서블릿 확인 가능
그러니까 다른 파일들은 저기 /a,/b,/flow는 제외한 다른 이름으로 해줘야함!!!!
💡 protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {**
⇒
서블릿 객체 생성 - init 호출
doGet 호출(요청정보객체, 응답정보객체 생성)
요청 - HttpServletRequest 객체 api가 가지고 있음.
req.getRemoteAddr(); ⇒ 나한테 요청을 보낸 상대(클라이언트) ip를 알 수 있다.
req.getParameter(”id”); ⇒ 클라이언트가 전송했던 id의 이름을 가진 정보를 달라.
처리
응답 - HttpServletResponse 객체 api가 가지고 있음.
java.io.PrintWriter out = resp.getWriter();
⇒ out객체를 통해 결과물 내보냄. out.println(”서버가 클라이언트로 전송할 내용=처리결과=응답”)
protected, public 가능, private은 안됨.**
클라이언트 요청 보낸다.(http://ip:port/컨텍스트명/a?id=java&pw=1111)
?이후는 전송하는 값, 값이 여러 개인 경우 &로 연결
서버는 요청 받는다.
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/request")
public class RequestTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getContextPath());
System.out.println(request.getMethod());
System.out.println(request.getRequestURI());
System.out.println(request.getServletPath());
System.out.println(request.getRemoteAddr());
PrintWriter out = response.getWriter();
out.println("<h1>hello output</h1>");
out.println("<script src='/"+
request.getContextPath()+"/jquery-3.6.1.min.js'>hello output2</script>");
}
}
request.getContextPath(): 현재 서블릿이 동작하고 있는 웹프로젝트 이름- servlettest
request.getMethod(): 서블릿의 메서드- GET
request.getRequestURI(): 서버 ip와 포트번호를 제외한 나머지- servlettest/request
request.getServletPath(): 설정했던 서블릿 매핑 이름- /request
request.getRemoteAddr(): ip v6방식 0:0:0:0:0:0:0:1
out.println("<script src='/"+ request.getContextPath()+"/jquery-3.6.1.min.js'>hello output2</script>");
경로 앞에 /로 시작하면 포트번호까지 알려줌.
대신 현재 프로젝트 이름이 아리까리한 경우 저렇게 request.getContextPath() 넣어주기!
위 내용들은 콘솔에 출력.
아래 2개는 페이지에서 출력. 대신 페이지 소스보기를 해야 스크립트 태그 확인 가능함
한글 깨짐
인코딩 필요. 인코딩 먼저 하고 Writer생성해야 함. 순서 바뀌면 안 됨.
성공!!!!!!!!!
서블릿 url표시할 때 => "/a": 현재 컨텍스트명까지 생략 http://localhost:8080/servlettest/a
html태그 속성 url => "/a": 포트번호까지 인식. http://localhost:8080/a 라는 의미
/가 들어가면 컨텍스트 명까지 써주고 없으면 loginprocess이름만 써주기
<form action="http://localhost:8080/loginprocess"> 절대경로말고
<form action="loginprocess"> 상대경로 사용하기
프로젝트 배포하는등 경로가 바뀌면 절대경로 사용 어려워짐
select multiple 속성이 true일 때, input타입이 checkbox일 때!!!!!!!!
String title[] = request.getParameterValues("title");
//getParameterValues: 배열
<select name="title" multiple="true">
<option>웹클라이언트 과정</option>
<option>웹서버 과정</option>
<option>데이터베이스 과정</option>
<option>서비스배포 과정</option>
</select>
String title[] = request.getParameterValues("title"); //getParameterValues: 배열
response.setContentType("text/html;charset=utf-8"); // 인코딩 필요
PrintWriter out = response.getWriter();
out.println("<h1>" + id + " 회원님 환영합니다.</h1>");
out.println("<h1>" + pw + " 암호를 입력하셨습니다.</h1>");
for(String t:title) {
out.println("<h1>" + t + "을 선택하셨습니다.</h1>");
}
get방식: 주소창에 정보 다 보이게 전송
<form action="/servlettest/loginprocess" method="get">
post방식: doGet을 doPost로 수정해야 오류 안남
<form action="/servlettest/loginprocess" method="post">
-서블릿 요청 방식
- http 프로토콜 정의 방식
get | post |
-url 뒤 요청입력데이터를 전송한다. - 요청입력데이터가 모두 보인다. - 암호 보안 요구 데이터가 있을경우에는 get은 지양한다. - url?name=value&…. ⇒기본 방식 - url 뒤 길이 제한있다. - 250자 - 파일 업로드 전송 불가하다. - 서블릿의 doGet메서드 필요하다. get요청만 받아서 처리한다. |
-url 별도로 분리해서 요청 입력 데이터를 전송한다. -url에 정보가 보이지 않는다. - 암호 전송할때 post 사용 - form metho=post 지정 필수 - 파일 전송 가능 - 서블릿의 doPost 메서드는 post요청만 처리한다. - request.setCharacterEncoding(”utf-8”) 필요. |
서블릿에서
request.setCharacterEncoding("utf-8"); // post방식일 때만 필요!!! get일 때는 필요 없음
요청 - get 서블릿 - doGet
요청 - post 서블릿 - doPost
요청 - get 서블릿 - doPost ⇒ http 405 error code
요청 - post 서블릿 - doGet ⇒ http 405 error code
405error ⇒ 위 내용처럼 요청방식이 잘못되었다는 것!!!!!
-http오류코드
404 | 요청 파일이 서버 내부에 없을 경우 확인: url/컨텍스트명/서블릿url매핑명 |
405 | <form method=”get” → doPost 메서드만 존재 <form method=”post” → doGet 메서드만 존재 |
500 | 문제가 일어날 수 있는 상황은 많다. 에러코드를 잘 읽어봐야 함. 서버실행파일-servlet,jsp - 자바 예외 발생한 경우 |
서블릿 확장 api 사용
서블릿의 기본 api는 HttpServelt → doGet/doPost
HttpServletRequest / HttpServletRsponese
총 3개
다른 파일 이동 방식(html/js)
form은 입력한 내용을 가지고 이동하는 것이고
아래 2개는 그냥 이동만 하는 것.
<a href=””>이동</a>
location.href=” ”
다른 파일 이동 방식(Servlet)
@WebServlet(”/a”)
doGet(HttpServletRequest request, HttpServletResponse response){
1. html문서 출력
response.setContentType(”text/html;charset=”utf-8”); ⇒ html 문서를 하나 생성 후 문서 내부에 원하는 결과물을 출력해 줌
response.getWriter()/println(””);
2. www.google.com 사이트 자동 응답
response.sendRedirect(”http://www.google.com”); ⇒ 호출해서 이동만
3. 현재 웹어플리케이션 내부의 다른 서블릿 호출 ⇒ 1개의 요청을 처리하기 위해서 2개 이상의 서블릿이 응답해주기 위해 열심히~!~
RequestDispatcher dis = request.getRequestDispatcher(”현재 서버, 현재 웹어플리케이션에 존재하는 파일명”);
dis.forward(request, response);
request.getMethod();
request.getParameter();
여기서는 값 불러올 수 있음. 2번에서는 불가
forward 예제 실습
package forward;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/forward1")
public class ForwardTest1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("id");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<h1>" + id + "회원님 반갑습니다.</h1>");
}
}
url에 ?id=hihi 내용 추가 후 엔터를 눌러주면!
이렇게 나온다.
위 코드에 아래 코드를 추가해주면
request.setAttribute("upperid", id.toUpperCase()); //추가할 정보가 있으면 사용
out.println("<h1>" + request.getAttribute("upperid") + "회원님 반갑습니다.</h1>");
대문자로 변환된 ID 확인 가능~.~
(여기서 자바 기억 되살려보기! => 인터페이스는 객체 생성 불가하다.)

forward1과 forward2를 사용해서 출력해보는 예제
forward1에서 id 입력하면 저렇게 나온다.
화면에 보여주는 건 forward2가 해주는 것!!!!!!
forward2 reqeust에는 setAttr 했던 upperid값이 들어있어서 그래서 대문자 나온다고 한다~
forward 실행 전에 출력 문장을 넣으면
무시당한다~~!
쿠키와 세션
쿠키 | 세션 |
상태정보 유지 ⇒ 클라이언트측에 저장 웹브라우저,OS에 종속적 파일형태/ 서버 종료시/ 브라우저 종료시 없어짐 텍스트만 저장 가능(자바 객체 저장 불가) 정보들은 확인 가능(암호화 되어있다) servlet에서 쿠키 사용하려면 Cookie클래스로 사용하면 됨. |
상태정보 유지 ⇒ 서버측에 저장 서버 실행동안 메모리 저장하고 서버 종료시 없어짐 자바 객체 저장 가능 HttpSession 클래스 사용 |
장바구니, 로그인사용자(MemberDTO) ⇒ 세션
방문 횟수, 최근방문날짜 ⇒ 쿠키(보여도 되는 정보들이니까!!!!!!!!!)
HttpSession
-tomcat web server 세션타임아웃 설정 시간
- web.xml 브라우저 열고 30”분” 대기 =>아무 액션 없으면 세션 자동 종료(다른 서블릿과 값 공유 X)
-서블릿 내부 값 지속 - forward시에 2개 서블릿 값 공유(다른 서블릿과 값 공유 O)
request.setAttribute() / getAttribute() - 동일 브라우저(동일 클라이언트) 실행 여러 서블릿 값 공유 (다른 서블릿과 값 공유 O)
session.setAttribute() / getAttribute()
브라우저 닫고 바로 mypage 다시 들어가면 null이 보인다.
브라우저 닫으면 세션도 닫히니까 그런 것!
로그인하고 바로 주소창에 mypage입력해서 들어가면 아이디 확인 가능!
session.removeAttribute("sessionid"); ⇒ 특정 session하나만 없애줌
session.invalidate() ⇒ 즉시 세션 삭제
session.setAttribute() / getAttribute() / removeAttribute
LoginSessionServlet | 로그인- 세션- 저장 |
LogoutServlet | 로그아웃- 세션 삭제 |
MyPageServlet | 로그인- 세션 추출 |
BankServlet | 5분 유효 |
HttpSession 공유 | 동일 브라우저 내부 실행 |
HttpSession 공유X | 서로 다른 브라우저 내부 실행 |
@WebServlet("/boardwriting/*")
⇒ http://ip:port/servlettest/login/#$@#%$^#$
login까지 경로만 맞으면 뒤에 어떤 경로가 오든 상관없다는 의미!!!!!!!!!
a, b,.. 어떤 내용이 들어가도 동일하게 LoginSessionServlet 보여줌
URL: Uniform Resource locaion 주소 전체를 다 포함하고 있는 것
URI : 해당 서버 내부의 경로만 포함
요청 url → url분석(Controller)
dao, dto리턴/컬렉션 리턴(model)
보여줄 화면(view)
⇒ MVC
a태그 특징
<a href=”a.html”>다른파일이동</a>
- 링크 클릭하면 이동
- 파라미터 공유 불가
- 자바 객체 해석 불가/객체 정보 공유 불가
version을 3 밑으로 설정해두면 web.xml이 기본 파일로 설정된다.
3 위로 설정하면 WEB-INF밑에 web.xml 안 보인다.
대신 우클릭-javaEE tools-Generate…클릭하면 WEB-INF밑에 web.xml 만들어짐
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>spring 회원님 환영합니다</h1>
<% String id = request.getParameter("id"); %><!-- id값 불러오기 -->
<h1><%=id %> 회원님 환영합니다.</h1>
</body>
</html>
get방식으로 id넣어주면 확인 가능
-디렉티브태그=지시자태그=tomcat 지시 내용 정의
<%@ page import=”java.util.Date” contentType=”text/html;charset=utf-8” %> |
현재 jsp페이지 여러 설정 import java.util.Date … class 서블릿 response.setContentType(text/html;charset=utf-8); |
<%@ include file=”a.html” %> | 다른 파일 포함해서 실행 - 재사용 <jsp: include… |
<%@ taglib.. %> | 표준 jsp 태그(jsp표준단체에서 정한 태그) 외 다른 단체에서 개발한 태그 모음 사용 jstl library |
Date객체를 사용하려면 <%@ %> 태그 안에 Date import 해줘야 함!
자동 import 시키려면 ctrl+스페이스바 누르고
하나 클릭하면
뾰로롱~
위 코드 결과물
객체공유
setAttribute(””,객체) | 공유객체 저장 |
getAttribute(””) | 공유객체 조회 |
removeAttribute(””) | 공유객체 삭제 |
에러 페이지(error-page)
<%@ %> 태그 내부에 에러가 난다면 어떤 페이지를 보여줄 건지 작성해줌!
나는 에러가 생기면 e.jsp를 보여준다고 했으니 e.jsp 태그 내부에 isErrorPage="true" 작성!!!
저 코드를 적어줘야 아래 <%=exception> 오류가 생기지 않는다!
web.xml을 열어서 살펴보면 여러 가지 <welcom-file>태그를 확인할 수 있는데
아래에 <error-page>태그를 새로 작성해 준다.
<error-code>404</error-code> : 404에러를 만나면
<location>/error/e404.jsp</location> : e404.jsp를 보여줘라!!!
벌써 7주차라니!!!!
항상 일지를 작성할 때 시간의 흐름을 실감한다ㅠㅠㅠ
이번주는 서블릿과 jsp 배웠는데 이해가 되다가 하나도 모르겠다가 무한반복이다..
앞으로는 이해 안 되는 내용을 중점적으로 정리를 하면서 용어 정리도 같이 해보려고 한다!!
8주차 아자아자아자아아악~!~!
——————————————————————————
* 유데미 바로가기 : https://bit.ly/3V220ri
* STARTERS 취업 부트캠프 공식 블로그 보러가기 : https://blog.naver.com/udemy-wjtb
본 후기는 유데미-웅진씽크빅 취업 부트캠프 3기 백엔드 과정 학습 일지 리뷰로 작성되었습니다.
'웅진씽크빅 스타터스 부트캠프 > 교육일지' 카테고리의 다른 글
유데미 스타터스 취업 부트캠프 3기 - 백엔드 9주차 학습 일지 (0) | 2023.01.20 |
---|---|
유데미 스타터스 취업 부트캠프 3기 - 백엔드 8주차 학습 일지 (0) | 2023.01.15 |
유데미 스타터스 취업 부트캠프 3기 - 백엔드 6주차 학습 일지 (0) | 2023.01.01 |
유데미 스타터스 취업 부트캠프 3기 - 백엔드 5주차 학습 일지 (0) | 2022.12.25 |
유데미 스타터스 취업 부트캠프 3기 - 백엔드 4주차 학습 일지 (0) | 2022.12.16 |