웅진씽크빅 스타터스 부트캠프/강의 내용 정리

23.01.04 Servlet

할루솔이 2023. 1. 4. 18:36
반응형

<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”) 필요.
1. 변수명=값
2. &연결한다
3. 영문, 숫자 그대로 전송한다.
4. 한글, 특수문자 인코딩
5. %16진수2자리%16진수2자리 → 한글 1문자 표헌(16진수2자리가 1바이트)
6. url 공백 허용하지 않는다.
7. 공백은 ‘+’ 기호로 변경된다.
8. 그럼 1+2같은 실제 +기호는 %2b로 변경되어 들어간다.
1. 변수명=값
2. &연결한다
3. 영문, 숫자 그대로 전송한다.
4. 한글, 특수문자 인코딩
5. %16진수2자리%16진수2자리 → 한글 1문자 표헌(16진수2자리가 1바이트)
6. url 공백 허용하지 않는다.
7. 공백은 ‘+’ 기호로 변경된다.
8. 그럼 1+2같은 실제 +기호는 %2b로 변경되어 들어간다.

 

서블릿에서

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 - 자바 예외 발생한 경우

 

반응형

'웅진씽크빅 스타터스 부트캠프 > 강의 내용 정리' 카테고리의 다른 글

23.01.10 JSP(el, jstl, foreach,....)  (0) 2023.01.10
23.01.09 JSP(액션태그)  (0) 2023.01.09
23.01.06 JSP  (0) 2023.01.06
23.01.05 Servlet, Cookie, Session  (1) 2023.01.05
22.12.26 SQL-DML 학습  (0) 2022.12.26