반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

스터디 용 블로그

pageContext 내장 객체 / Java 에서 getServletContext() 의 사용 본문

카테고리 없음

pageContext 내장 객체 / Java 에서 getServletContext() 의 사용

워후 2015. 1. 20. 11:50
반응형

pageContext 내장 객체


- pageContext 객체는 현재 JSP 페이지의 컨텍스트(Context)를 나타내며, 주로 다른 내장 객체를 구하거나 페이지의 흐름 제어 그리고 에러 데이터를 얻어낼 때 사용된다.


- pageContext 내장 객체는 javax.servlet.jsp.PageContext 객체 타입으로 ,JSP에서는 pageContext 객체로 사용된다.


- pageContext 내장 객체의 메소드


 메소드

설명 

 ServletRequest getRequest()

페이지 요청 정보를 가지고 있는 request 내장 객체를 리턴한다. 

ServletResponse getResponse() 

페이지 요청에 대한 응답 정보를 가지고 있는 response 내장 객체를 리턴한다. 

JSPWriter getOut() 

페이지 요청에 대한 출력 스트림인 out 내장 객체를 리턴한다. 

HttpSession getSessoin() 

요청한 웹 브라우저의 세션 정보를 담고 있는 session 내장 객체를 리턴한다. 

ServletContext getServletContext() 

페이지에 대한 서블릿 실행 환경 정보를 담고 있는 application 내장 객체를 리턴한다. 

Object getPage() 

page 내장 객체를 리턴한다. 

ServletConfig getServletConfig() 

해당 페이지의 서블릿 초기 정보 설정 정보를 담고 있는 config 내장 객체를 리턴한다. 

Exception getException() 

페이지 실행 중에 발생되는 에러 페이지에 대한 예외 정보를 갖고 있는 exception 내장 객체를 리턴한다. 



<%

JSPWriter outObject = pageContext.getOut();        // out 내장 객체 리턴

%>

http://hyeonstorage.tistory.com/82




Java 에서 getServletContext() 의 사용


원문 출처 : http://pdw213.egloos.com/3491837



일반적인 JSP페이지에서는 getServletContext()의 사용법은

ServletContext context = getServletContext();

이렇게 사용할수 있다

하지만 MVC(모델2) 방식의 경우 

public class BoardWriteOkAction implements ControllerAction{

 @Override
 public String requestPro(HttpServletRequest request,
   HttpServletResponse response) throws Throwable {

    return "/community/write_ok.jsp";
 }

처럼 컨트롤러 인터페이스를 상속받아 처리하게 되는데 
이때는 위와 같은 방식으로는 사용할 수없다.

ServletContext context = request.getSession().getServletContext();

위와 같이 사용하면 웹어플리케이션상의 절대경로를 구할수 있는 ServletContext()를 구할 수 있다.

절대경로는 String realFolder = context.getRealPath("upload");
이렇게 구해서 파일 업로드의 절대경로를 구하면 된다.



* 참고1 (원문 출처)

ServletContext

 

ServletContext 는 웹어플리케이션 전역에서 사용할 수 있는 값입니다하나의 서블릿이 서블릿 컨테이너와 통신하기 위해서 사용되어지는 메서드들을 가지고 있는 클래스를 말합니다. 서블릿이나 jsp 에 하드코딩하기 껄끄러운 값들을 DD에 기록하여 사용합니다이를테면관리자 이메일 주소회사 주소, DB 접속 정보와 같이 App 전역에서 두루 사용되면서자주 바뀌지 않는 값을을 설정할 때 사용할 수 있습니다사용법은 ServletConfig와 매우 비슷한데차이점이라면 ServletConfig는 특정 서브릿에 등록하여 사용하는 값이지만, ServletContext App 전역에서 사용할 수 있다는 점입니다.  

 

사용 예

 

web.xml

<web-app …>

    <context-param>

        <param-name>contextEmail</param-name>

        <param-value>cs9008@hanmail.net</param-value>

    </context-param>

    <context-param>

        <param-name>cellphone</param-name>

        <param-value>010-9922-05xx</param-value>

    </context-param>

</web-app>

 

ServletContextTest.java

 

package web;

 

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.*;

public class ServletContextTest extends HttpServlet {

 

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();

       

out.println("<h2> 컨텍스트 초기화 파라메터 </h2>");

       

        Enumeration enum = getServletContext().getInitParameterNames();

        while (enum.hasMoreElements())

            out.println("param name = " + enum.nextElement() + "<br />");

        out.println(getServletContext().getInitParameter("contextEmail") + "<br />");

        out.println(getServletContext().getInitParameter("cellphone") + "<br />");

    }

}



>> ServletContext의 메서드

 

+ 주요 사용 메소드

String getInitParameter(String name)

Enumeration getInitParameterNames() 

getInitParameter  name 값을 이용해서 value 값을 얻어 올 때 사용하며,

getInitParameterNames name 값을 Enumeration 형으로 리턴합니다.

+ ServletConfig 의 getInitParameter() 는 미리 web.xml 에다가 지정해둔 파라미터들의 값을 얻어 올 수 있습니다.

 



* 참고2 (원문 출처)

질문 : ServletContext와 RequestDispatcher가 모르겠어요......



답변 : 
 

안녕하세요. 일단 J2EE API를 보셨다면 ServletContext RequestDispatcher에 대해서 자세히 설명하고 있을텐데요. 아쉽습니다. 

덧글의 길이에 한정된 분량으로 답변을 하자면, 

ServletContext라는것은 서블릿의 컨텍스트 클래스의 인스턴스를 말하는것입니다. 


자 하나 하나 따라가 봅시다. 

나락님께서 어떠한 서블릿 또는 JSP를 만들었다고 합시다. 

그 서블릿은 어떠한 클래스 일까요? 아마도 HttpServlet을 상속받는 어떠한? 클래스 일테죠. 

그 클래스를 보면 아마도 실제 요청을 서비스하는 doGet과 doPost등이 정의되어 있을것이고, init와 destroy역시 준비되어 있겠죠. 

그래서 컨테이너는 HttpServlet의 인스턴스를 생성하고, init를 실행해주고, 그녀석으로 매핑된 URL에 doGet이냐 doPost냐에 따라서 죽어라고 그 메서드만 실행해 주다가 

컨테이너가 종료될때 destroy를 호출해주고 죽겠죠. 

결국 HttpServlet은 아마도(가 아니고 확실히) 하나의 인스턴스만 생성되어서 멀티 스레딩으로 돌아갈것이라고 판단할 수 있겠습니다. 


그러면 이제 ServletContext를 보시죠. HttpServlet의 상속된 클래스의 인스턴스, 즉 서블릿은 스레드 안전하게 설계가 되어야 하고, 따라서 스레드 안전하게 설계되지 않은 경우에 상위 클래스를 마구 접근하다보면 에러가 나겠죠. 그래서 환경설정이나 J2EE서비스에 관한 내용은 ServletContext에서 할수 있게 됩니다. 

이 ServletContext는 getServletContext로만 받을 수 있고, 이녀석은 아마도 동기화가 제대로 구현되어 있는 녀석일겁니다. 

그래서 우리사 ServletContext의 setAttribute와 getAttribute를 마음대로 읽고 써도, 스레드 걱정은 하지 않고 마음대로 읽고 쓸 수 있는겁니다. 

또한 ServletContext의 역할은 여기에서만 그치지 않고, 다른 서블릿 인스턴스를 가져올수 있다거나, 서블릿 환경설정값을 가져올수 있는 기능들을 가지고 있습니다. 

RequestDispatcher 역시 그 기능중의 하나이구요. 


자, 그럼 RequestDispatcher에 대해서 알아 봅시다. 

RequestDispatcher는 디스패치해주는 클래스입니다.(사실 인터페이스 입니다. 정정하자면 HttpServlet역시 ServletContext역시 모두 인터페이스이고 톰캣이나 JBoss같은 녀석이 그 인터페이스를 구현한 클래스를 제공해줍니다.;;;) 


Dispatcher를 사전에서 검색하면 발송자...라는 뜻이 있다고 하네요. 

즉 RequestDispatcher는 요청을 보내주는 클래스라고 이해할 수 있겠습니다. 

따라서 현재의 요청을 다른 서블릿(궁극적으로는 JSP도 서블릿의 하나입니다.)으로 보내야하는데... 

아까 전에 설명드렸죠? 서블릿의 인스턴스는 하나만 생성되고, 이것이 

멀티스레딩으로 돌아간다는 사실. 

그래서 새로운 서블릿을 생성해서 그 서블릿을 실행하는것만으로는 안되고, 

이미 돌아가는 서블릿 인스턴스의 스레드를 하나 더 추가해야 한다는 겁니다. 

그리고 이것은 서블릿 개발자가 해야할 일을 넘었기 때문에 Dispatcher가 대신해준다는거죠. 

하지만 Dispatcher는 HttpServletRequest, HttpServletResponse를 생성해주지는 않습니다. 

그렇기 때문에 Dispatcher가 만들어준 새로운 서블릿 스레드가 있는데 

이 녀석을 실행시키려면 doGet이나 doPost를 실행시켜야 겠죠? 

그래서! 결론으로 dispatch메서드에 

HttpServletRequest, HttpServletResponse를 넘여주는 겁니다. 


반응형
Comments