[JSP, EL예제]initParam,paramValues,pageContext
2021년 10월 16일 토요일
[JSP, EL예제]initParam,paramValues,pageContext
[서블릿 리스너, 어노테이션예제, listener annotation]
[서블릿 리스너, 어노테이션예제, listener annotation]
2020년 8월 30일 일요일
(동영상)서블릿 컨텍스트 리스너(ServeltContextListener)란? ServletContext 개념, 서블릿 컨텍스트 리스너 작성 실습 http://ojc.asia/bbs/board.php?bo_table=LecServletJSP&wr_id=285
(동영상)서블릿 컨텍스트 리스너(ServeltContextListener)란? ServletContext 개념, 서블릿 컨텍스트 리스너 작성 실습
http://ojc.asia/bbs/board.php?bo_table=LecServletJSP&wr_id=285
package listener;
……
//@WebListener
public class MyListener implements ServletContextListener {
private ServletContext ctx = null;
public void contextDestroyed(ServletContextEvent sce) { System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Web App Destroyed...");
ctx = null;
}
public void contextInitialized(ServletContextEvent sce) {
ctx = sce.getServletContext(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Web App Init...");
System.out.println(ctx.getServletContextName());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<listener>
<listener-class>listener.MyListener</listener-class>
</listener>
</web-app>
#서블릿컨텍스트, #ServletContext란, #서블릿강좌, #서블릿동영상, #자바서블릿, #서블릿컨텍스트리스너, #ServletContextListener, #서블릿컨텍스트란, #ServletConfig, #자바서블릿동영상, #서블릿동영상,
스프링 프레임워크 DispatcherServlet, ContextLoaderListener(디스패처서블릿, 컨텍스트로더리스너)
http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=853
스프링 프레임워크 DispatcherServlet, ContextLoaderListener(디스패처서블릿, 컨텍스트로더리스너)
1. DispatcherServlet
n HttpServlet을 상속받은 서블릿이며 웹 응용프로그램의 web.xml에서 정의한다.
n 사용자의 요청을 맨 앞단에서 받아 Handler Mapping빈에게 URL과 요청정보를 넘겨 어떤 컨트롤러의 메소드가 요청을 처리할 지 받고 해당 컨트롤러 메소드로 요청을 위임한다.
n 컨트롤러 이후 비즈니스 로직이 처리된 후 컨트롤러로 부터 모델과 뷰를 리턴받고 ViewResolver를 통해 뷰 이름을 해석하여 요청을 처리할 뷰로 요청을 forward 한다. 이때 모델 데이터를 뷰에게 넘기고 뷰가 만든 최종적인 응답을 받아서 클라이언트 브라우저에 전달한다.
n DispatcherServlet이 로드되면 contextConfigLocation 파라미터로 설정파일이 지정되어 있지 않다면 WEB-INF/서블릿이름-servlet.xml 파일에 정의된 빈들을 WebApplicationContext에 로딩한다. 그런 다음 servlet-mapping을 통해 다루어질 URL을 지정한다.
n DispatcherServlet의 설정파일에는 Controller, ViewResolver, LocaleResolver, MVC 기반 인프라와 관련된 빈들을 주로 정의한다.
n 세개의 파라미터를 가진다.
ü contextClass : WebApplicationContext를 구현할 클래스, 기본은 XmlWebApplicationContext 이다.
ü contextConfigLocation : 설정파일 위치
ü namespace : WebApplicationContext의 네임스페이스, 기본은 [서블릿명]-servlet.xml 형식이다.
XML-based Servlet container initialization
<servlet>
<servlet-name>onj</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param은 생략가능하며, 생략시 설정파일의 이름은 /WEB-INF/onj-servlet.xml 이다 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value> <!-- 설정파일의 위치 --> </param-value>
</init-param>
<!-- 서블릿 컨텍스트(웹사이트)가 시작될 때 한 개의 DispatcherServlet을 미리 시작 -->
<!-- 생략시 최초 요청이 들어올 때 DispatcherServlet을 로드한다.-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>onj</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2. ContextLoaderListener
n ServletContextListener를 구현한 클래스로 WAS에서 서블릿 컨텍스트(웹 서비스)가 시작될 때 스프링관련 빈들을 Root WebApplicationContext에 적재하고 서블릿 컨텍스트(웹 서비스)가 종료될 때 빈들을 제거한다. 즉 Spring의 Root WebApplicationContext의 시작과 종료를 위한 부트스트랩 리스너 이며 생성되는 Root WebApplicationContext는 ServletContext에 저장된다.
n 설정파일을 <context-param>의 contextConfigLocation 속성에서 설정하지 않으면 WEB-INF/applicationContext.xml 이다.
n ContextLoaderListener 와 DispatcherServlet 은 각각 WebApplicationContext를 생성하는데 ContextLoaderListener가 생성한 컨텍스트가 루트 WebApplicationContext가 되고 DispatcherServlet 생성한 컨텍스는 루트 WebApplicationContext를 부모로 하는 자식 WebApplicationContext가 된다.(ContextLoaderListener가 먼저 빈들을 로드한다.)
n 대부분의 웹개발에서 자바빈 설정은 여러 계층으로 나누어서 이루어지는데 영속성 계층(Persistence Layer), 서비스 계층(Service Layer), 웹 단계(Web Tier) 등이다. DispatcherServlet 설정 파일에는 Web Tier의 요소들 즉 Controller, ViewResolver, LocaleResolver, MVC 기반 인프라와 관련된 빈들을 주로 정의하는데 서비스 계층과 영속성 계층에 속하는 빈 역시 DispatcherServlet의 설정파일에 포함할 수 있지만 별도의 설정파일을 두고 컨텍스트 로더 리스너를 통해 먼저 로드하는 것이 좋다.
n ContextLoaderListener는 영속성 계층의 클래스(DAO 클래스, @Repository), 서비스 계층의 클래스(@Service), 엔티티(@Entity)와 같은 클래스들을 주로 로드 한다.(DataSource, MyBaris를 위하 SeqSesionFactoryBean, TransactionManager) 이러한 클래스들은 컨트롤러가 실행되기 전에 미리 메모리에 생성되어 있어야 하는데, 이를 위해 DispatcherServlet이 컨트롤러 클래스(@Controller)를 로드하기 전에 ContextLoaderListener를 통해 로드 하는 것이다.
n 프로젝트의 설정 파일이 여러 개라면 모두 로드 되도록 하기 위해 컨텍스트 로더를 설정하며, 컨텍스트 로더는 DispatcherServlet이 로드하는 것 이외의 컨텍스트 설정파일을 로드한다.
n ContextLoaderListener는 설정파일의 위치를 알려주지 않으면 /WEB-INF/applicationContext.xml이라는 스프링 설정 파일을 찾는다. 서블릿 컨텍스트에 contextConfigLocation이라는 파라미터를 설정하면 컨텍스트 로더가 로드 할 수 있는 하나 이상의 스프링 설정 파일을 지정할 수 있다.
n DispatcherServlet이 여러 개인 경우 즉 컨트롤러가 여러 개 인경우 각각 별도의 자식 WebApplicationContext를 생성하게 되고 이 경우 각 자식 컨텍스트는 독립적이므로 서로 자바빈공유가 불가능하다. 이 경우 ContextLoaderListener를 이용하여 여러 DispatcherServlet의 설정파일을 한번에 로드하면 된다. 또한 여러 컨트롤러가 공유해야 하는 서비스 계층의 빈이 있다면 ContextLoaderListener를 이용하여 먼저 로드되게 해야 할 것이다. (기본적으로 자식 컨텍스트에서 루트 컨텍스트의 빈에는 접근이 가능하다)
ContextLoaderListener를 web.xml에 설정한 예
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
n 서로 다른 업무에 디스패처 서블릿 여러 개 할당하고 Root WebApplicationContext에 한번에 로드
<!-- web.xml ContextLoaderListener 설정 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- 여기에 여러 설정파일을 정의한다. -->
<!-- 콤마(“,”), 공백(“ “), 세미콜론(“;”), 탭(“\t”), 줄바꿈(“\n”)으로 파일을 구분 -->
/WEB-INF/insa-servlet.xml, /WEB-INF/sale-servlet.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!—디스패처 서블릿 설정 -->
<servlet>
<servlet-name>insa</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>insa</servlet-name>
<url-pattern>/insa/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>sale</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sale</servlet-name>
<url-pattern>/sale/*</url-pattern>
</servlet-mapping>
3. 이번에는 ContextLoaderListener가 DispatcherServlet 보다 먼저 로딩된다는 것을 확인하는 예제를 작성해 보자.
STS에서
File à New à Spring Legacy Project
Project Name : webmvc
Spring MVC Project 선택
STS4에서는 Spring Legacy Project가 없으니 추가하기 위해 이클립스 마켓플레이스에서 인스톨하자.
Spring MVC 템플릿을 다운받을 것인지 물으면 ‘Yes”
다음 화면의 top level package에서 a.b.webmvc로 입력
Spring Web MVC HelloWorld 예제가 다운로드 된다.
Home.jsp에서 한글 인코딩을 위해 아래처럼 page 지시자에 pageEncoding을 추가하자.
<%@ page session="false" pageEncoding="EUC-KR"%>
브라우저에서 localhost:8080/webmvc 라고 입력해서 결과를 확인하자.
MVC HelloWorld 템플릿을 적절히 수정해 보자.
[Car.java 추가]
package a.b.webmvc;
public class Car {
private String name=null;
public Car(String name) {
this.name = name;
System.out.println(">>>>>>>>> Car Created!! " + name);
}
public String getName() {
return this.name;
}
}
[src/main/webapp/WEB-INF/spring/root-context.xml에 bean 설정 추가]
<bean id="car1" class="a.b.webmvc.Car">
<constructor-arg name="name" value="My Car…. ContextLoaderListener"/>
</bean>
[src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml에 bean 설정 추가]
<beans:bean id="car2" class="a.b.webmvc.Car">
<beans:constructor-arg name="name" value="My Car…. DisplatcherServlet"/>
</beans:bean>
[src/main/webapp/WEB-INF/views/home.jsp]
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head><title>Home</title></head>
<body><h1>Hello world! </h1>
<P> ${car}. </P>
</body>
</html>
[HomeController.java]
@Controller
public class HomeController {
@Resource(name="car1")
Car car;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model model) {
model.addAttribute("car", car.getName());
return "home";
}
}
[실행로그 및 결과]
ContextLoaderListener가 먼저 로드되면서 Car 인스턴스를 생성함을 확인 할 수 있다.
>>>>>>>>> Car Created!! My Car…. ContextLoaderListener
INFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 4942 ms
……….
……….
>>>>>>>>> Car Created!! My Car…. DisplatcherServlet
INFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'appServlet': initialization completed in 1869 ms
8월 30, 2020 12:47:32 오후 org.apache.coyote.AbstractProtocol start
정보: 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다.
8월 30, 2020 12:47:32 오후 org.apache.catalina.startup.Catalina start
정보: 서버가 [10351] 밀리초 내에 시작되었습니다.
Localhost:8080/webmvc 로 home.jsp를 실행하자.
여러 번 실행하더라도 Car 클래스의 생성자는 더 이상 실행되지 않는다. 최초에 ContextLoaderListener, DispatcherServlet이 로딩될 때 한번만 Car 클래스가 생성되어 메모리에 WebApplicationContext에 적재된다.
#스프링컨텍스트, #컨텍스트로더리스너, #디스패처서블릿, #스프링동영상, #스프링설정파일, #Spring동영상, #SpringFramework, #스프링강좌, #스프링강의, #Spring강좌, #Spring강의, #ContextLoaderListener, DispatcherServlet
(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원
(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...

-
(C#닷넷동영상)C# HtmlAgilityPack을 이용한 웹크롤러(Web-Crawler) 웹페이지, HTML 파싱하기, 닷넷학원, C#학원, WPF학원,자바학원, JAVA동영상 http://ojc.asia/bbs/board.php?bo_table...
-
(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...
-
WPF 데이터 그리드(DataGrid) Grid는 컨트롤들을 담지만 DataGrid는 사용자 정의 가능한 표 형태로 데이터를 표시하는 컨트롤로 행 및 열에 데이터 or 그 모임을 표시하는 유연한 방법을 제공한다. n Data...