레이블이 서블릿인 게시물을 표시합니다. 모든 게시물 표시
레이블이 서블릿인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 16일 토요일

[JSP, EL예제]initParam,paramValues,pageContext

 [JSP, EL예제]initParam,paramValues,pageContext


1. MyBean.java

package java1;

public class MyBean {
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}


2. ELTEST.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    import="java1.MyBean"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL TEST</title></head>
<body>
<%
MyBean myBean = new MyBean();
myBean.setName("홍길동");
myBean.setAge("12");
session.setAttribute("myBean", myBean);
%>
name : ${myBean.name} <br>    age  : ${myBean.age} <br>
</body></html>


-----------------------------------------------------


1. input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL Example1</title></head><body>
<form action="result.jsp" method="post">
좋아하는 과일을 선택하세요<br><br>
이름 : <input type="text" name=name/>
<br>
<input type="checkbox" name="fruits" value="사과">사과
<input type="checkbox" name="fruits" value="딸기">딸기
<input type="checkbox" name="fruits" value="참외">참외
<input type="checkbox" name="fruits" value="수박">수박
<input type="checkbox" name="fruits" value="귤">귤
<br>
<br>
<input type="submit"><input type="reset">
</form></body></html>


2. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<description>초기파라미터1</description>
<param-name>was</param-name>
<param-value>tomcat</param-value>
</context-param>

<context-param>
<description>초기파라미터2</description>
<param-name>version</param-name>
<param-value>8.0</param-value>
</context-param>
</web-app>


3. result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<% request.setAttribute("name", "홍길동");   %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>표현 언어</title></head>
<body>
WAS : ${ initParam.was }<br>
VERSION : ${ initParam.version }
<hr>
요청 URI : ${ pageContext.request.requestURI }
<hr>
 이름 : ${ requestScope.name }
<hr>
선택한 과일 : ${ paramValues.fruits[0] }    ${ paramValues.fruits[1] }   ${ paramValues.fruits[2] }    ${ paramValues.fruits[3] }    ${ paramValues.fruits[4] }
</body></html>

[서블릿 리스너, 어노테이션예제, listener annotation]

[서블릿 리스너, 어노테이션예제, listener annotation]


- 어노테이션으로 할 경우


package ojc;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

@WebServletContextListener
public class MyListener implements ServletContextListener {
private ServletContext ctx = null;
// Tomcat Shutdown 시키면 아래 메시지 확인

public void contextDestroyed(ServletContextEvent event) {

System.out.println(">>> onjweb Webapp destroyed!!");
this.ctx = null;
}

// Tomcat시작시 아래 메시지 출력

public void contextInitialized(ServletContextEvent event) {
this.ctx = event.getServletContext();
System.out.println(">>> onjweb Webapp start!!");
}
}


- web.xml에 XML 설정으로 하는 경우

<listener>
    <listener-class>java1.MyListener</listener-class>
</listener>

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-instancexmlns="http://java.sun.com/xml/ns/javaeexsi: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>

 

 

47942c5ffafc4151fa78ae84df1c84c7_1598697
47942c5ffafc4151fa78ae84df1c84c7_1598697
47942c5ffafc4151fa78ae84df1c84c7_1598697
47942c5ffafc4151fa78ae84df1c84c7_1598697
47942c5ffafc4151fa78ae84df1c84c7_1598697
47942c5ffafc4151fa78ae84df1c84c7_1598697
47942c5ffafc4151fa78ae84df1c84c7_1598697

 

#서블릿컨텍스트, #ServletContext란, #서블릿강좌, #서블릿동영상, #자바서블릿, #서블릿컨텍스트리스너, #ServletContextListener, #서블릿컨텍스트란, #ServletConfig, #자바서블릿동영상, #서블릿동영상,


스프링 프레임워크 DispatcherServlet, ContextLoaderListener(디스패처서블릿, 컨텍스트로더리스너)

 http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=853



스프링 프레임워크 DispatcherServlet, ContextLoaderListener(디스패처서블릿, 컨텍스트로더리스너)

 

6ff3dbd002c1be22ea1829afedfc64f1_1598764
 

 

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>

 

 

 

 

 

 

6ff3dbd002c1be22ea1829afedfc64f1_1598764
 

 

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가 없으니 추가하기 위해 이클립스 마켓플레이스에서 인스톨하자.

 

 

6ff3dbd002c1be22ea1829afedfc64f1_1598764
6ff3dbd002c1be22ea1829afedfc64f1_1598764
 

 

 

 

Spring MVC 템플릿을 다운받을 것인지 물으면 ‘Yes”

6ff3dbd002c1be22ea1829afedfc64f1_1598764
 

 

 

다음 화면의 top level package에서 a.b.webmvc로 입력

6ff3dbd002c1be22ea1829afedfc64f1_1598764

 

 

 

Spring Web MVC HelloWorld 예제가 다운로드 된다.

Home.jsp에서 한글 인코딩을 위해 아래처럼 page 지시자에 pageEncoding을 추가하자.

 

<%@ page session="false" pageEncoding="EUC-KR"%>

 

 

브라우저에서 localhost:8080/webmvc 라고 입력해서 결과를 확인하자.

 

6ff3dbd002c1be22ea1829afedfc64f1_1598764
 

 

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에 적재된다.

 

6ff3dbd002c1be22ea1829afedfc64f1_1598764
 

 

 

 #스프링컨텍스트, #컨텍스트로더리스너, #디스패처서블릿, #스프링동영상, #스프링설정파일, #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...