Servlet

Servlet_개념

climb-up 2022. 4. 20. 22:51

서블릿 개념
: 서블릿이란, 웹 서비스를 위한 자바클래스를 말하며 자바를 사용해 웹을 만들기 위해 필요한 기술로
javax.servlet.http.HttpServlet클래스를 상속받는다.
다시 말해 기존의 java파일에 웹 페이지 구현을 위한 html이 들어간 구조라고 볼 수 있다.
클라이언트의 요청을 처리하고 그 결과를 HTML을 사용하여 요청에 대한 응답을 다시 클라이언트에

전송하는 구현 규칙이 있다.
단, HTML변경 시 servlet을 재컴파일 해야한다는 단점이 있다.

 

GET방식은 URL에 변수(데이터)를 포함시켜 요청하는 것으로 보안 유지가 불가능하다.
따라서 로그인 같은 경우 GET방식은 부적합하다. GET방식에서 데이터를 header에 포함하여 전송하는데
Body는 보통 빈 상태로 전송되며 header내용 중 body의 데이터를 설명하는 content-type헤더필드로 들어가지 않는다.
header에 데이터가 들어가기 때문에 전송하는 길이에 제한이 있으며 초과 데이터는 절단된다. 캐싱이 가능하다.

 

<form action="/testServlet1.do">
-->/를 넣는 것은 초기화 시켜서 내꺼만 집어넣겠다는 의미

 

서블릿의 역할을 하는 클래스를 Java Resource에 생성한다.
서블릿의 역할을 하기위해서 extends로 HttpServlet을 상속 받아옴--->서블릿 만들어줌
입력한 데이터를 보여주기 위해서 doGet을 사용한다. testServlet1에서 action뒤에 method를 지정안하면

디폴트값이 get이므로.
컨트롤+스페이스바 눌러서 doGet을 오버라이드해준다.

 

꼭 프로젝트 파일 선택후 런
url로 요청을 보낸후 url맵핑을 안해줬기때문에 프린트내용"요청 잘 들어왔다!"이 콘솔에 안찍힌다.
url로 요청을 보낸 후 url맵핑을 해준다.(url맵핑 2가지 방법)

<방법1. web.xml을 통해 서블릿 url맵핑 기본구조>
<servlet>
    <servlet-name>TestServlet1</servlet-name><--동일해야됨
    <servlet-class>com.kh.servlet.TestServlet1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestServlet1</servlet-name><--동일해야됨
    <url-pattern>/testServlet1.do</url-pattern>
</servlet-mapping>
: <servlet></servlet><servlet-mapping></servlet-mapping><servlet-name></servlet-name> 안에

두개가 관련이 있다는 것을 보여주기 위해 servlet-name 이름을 동일하게 작성해준다.
<url-pattern>요청받은 주소 작성</url-pattern>

 

<요청 url연결/지정/표기><--뷰에서 오는 데이터도 받을 수 있는 것.
방법1) **web.xml : 배포 서술자(DD, Deployment Descriptor) : 애플리케이션에 대한 전체 설정 정보를 담아오는 곳
방법2)@Annotation : 오버라이딩때 사용
<servlet>
   <servlet-name>TestServlet1</servlet-name><!-- 순서3 -->
   <servlet-class>com.kh.servlet.TestServlet1</servlet-class><!-- 순서4 -->
</servlet>
<servlet-mapping>
   <servlet-name>TestServlet1</servlet-name><!-- 순서2 -->
   <url-pattern>/testServlet1.do</url-pattern><!-- 요청받은 주소 작성 --><!-- 순서1 -->
</servlet-mapping>

 

<흐름 순서>

1) 페이지에 submit을 눌러서 요청
2) TestServlet1의 html에 form의 action="/1_Servlet/testServlet1.do"을 작성(<url-pattern>/testServlet1.do</url-pattern> 여기에 받아주는 url과 동일하기만 하다면 a 태그에 주소든 form의 action의 url이든 url만 동일하다면 서블릿으로 연결
3) web.xml로 url 연결
3-1) 주소창에 url을 통해 요청보냄--><url-pattern>/testServlet1.do</url-pattern>요청받을 주소 작성
3-2) <servlet-mapping><servlet-name>TestServlet1</servlet-name><servlet-mapping>이름작성
3-3) <servlet><servlet-name>TestServlet1</servlet-name></servlet>동일한 이름을 가지고 있어서 연결
3-4) <servlet><servlet-class>com.kh.servlet.TestServlet1</servlet-class></servlet>읽음
4) servlet파일 TestServlet1으로 가서 doGet을 사용하여 입력 데이터를 주소창에 보여줌
4-1) System.out.println("요청 잘 들어왔다!"); 콘솔로 찍어서 확인

 

첫번째 파라미터 HttpServletRequest 사용자가 요청한 내용을 받아주는 용도이다.
HttpServletResponse : 처리 결과를 웹 브라우저로 보여주기 위한 용도
HttpServletRequest.getParameter(String name):String
view에서 보낸 데이터를 받아오는 역할
매개변수 String name :
request.getParameter("name");//뷰에서 인풋에 name속성들을 가지고 온다(순서지키지않아도 됨.)
request.getParameter("gender");
네임이 젠더라고되어있는 파라미터에 담긴 값을 가져오겠다-->String으로 반환한다

 

name=강건강&gender=남자&age=20대&city=서울&height=183&food=한식&food=양식
: input속성의 name

 

HttpServletRequest.getParameterValues(String name): String[]배열
-->여러개의 값을 받을때 사용
: String[] foods = request.getParameterValues("food");
for(String f : foods) {
System.out.println(f);//체크박스의 여러개를 찍어도 잘 나옴. 한식과 양식
}

 

<post방식>
POST방식은 URL에 변수(데이터)를 노출하지 않고 요청하는 것으로 보안 유지가 가능하다.
데이터를 Body에 포함하여 전송하므로 Body의 데이터를 설명하는 content-type헤더 필드가 들어가고 어떤 타입인지 명시해줘야 한다.
body에 데이터가 들어가 전송 길이는 제한이 없지만 최대 요청 받는 시간이 존재해 페이지 요청, 기다리는 시간이 있다
URL에 데이터가 노출되지 않아 즐겨찾기나 캐싱이 불가능하다.

<form action="/1_Servlet/testServlet2.do" method="post">-->post로 설정!
<서블릿>
request.setCharacterEncoding("UTF-8"); -->인코딩하기!POST방식일때!
:인코딩하지않으면 한글은 이상한 글자로 나옴

뷰+모델 = MVC1패턴
뷰 모델 컨드롤러 다 따로 되있는게 MVC2패턴

 

<결과화면 분리 방식>

서블릿은 화면에 표현될 html코드를 프로그램적으로 작성한다. 이것으로 생기는 단점은 비즈니스 로직과 화면 구현 디자인이 같이 있어 가독성이 떨어지고 개발이 어렵다. 이러한 구조는 협업을 중요시 하는 개발자들의 입장에서는 좋지 않은 코드로 비즈니스 로직과 디자인은 분리되는 것이 좋다. 또한 html파일 수정 시 서버를 재시동해야하고 html에는 서버에서 얻어온 정보를 동적으로 반영하기 힘들다.


뷰를 서블릿에서 처리했는데 이제 뷰를 분리할 것이니 분리된 뷰에 요청-->sevlet(JSP파일생성)(결과화면)
결과화면을 나타내주는 곳으로 이동-->request에 담아서 응답(화면이 분리가되서 한번더 요청되는 것이다)

-->화면에 데이터 필요(결과화면)
 request.setAttribute( , )
: 보낼 데이터들을 어떤이름과 어떤 메소드를 보낼지에 지정해주는것이다

<결과화면>
원하는 형식으로 보이지 않음, 전달받은 데이터를 받아와야됨.
--><% %>데이터 받아올 공간 html에 자바코드를 받아오는것