JAVA/java
[Backend] Survlet, jsp
Garonguri
2022. 4. 3. 02:13
728x90
- Servlet
- JSP 이전에 동적인 웹 컨텐츠를 제공하기 위해 나타났다.
- JSP
- jsp는 html 코드를 중심으로 java 코드를 필요한 부분에 사용한다.
- jsp는 file 이름을 url로 사용할 수 있다.
- EL, jstl을 활용할 수 있다.
- 컴파일 된 후 servlet으로 변경된다.
- MVC model에서 view의 역할을 담당한다.
- javascript코드를 포함할 수 있다.
- Survlet URL
- URL mapping 방법
- web.xml 고치기
- annotation ( @WebServlet("/main.do") 기억 할 것!)
- URL의 구조
- http://www.ssafy.com/good.jsp?parameter1=value1¶meter2=value2
- URL
- Query String Begin
- Parameter Name
- Parameter Value
- Query String Separator
- @WebServlet(value="/main.do")-> @WebServlet("/main.do")로 간단하게 표기 가능
- value에 String[]값을 넣을 수 있기 때문에 여러가지 uri포함 가능. =>@WebServlet(urlPatterns ={"/main.do","/ssafy.do"})
- "/"를 나타내는 Root Path -> Context Root or Server Root.
- context path와 server path 대답할 수 있어야 함.
- Server Root : Redirect 경로(url바뀜). location.href, a tag's href 등
- Context Root : Forward 경로(url유지)
- URL mapping 방법
- Survlet Lifecycle
- javaSE와 다르게 main method가 없다.
- 객체의 생성부터 method call까지 container에게 있다.
- Client가 요청 -> Servlet container는 서블릿 객체를 한번만 생성, 한번만 초기화하고, 요청시마다 요청에 대한 처리를 반복
- servlet 객체를 제거하는 일까지 container까지 담당
- Servlet lifecycle Method
- Constructor -> init -> service -> doget/dopost -> destroy
- Constructor : 요청이 들어오면 servlet 객체 생성
- init() : 서블릿이 메모리에 로드될 때 한번 호출(코드 수정으로 다시 로드되면 다시 호출) -> 한번만 호출
- service() : 모든 요청은 service()를 통해 do__ method로 이동한다. -> 요청 시 마다 반복 실행
- 요청을 할 때 get이면 doget(), post면 dopost(), 모르겠으면 service() 오버라이딩.
- dopost() : Post방식으로, doget() : Get방식으로 data 전송 시 호출한다. -> 요청 시 마다 반복 실행
- destroy() : 서블릿이 메모리에서 해제되거나, 코드가 수정되면 호출한다. -> 한번만 호출
- Servlet 객체
- parameter에 값이 한 개만 있는 경우 : request.getParameter("value");
- parameter에 값이 여러 개 있는 경우(체크박스) : request.getParameterValues("values")
- Page 이동 방식 차이, 특징
- Forward
- user가 처음 요청한 request와 response를 유지하며 page를 이동한다.
- web container 동일 서버 내 path로 이동한다.
- user에게 보여지는 url이 변하지 않는다. 기존 url 유지
- request의 setAttribute(key, value)를 통해 전달.
- GerRequestDispather 사용.
- SendRedirect
- Page를 이동하고 나면 request, response가 사라진다. 새로운 request, response가 생성됨.
- 다른 web container의 url로 이동할 수 있고 따라서 user에게 보여지는 url이 변화한다.
- reload 시 기존 request가 유지되어 재동작한다.
- request로는 data를 저장할 수 없고 session이나 쿠키를 이용해야 한다.
- C, U, D : redirect, R : forward를 사용하면 좋다.
- Forward
- Client 요청 방식 & survlet에서 처리 방법
- doget : 전송되는 데이터가 url뒤에 query string으로 전달
- 간단하다. 직접 입력 가능하다.
- 데이터 양의 제한이 있다. 사이즈는 2kb
- dopost : url과 별도로 http header 뒤 body에 전달.
- 데이터의 제한이 없고 보안이 유지된다.
- get방식보다 느리다.
- Error 응답 코드
- 403 : 클라이언트가 접근할 권리가 없다. 서버는 클라이언트가 누군지 알고 있다.
- 404 : 서버가 요청받은 리소스를 찾을 수 없다. 알려지지 않은 URL을 의미합니다. 리소스 자체는 존재하지 않음을 의미
- 406 : 이 응답은 서버가 서버 주도 콘텐츠 협상을 수행한 후, 사용자 에이전트에서 정해준 규격에 따른 어떠한 콘텐츠도 찾지 않았을 때, 웹서버가 보냅니다.
- 500 : 웹 사이트 서버에 문제가 있음을 의미하지만 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없습니다.
- doget : 전송되는 데이터가 url뒤에 query string으로 전달
- JSP의 구성 요소, 기능
- JSP directive
- page directive : 컨테이너에게 현재 jsp 페이지 어떻게 처리할건지
- include directive : 특정 jsp file page에 포함시키기
- taglic directive : jstl, 사용자 태그를 이용해 자바 코드 줄이기
- JSP Scriptlet
- <%! 선언 %>
- <% java code %> : servlet으로 변환 시 service에 해당.
- <%= 문자열 %> : data를 브라우저에 출력 --> EL이 대체 가능
- <%-- 주석 --%>
- JSP directive
- JSP to EL
- dot표기법도 있지만 []사용할 수도 있다. ${userinfo["name"]} == ${userinfo.name} 둘다 가능
- pageContext(java beans) 제외 모든 객체는 Map. -> key, value 있음.
- JSTL tag
- <c:set> -> 값 할당할 때 사용
- <c:catch> 오류페이지 안넘기고 사용
- <c:if> 이프문
- <c:forEach> 반복문
- scope 관련 객체
- pageContext
- 하나의 jsp 페이지를 처리할 때 사용되는 영역
- 한번의 요청에 하나의 jsp가 호출되고 한개의 page만 대응됨. 페이지 벗어나면 사라짐
- request
- 하나의 http요청을 처리할 때 사용되는 영역
- 요청을 할 때마다 새로운 request 생성. 응답이 완료되면 사라짐
- session
- 하나의 웹 브라우저와 관련
- 같은 웹 브라우저 내 요청 페이지들은 같은 session을 공유
- application
- 하나의 웹 어플리케이션과 관련됨.
- 이 네 개 중 setAttribute()가 없는 객체는? -> response
- setAttribute는 (String key, Object value)이기 때문에 getAttribute("key")의 반환 객체는 Object이다.
- 영역 객체의 유지 순서 :
- pageContext -> request(HttpservletRequest) -> session(HttpSession) -> application(ServletContext)
- pageContext
- 예외 처리
- web.xml로 관리. 톰캣에게 계속 throw함.
- Result.jsp는 application root 아래에 존재한다.
- <a href="main.do">로 서블릿 호출 -> Get 요청
- Cookie
- 특징
- key, value로 구성되어있고 String으로 이루어져 있다.
- 브라우저마다 저장되는 쿠키가 다르다.
- 세션 관리, 개인화, 트래킹에 용이 (자동 로그인, 다시 보지 않기, 최근 검색 상품, 장바구니)
- 이름, 값, 만료일, 경로로 구성
- 클라이언트 당 300개, 도메인 당 20개, 한 쿠키는 4kb까지 저장 가능
- 설정
- 동작 순서:
- 클라이언트가 페이지 요청
- WAS가 쿠키 생성
- Http header에 쿠키 넣어 응답
- 브라우저가 쿠키를 pc에 저장하고, was가 재요청할때 쿠키를 같이 전송
- 브라우저가 종료되더라도 쿠키 만료 기간이 남았다면 계속 보관한다.
- 재방문 시 해당 쿠키가 있는 경우 요청 페이지와 함께 쿠키 전송한다.
- 동작 순서:
- 값 변경/얻기
- setValue(String value) / getValue()
- 전송
- Cookie cookie = new Cookie("id", "itkorea");
- response.addCookie();
- 유효기간
- setMaxAge(), getMaxAge()로 얻고 setMaxAge(0)이면 삭제
- 특징
- Session
- 특징
- 메모리가 허락하는 용량까지 저장 가능
- WAS에 object 형태로 저장
- 장바구니, 화면 로그인 등..
- 웹 서버에 저장됨.
- 브라우저를 닫거나 세션을 삭제했을 때 삭제됨. 쿠키보다 보안 좋음.
- 클라이언트 고유 아이디 부여
- 동작 순서
- 클라이언트가 페이지 요청
- 서버가 쿠키를 확인해서 클라이언트가 session id를 보냈는지 확인
- 존재하지 않는다면 생성해서 클라이언트에게 돌려줌
- 서버가 돌려준 세션 아이디를 쿠키 사용해서 서버에 저장. (JSESSIONID)
- JSESSIONID(쿠키)를 사용해 재접속 시 서버에 전달
- 설정
- 브라우저 당 하나의 JSESSIONID 할당
- setAttribute(String name, Object value)
- 해제
- invalidate()
- 특징
- MVC pattern
- jsp를 이용해 구성할 수 있는 웹 어플리케이션 아키텐쳐는 model1과 model2로 나뉜다.
- jsp가 클라이언트 요청에 대한 logic과 view 모두를 담당하느냐, 아니면 view만 담당하느냐에 따라 나뉨.
- model 1
- logic, view를 모두 jsp가 담당한다. (즉 view, controller모두를 jsp가 담당함. model은 java beans)
- 장점 : 구조가 단순하고 직관적, 개발 시간과 비용 단축
- 단점 : jsp코드가 복잡해지고, 분업이 힘들어진다. 확장성과 유지보수에 안좋다.
- model2
- 요청 처리는 servlet이, logic 처리는 java class가, view는 jsp가 담당하는 구조.
- 즉 Model은 service, dao, java beans가 한다. view는 jsp(결과 출력을 위한 자바 코드 존재)가, controller는 servlet이 담당하는 구조.
- 장점 : jsp는 코드가 복잡하지 않다. 분업이 용이하다. 유지보수가 쉽고 확장성이 좋다.
- 단점 : 전체 구조가 복잡하고 개발 시간, 비용이 증가한다.
728x90