스터디 용 블로그
pageContext 내장 객체 / Java 에서 getServletContext() 의 사용 본문
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() 의 사용
* 참고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를 넘여주는 겁니다.