웅진씽크빅 스타터스 부트캠프/교육일지

유데미 스타터스 취업 부트캠프 3기 - 백엔드 7주차 학습 일지

할루솔이 2023. 1. 8. 16:25
반응형

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

 

 

 

-서블릿 요청 방식

  1. 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 세션타임아웃 설정 시간

  1. web.xml 브라우저 열고 30”분” 대기 =>아무 액션 없으면 세션 자동 종료(다른 서블릿과 값 공유 X) 
    -서블릿 내부 값 지속
  2. forward시에 2개 서블릿 값 공유(다른 서블릿과 값 공유 O)
    request.setAttribute() / getAttribute()
  3. 동일 브라우저(동일 클라이언트) 실행 여러 서블릿 값 공유 (다른 서블릿과 값 공유 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>

  1. 링크 클릭하면 이동
  2. 파라미터 공유 불가
  3. 자바 객체 해석 불가/객체 정보 공유 불가

 

 

 

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기 백엔드 과정 학습 일지 리뷰로 작성되었습니다.

반응형