서블릿 고급1

//서블릿Forward

정의 : 특정 서블릿에 대한 요청을 다른 서블릿이나 JSP 로 요청을 넘겨주는 작업

용도 : 요청에 대한 처리작업을 분산시킬 목적(하나의 요청을 여러 서블릿이 공유)

      MVC모델의 Controller에서 View로 요청을 넘길 때 사용

방법 :

-redirect(응답이용)  

 response.sendRedirect(‘list.jsp’);

-dispatche (일반적인 forward)(요청이용)

 RequestDispatcher dis = request.getRequestDispatcher(‘list.jsp’);

 dis.forward(request,response);

 

//redirect방법(응답이용)

특징 :

-서블릿이 포워드 할 때 클라이언트에서 재요청된다.,  URL이 포워드될곳으로 재설정

-재요청으로 인해 dispatche보다 성능이 떨어짐

-요청시 바인딩된 데이터가 지속되지 못함.(바인딩 : 데이터를 등록하는 작업)

 

예제1)

Public class HelloServlet extends HttpServlet{

 Public void doGet(HttpServletRequest request, HttpServletResponse response){

Response.setContentType(“text/html; charset=euc-kr);

PrintWriter out = response.getWriter();

out.print(“redirect!!”);

response.sendRedirect(“tohello”);

 }

}

 

 

Public class ToHelloServlet extends HttpServlet{

 Public void doGet(HttpServletRequest request, HttpServletResponse response){

Response.setContentType(“text/html;charset=euc-kr”);

PrintWriter out = response.getWriter();

Out.println(“<html><body>”);

Out.println(“hello world!!”);

Out.println(“</body></html>);

 }

}

 

<web-app>

  <servlet>

<servlet-name>Hello</servlet-name>

   <servlet-class>test.web.HelloServlet</servlet-class>

</servlet>

<servlet>

 <servlet-name>ToHello</servlet-name>

 <servlet-class>test.web.ToHelloServlet</servlet-class>

</servlet>

<servlet-mapping>

 <servlet-name>Hello</servlet-name>

 <url-pattern>/hello</url-pattern>

</servlet-mapping>

<servlet-mapping>

 <servlet-name>ToHello</servlet-name>

 <url-pattern>/tohello</url-pattern>

</servlet-mapping>

</web-app>

 

->1.클라이언트가 HelloServlet요청 

->2.response.sendRedirect(“tohello”);   //tohello재요청해라 라는 응답

->3.클라이언트는 ToHelloServlet요청

1번과 3번은 별개의 request

주소창이 http://localhost:8090/webapp/hello 에서 http://localhost:8090/webapp/tohello 로 바뀐 것을 알수 있음.

 

//dispatche방법(forward)

특징 :

-컨테이너에서 재요청(URL재설정되지 않는다)

-클라이언트에서 포워드 발생여부를 인지 할수 없다.

-바인딩 데이터가 지속된다.

-Struts프레임워크에서는 기본적으로dispatche방법으로 구현

 

예제2)

HelloServlet Class에서

RequestDispatcher dispatch = request.getRequestDispatcher(“tohello”);

dispatche.forward(request, response);

 

->1.HelloServlet 요청

->2.request이므로 컨테이너 내에서 ToHelloServlet 재요청

1번과 2번은 동일한 request

 

 

//바인딩

정의 : 실행시 필요한 저원을 컨테이너가 인식할수 있도록 등록하는 작업, 등록된 자원은 서블릿이나 JSP에서 사용할수 있다.

용도 : 모듈화된 컴포넌트간의 자원공유가 필요할 때, MVC모델에서 Model VIew컴포넌트간 자원공유

방법 :

-setAttribute(String name, Object obj) 메소드를 이용하여 바인딩

-getAttribute(String name)메소드를 이용 자원 반환

-removeAttribute(String name)메소드를 이용 자원삭제.

Scope : servlet-context, HttpSession, HttpServletRequest, +

 

예제3) HttpServletRequest scope에서의 redirect 바인딩 예제

-HelloServlet Class

request.setAttribute(“test”, “강대철”);

response.sendRedirect(“tohello”);

 

-ToHelloServlet Class

String name = (String)request.getAttribute(“test”);

Out.println(name+”hello world!!);

 

A)결과값 name = null (서로 다른 요청이기 때문에 바인딩 데이터 상실)

 

예제4) HttpServletRequest scope에서의 dispatche 바인딩 예제

-HelloServlet Class

Request.setAttribute(“test”,”강대철”);

RequestDispatcher dispatch = request.getRequestDispatcher(“tohello”);

Dispatch.forward(request, response);

 

-ToHelloServletClass 동일

 

A)결과값 name = 강대철(같은 요청이므로 바인딩 데이터 유지)

 

 

//servletContext

특징

-javax.servlet.ServletContext로 정의

-서블릿과 컨테이너간에 통신하기 위해서 사용되어짐

-컨텍스트마다 하나의 ServletContext가 생성된다(context Servlet간 공유가능)

-ServletContext 객체는 컨테이너와 동일한 LifeCycle을 갖는다.

용도 :

-서블릿에서 파일접근시 사용, 자원을 바인딩할 때

-로그파일 작성시, context파라미터를 이용할 때

 

/주요메서드

getResourceAsStream()     java.io리턴(파일접근)

log()                로그파일 작성시

getInitParameter()    초기값설정

setAttribute()        바인딩시

 

//ServletConfig

특징 :

-서블릿 초기화시 필요한 정보를 컨테이너에서 제공받을수 있다.

-서블릿마다 하나의 ServletConfig가 생성된다(공유불가)

-서블릿과 동일한 Life Cycle

용도 :

-ServletContext을 얻을 때 사용, 초기 파라미터 이용시 사용

 

예제5) ServletConfig – Servlet 초기값지정

-Web.xml에 파라미터를 설정하고 특정 서블릿에서만 사용할수 있다.

-서블릿에서는 ServletConfig객체의 getInitParameter() 이용하여 설정된 값 사용.

 

<web-app>

 <servlet>

<servlet-name>init</servlet-name>

<servlet-class>test.web.InitParamServlet</servlet-class>

<init-param>

 <param-name>driver</param-name>

 <param-value>oracle.jdbc.driver.OracleDriver</param-value>

</init-param>

<init-param>

 <param-name>url</param-name>

 <param-value>jdbc.oracle.thin@localhost:1521:oracle</param-value>

</init-param>

<init-param>

 <param-name>user</param-name>

 <param-value>scott</param-value>

</init-param>

<init-param>

  <param-name>pass</param-name>

  <param-value>tiger</param-value>

</init-param>

</servlet>

<servlet-mapping>

  <servlet-name>init</servlet-name>

  <url-pattern>/init</url-pattern>

</servlet-mapping>

</web-app>

 

-InitParamServlet Class

String driver = getInitParameter(“driver”);

String url = getInitParameter(“rul”);

String user = getInitParameter(“user”);

String pass = getInitParameter(“pass”);

Out.println(driver+url+user+pass);

 

예제5) ServletContext – Servlet 초기값지정

Context파라미터 사용

Web.xml에 파라미터 설정하고 여러 서블릿에서 사용할수 있다(공유가능)

 

<web-app>

 <context-param>

<param-name>driver</param-name>

<param-value>oracle.jdbc.driver.OracleDriver</param-value>

</context-param>

 

<servlet>…</servlet>

<servlet-mapping>…</servlet-mapping>

</web-app>

 

-ContextParamServlet Class

ServletContext context = getServletContext();

String driver = context.getInitParameter(“driver”); …

 

다른 서블릿에서도 초기값이 정해진 Servlet을 얻어올수 있음.

 

 

예제6)서블릿의 파일접근 사용

-여러 서블릿에서 특정 파일 접근, getResourceAsStream() 이용

WEB-INF/file.txt 생성

File.txt = ‘oracle.jdbc.driver.OracleDriver&jdbc:oracle:thin:@localhost:1521:oracle&scott&tiger’

 

-ContextFileServlet Class

ServletContext context = getServletContext();

InputStream is = context.getResourceAsStream(“/WEB-INF/file.txt”);

BufferedReader buffer = new BufferedReader(new InputStreamReader(is));

While((s=buffer.readLine() != null){

 StringTokenizer tokens = new StringTokenizer(s, “&”);

 driver = tokens.nextToken();

 url = tokens.nextToken();

 

}

Out.println(driver + url+ user+pass);

 

 

/자원의 바인딩과 로그 사용

-여러 서블릿에서 자원을 접근하여 사용 공유

-setAttribute() 자원 바인딩, getAttribute()자원 사용, log() 로그파일 작성

 

-ContextAttServlet

ServletContext context = getServletContext();

ArrayList list = new ArrayList();

List.add(“강대철”);

List.add(new Integer(22));

Context.setAttribute(“data”, list);

 

-ContextAttServlet2

ServletContext context = getServletContext();

ArrayList list = (ArrayList)context.getAttribute(“data”);

String name = (String)list.get(0);

Int age = (Integer)list.get(1);

Context.log(“저장이름은>>”+name+”나이는 >>”+age);

Out.println(<html><body> name + age</body></html>);

 

log파일은 Tomcat홈디렉토리/logs 안에 txt파일로 저장

 

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 대절님

댓글을 달아 주세요



티스토리 툴바