티스토리 뷰

KH

230413 (Servlet_2)

十月 2023. 4. 13. 17:52

Servlet

https://tomcat.apache.org/

Tomcat 9 Software Downloads

64-bit Windows zip (pgp, sha512) 다운로드 (dev에 넣기)


컴파일 : 사용자의 명령어를 컴퓨터 언어로 바꿔주는 과정

ex) 자바 파일을 실행(클래스) 파일로 만들어 주는 것

 

Targer runtime

Apache - Apache Tomcat v9.0 - 압축 푼 폴더 선택

 

build path

컴파일 된 것을 저장할 경로

src\main\webapp\WEB-INF\classes

 

WEB-INF : 서버가 관리하는 폴더

:: 어차피 클래스 파일을 서버가 구동시키기 때문에

서버가 관리하는 폴더인 WEB-INF 아래에 저장

≫ 서버가 파일을 빠르게 찾아 효율적으로 실행 가능

 

Context root : 애플리케이션에 접근하는 경로

≫ 프로젝트 시에는 프로젝트 명이 들어가야 함


서버 목록에 이름 만들어 추가하기

≫ Server name은 목록에 들어갈 서버 이름

 

서버 연결 됐는지 확인하는 방법

프로젝트명 오른쪽 마우스 클릭 → Properties - Project Facets - Runtimes - ServletServer 체크 확인

 

크롬으로 실행되도록 웹 브라우저 설정


어떤 프로그램을 실행시키려면?

:: ip주소와 port 번호 필요 (Context path)

≫ 8080은 해당 port 번호


≫ WEB-INF는 서버가 관리하는 폴더이므로

그 안에 Web.xml을 넣어 더 효율적이고 빠르게

전반적인 설정을 관리할 수 있도록 되어 있다.


프로젝트 자체로 실행을 했더니, 해당 주소는 위의 주소와 조금 차이가 있다.

 

≫ 맨 마지막 index.html이 없음

 

web.xml 파일을 열어보면,

≫ 애플리케이션 실행 시, 서버에 있던 웰컴 파일 리스트 설정을 보고 index.html이 실행된 것

≫ 콕 집어서 index.html 를 실행한 것과 차이가 있다.


서블릿이란, 웹 서비스를 위한 자바 클래스

// 자바를 상속해 만든 웹을 만들기 위한 기술

≫ java파일에 웹 페이지 구현을 위한 html이 들어간 구조

≫ html을 변경하면 java 파일을 변경한 것이기 때문에 재 컴파일 해야 하는 게 단점

-구현 규칙 : 클라이언트 요청을 처리 후 결과를 HTML을 사용하여

 요청에 대한 응답을 다시 클라이언트에게 전송


GET 방식

// URL에 변수(데이터)를 포함시켜 요청하는 것

≫ 보안 유지가 불가능하여 로그인 같은 경우 get방식은 부적합

≫ header에 들어가 길이 제한 有, 초과 데이터 절단, 캐싱 가능

≫ get방식에서 데이터를 header에 포함하여 전송하는데

 body는 보통 빈 상태로 전송되며 header 내용 중 body의
 데이터를 설명하는 content-type헤더필드도 들어가지 않는다.

 

 

데이터를 적어서 submit을 했으나,

?

폼 태그에 action을 쓰지 않아 데이터를 보내는 곳이 현재 페이지로 설정되어

원하는 곳으로 데이터가 전송되지 않는다. (새로고침 처럼 보임)

 

action 속성을 이용해 입력받은 데이터를 보내기

.do는 없어도 상관 없음

 

폼 태그 속성 설정 후 다시 데이터를 입력해서 전송

 

404 : PageNotFound

≫ 404 에러가 뜨면 경로 지정을 꼭 체크

≫ test.do가 없기 때문~~


url을 처리할 수 있는 서블릿 만들기

먼저 action에서

1)

<form action="/test1.do">

context root에서 test.do를 바로 실행하고 싶으면 '/' 입력

≫ 폼 태그 속성 action에서 '/' 쓰는 것은 context root 보다 앞을 이야기 함

≫ 어떤 url을 만들어서 보낼 지 정하는 것은 내 몫!

 

2)

<form action="/purpleApple/test1.do">

≫ context root 뒤에 바로 요청 파일이 오도록 만듦


≫ java 폴더에 새로운 Class 생성

 

서블릿은 HttpServlet 클래스를 상속 받아야 해당 역할을 할 수 있다

test1.do url 요청 했으면 처리할 서블릿 지정을 해 주어야 일을 한다! → 서블릿 매핑

서블릿 매핑 방법 두 가지) web.xml 지정 / @annotation

 

@annotation을 더 많이 사용

(web.xml은 설정 정보 전체가 들어있어서)


web.xml으로 들어가서 설정하기

<servlet>과 <servlet-mappint>은 짝꿍

<servlet-name> : 배포 명 → 서로 짝꿍인 것을 알 수 있게 한다.

<url-pattern> : 받아올 클라이언트 요청 주소


 

 

ip주소:포트번호/contextPath/servlet/testServlet1.html

 

1)

action="test1.do"

 → action에 들어가는 값에 '/' 가 안 붙어 있으면 가장 마지막 부분만 변경

 결과 ≫ ip주소:포트번호/contextPath/servlet/test1.do

비슷한 경우로 action = "req/test1.do"

 결과 ≫ ip주소:포트번호/contextPath/servlet/req/test1.do

 

*web.xml의 servlet-mapping 태그의

 하위 태그인 url-pattern에는 앞에 contextPath가 생략

 ≫ /servlet/req/test1.do

 

2)

action="/test1.do" (/는 context path보다 앞을 의미)

 → action의 맨 앞에 '/' 가 들어감 → contextPath보다 앞으로 이동(contextPath 빠짐)

 결과 ≫ ip주소:포트번호/test1.do

만약 contextPath를 넣고 싶다면

action="/contextPath/test1.do"

 결과 ≫ ip주소:포트번호:contextPath/test1.do

 

*web.xml의 servlet-mapping 태그의

 하위 태그인 url-pattern에는 앞에 contextPath가 생략

 ≫ /test1.do

 



실행 순서

1. 서버를 구동시키면 서버가 먼저 web.xml을 찾음

2. 그 안에 welcome-file list 를 가서 처음 실행할 화면을 찾아 띄움

3. 띄운 화면에 값 넣고 확인한 순간 action 실행 (요청을 보냄)

4. 서블릿 컨테이너가 요청 받음

5. url 패턴이랑 들어온 요청의 매핑이 같으면 같은 배포명을 찾음

6. 실행할 실제 Sevlet 클래스를 확인 후 실행시킴

 

+)

web.xml이나 TestServlet1.java는 백 단이기 때문에 변경 시 아예 재 실행

.html 같은 화면 단은 변경 사항이 있어도 새로고침만 하면 된다


이제부터 아주 중요!

1) HttpServletRequest(요청 처리)

name은 진짜 변수가 아니기 때문에 여러 개 들어갈 수 있음!

서버를 재실행 후 확인했더니,

≫ 화면에서 입력했던 값이 제대로 출력된다.

 

하지만, food는 중복 선택인데 하나만 출력됨.

≫ getParameter()는 가장 처음 값만 가지고 온다.

 

따라서 이럴 때는 getParameterValues()를 사용한다.

왜냐, 반환 타입이 String[] 이기 때문에 여러 개를 담을 수 있어서!

 

 

2) HttpServletResponse(응답 화면)


POST 방식

// URL에 변수(데이터)를 노출하지 않고 요청해 보안 유지가 가능

≫ body에 데이터가 들어가 전송 길이에 제한 없음

≫ 최대 요청받는 시간이 존재 → 페이지 요청, 기다리는 시간 있음

≫ URL에 데이터 노출이 안 돼 즐겨찾기, 캐싱이 불가능

 

서블릿을 만들고 GET 방식 요청을 처리했던 것처럼 진행했는데, 콘솔 출력 결과가 글쎄?

≫ 외계어가 나왔다! 이건 어떻게 해결해야 할까...

 

post 방식으로 값을 가져오려면 데이터를 받아오기 이전에 request에 대한 인코딩을 해 줘야 한다. 

≫ 이클립스 워크스페이스 인코딩과는 별개로, post방식으로 들어오는 요청에 대한 인코딩이라 아예 다른 개념

 

 

request.setCharacterEncoding("UTF-8");



서블릿 제대로 구현하기

// 서블릿은 화면에 표현될 html코드를 프로그램적으로 작성

≫ 단점은 비즈니스 로직과 화면 구현 디자인이 같이 있어 가독성이 떨어지고 개발이 어렵다.

≫ html파일 수정 시 서버를 재시동해야하고 html에는 서버에서 얻어온 정보를 동적으로 반영하기 힘들다.

 

HTML → 정적 데이터

JSP → 동적 데이터 (동적 페이지를 만들 수 있다)

 

1)

testServlet1.java / testServlet2.java 같은 경우,

서블릿 클래스 한 공간에서 요청 처리, 응답 화면을 함께 구현했다.

≫ 코드가 복잡하고 가독성이 떨어지며, 협업에도 효율성이 떨어짐.

 

2)

따라서 view(결과 페이지)가 따로 나올 수 있게 jsp 파일을 생성

결과 화면이 나올 jsp 파일을 따로 분리해 준다

 

그러면 받아온 데이터를 넘기는 동시에 어디서 데이터를 받을 것인지에 대한 응답 페이지 지정 여부를 알려줘야 한다.

원래는 request , response를 한 곳에서 처리했으나,

response 서비스는 응답 페이지로 넘길 것이기 때문에

또 한 번 요청이 들어가야 한다. (jsp가 응답 처리 위임받음)

 

≫ request(요청 처리) 후,

 결과 처리를 위임한 페이지에서 응답을 받기 위해 jsp 페이지로 한 번 더 request!

 

jsp는 브라우저만 새로고침해도 원하는 결과를 얻을 수 있다!

 

1) request - request(응답 위임 받은 jsp 페이지로)

 

2) jsp에서 요청 처리를 받아 응답


 

 

 

'KH' 카테고리의 다른 글

프로젝트 관련 수업  (0) 2023.04.18
230414 (JSP & EL_JSTL)  (0) 2023.04.14
230413 (Servlet)  (0) 2023.04.13
230410 (jQuery)  (0) 2023.04.10
230405 (JavaScript_4)  (0) 2023.04.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함