JSP Scope - pageContext, HttpServletRequest, HttpSession, ServletContext, forward(포워드), RequestDispatcher, EL 사용법, web.xml - welcome-file, session-config, context-param - initParam, getInitParameter, Ibatis (아이바티스)

2019. 5. 2. 19:03웹(JSP)

----------------------------------JSP의 Scope------------------------------------

JSP 내장객체의 속성과 스코프
            - 속성
                        - 내장객체(PageContext, HttpServletRequest, HttpSession, ServletContext)에
                           값으로 저장되는 객체를 말한다.
                        - 위에서 나열한 내장객체에는 (이름:값)의 쌍으로 속성을 저장할 수 있다.
            - 스코프
                        - 참조범위 및 생존시간을 스코프라고 한다.
                        - 위에서 나열한 내장객체는 각각 자신만의 참조범위와 생존시간을 가지고 있다.
                          * 각 내장객체 저장되는 속성도 그 내장객체가 가지는 스코프와 동일하게 참조/생존한다.
                        
                        - JSP의 스코프
                                   - PageScope
                                             * PageContext가 가지는 스코프다.
                                             * PageContext에 저장된 속성은 해당 JSP에서만 참조가능하다.
                                             * PageContext에 저장된 속성은 해당 JSP의 실행이 완료되면 참조할 수 없다.

                                    - RequestScope
                                              * HttpServletRequest가 가지는 스코프다.
                                              * HttpServletRequest에 저장된 속성은 요청한 클라이언트만 참조할 수 있다.
                                              * HttpServletRequest에 저장된 속성은 응답 완료되면 참조가능하다.
                                                
                                    - SessionScope
                                              * HttpSession이 가지는 스코프다.
                                              * HttpSession에 저장된 속성은 요청한 클라이언트만 참조할 수 있다.
                                              * HttpSession에 저장된 속성은 로그아웃 후에는 참조할 수 없다.

                                    - ApplicationScope
                                            * ServletContext가 가지는 스코프다.
                                            * ServletContext에 저장된 속성은 모든 클라이언트, 모든 Web객체가 참조할 수 있다.
                                            * ServletContext에 저장된 속성은 톰캣이 종료되면 참조할 수 없다.

            - 주요 메소드
                        - 위에서 나열한 내장객체는 아래의 메소드를 모두 가지고 있다.
                        - void setAttribute(String name, Object value)
                        - Object getAttrivute(String name)
                        - void removeAttribute(String name)

            - 사용예
                        - PageScope
                                    * 해당 JSP에서만 일시적으로 사용되는 값을 속성으로 저장할 때 사용한다.
                                      내비게이션 표시에 사용되는 페이지 이름
                                      페이지에서 반복적으로 사용되는 계산식의 결과 값
                        - RequestScope
                                    * 가장 많이 사용되는 스코프다.
                                    * Model2 패턴의 웹개발에서 필수적으로 사용되는 스코프다.
                                      로직요소(java 코드)와 디자인요소(html 코드)를 분리할 수 있다.
                                      java(값획득 + request에 저장) ---forward이동---> JSP(EL로 표현) 
                        - SessionScope
                                    * 클라이언트의 개인 보관함이다.
                                    * 개인적인 정보(로그인한 사용자정보)를 저장한다.
                                    * 페이지를 이동해도 유지되어야 하는 정보(장바구니, 최근본 상품)를 저장한다.
                        - ApplicationScope
                                    * 모든 클라이언트, 모든 web객체가 공유하는 정보를 저장한다.
                                      모든 JSP에서 사용되는 값을 저장한다.
                                      (Connection Pool를 저장하는 용도로 사용된다.)
                                      Spring에서는 빈 컨테이너를 저장하는 용도로 사용된다.
                                    
내장객체의 종류

            - PageContext객체 (PageContext)
                        - 현JSP페이지에서 속성을 공유

            - HttpServletRequest객체 (Request)
                        - 요청받은 객체에서 속성을 공유

            - HttpSession객체 (Session)
                        - 같은 세션을 사용자만 속성을 공유
                          * 즉 자기 자신만

            - ServletContext객체 (Application)
                        - 애플리케이션의 모든 사용자가 속성을 공유

내장객체의 공유 범위
ServletContext (Application) 앱 > HttpServletRequest (Request) 요청메세지 > 

PageContext JSP페이지 > HttpSession (Session) 자기세션





내장 객체에 속성 저장하기

            PageContectext객체에 속성 저장하기
                        pageContext.setAttribute("A", "PageContext의 속성이야");

            HttpServletRequest객체에 속성 저장하기
                        request.setAttribute("B", "requset의 속성이야");

            HttpSession객체에 속성 저장하기
                        session.setAttribute("C", "session의 속성이야");

            ServletContext객체에 속성 저장하기
                        application.setAttribute("D", "application의 속성이야");



내장 객체에서 속성 꺼내기

            PageContext에 저장된 값 조회하기
                        String value1 = (String)pageContext.getAttribute("A");

            HttpServletRequest에 저장된 값 조회하기
                        String value2 = (String)request.getAttribute("B");

            HttpSession에 저장된 값 조회하기
                        String value3 = (String)session.getAttribute("C");

            ServletContext에 저장된 값 조회하기
                        String value4 = (String)application.getAttribute("D");



예시)
demo8.jsp




demo8_1.jsp (JSP 내장객체에 속성 저장하기 먼저 클릭)



demo8_3.jsp  (demo8에서 JSP 내장객체에 저장된 속성 조회하기 클릭시)


※. PageContext와 HttpServletRequest가 null인 이유는 PageContext는 demo8_1에서 demo8_3으로 이동해서 없어진것이고
    HttpServletRequest는 demo8_1에서 받은 request가 없어져서 null인것이다.
    만약 demo8에서 JSP 내장객체에 속성 저장하기를 클릭 안했다면 HttpSession값도 저장이 안돼 session도 null이고
    결국 ServletContext만 보였을것이다.




sendRedirect와 포워딩
 - sendRedirect는 url을 바꿔가면서 다른페이지로 외부로 옮겨주는 느낌지만
   포워딩은 내부에서 페이지를 옮겨주는것으로 url이 안바뀌며 PageContext는 전달이 안되지만
   그 페이지에서 받은 HttpServletRequest (Request) 객체 정보는 전달된다.

※. forward 이동하기
            RequestDispatcher 변수명 = request.getRequestDispatcher("보낼곳");
            변수명.forward(request, response);



예시) forward 사용 예시
demo8.jsp (JSP 내장객체에 저장하고, 조회하기(forward 이동) 클릭시)



demo8_2.jsp




demo8_4.jsp







////////////////////////////////////EL 사용하기

EL이란 속성을 쉽게 사용할 수 있는 방법이다.
vo에 get메소드를 읽어오는 것이기 때문에 get이 없다면 EL을 사용할 수 없다.



예시) EL사용해서 위와 같은값 출력하기


(일반 java사용)
위와같은 것을 아래와 같이 바꿀수 있다.



(EL사용)



위와 같이 출력이 된다. 
다만 차이점은 EL은 값이 null값일경우 출력이 안된다.




활용 예제) EL 여러방법으로 받아오기

demo8_2.jsp




demo8_5.jsp






-------------------------------------web.xml--------------------------------------

WEB-INF/web.xml 파일


welcom-file로 지정된 파일의 경우
주소창에 도메인명(호스트명)만 입력하면 
아래의 file중 하나를 찾아서 시작화면으로 표시하게된다.


예시)

welcom-file
welcom-file로 지정된 파일의 경우
주소창에 도메인명(호스트명)만 입력하면 
아래의 file중 하나를 찾아서 시작화면으로 표시하게된다.




위에처럼 하면 아래와 같이 열린다.


위의 처럼 localhost를 치면 /hta/main.jsp파일이 열린다

C:\Windows\System32\drivers\etc\hosts 파일을 아래처럼 수정하면


localhost를 지정한 도메인으로 열수있다.





초기화 파라미터 설정하기 context-param, context-value
   * 톰캣이 시작될 때 초기화 파라미터값을 읽어간다.
   * 톰캣이 ServletContext객체를 생성하고, 초기화파라미터값을 저장한다.
   * Java Web의 객체들(모든 JSP, 모든 서블릿, 모든 필터, 모든 리스터)은
     초기화파라미터값을 ServletContext로부터 조회할 수 있다.

 


위에처럼 설정하고 값을 불러올때 initParam, getInitParameter을 이용하기도 한다.
demo9.jsp





HttpSession 
 - 객체의 타임아웃 시간을 분단위로 설정한다, (분단위)
    (예시: 은행사이트 자동 로드아웃 같은)






---------------------------------------------IBATIS----------------------------------

1. 아래 경로로 간다.
https://mvnrepository.com/artifact/org.apache.ibatis/ibatis-sqlmap

2. 2.3.4.726 버전 클릭 후 jar파일을 다운받는다.

3. 이클립스에서 WEB-INF에 복사 붙여넣기 한다.


ibatis
            - SQL Mapper Framwork
            - SQL과 객체를 매핑하고 해당 쿼리의 실행을 요청하면
              쿼리를 실행하고, 결과를 반환하는 라이브러리다.

            - 주요 구성 파일
                        ibatis 환경설정 파일
                                    - Database 연결정보 설정
                                    - SQL이 정의된 파일 설정
                        ibatis용 쿼리 설정 파일
                                    - 실행할 SQL을 정의
                                      * 테이블의 갯수만큼 작성하는 것이 원칙이다.
            - 핵심 객체 
                        - SqlMapClient
                                    - insert, update, delete, select 쿼리를 실행하는 메소드를 제공한다.

                        - 주요메소드            
                                 * INSERT 쿼리
                                 int insert(String id)
                                 int insert(String id, Object param)

                                 * UPDATE 쿼리
                                 int update(String id)
                                 int update(String id, Object param)

                                 * DELETE 쿼리
                                 int delete(String id)
                                 int delete(String id, Object param)

                                 * SELECT 쿼리
                                 Object queryForObject(String id)
                                 Object queryForObject(String id, Object param)  // 값이 한개만 나올때 사용한다.
                                 List queryForList(String id)
                                 List queryForList(String id, Object param)  // 값이 두개이상일경우 사용한다.



예시)
config.xml

 

 

IbatisUtils.java




location.java




hr.xml




LocationDao.java





locationApp.java