📚 Study/JSP & Servlet

JSP & Servlet :: Servlet(서블릿) 개념과 실습(ServletConfig, ServletContext)

bono-hye 2023. 12. 21. 00:28

🔎 Servlet (서블릿)

웹 어플리케이션을 구축하기 위한 웹 프로그램을 구성하는 언어의 한 종류. (JAVA 기반)

 

1. JSP에서 정적인 부분을 담당하고, Servlet 에서는 동적인 처리를 위한 부분으로 사용

   → 보다 효율적인 웹 어플리케이션을 구축할 수 있다.

언어 단점
JSP MVC 패턴을 적용하기 힘들다.
Servlet 웹 페이지(view) 작성이 번거롭고 복잡하다. (불편하다.)
Servlet + JSP 구조가 복잡해지게 된다.
but, MVC 패턴 적용 및 웹 페이지(view) 를 보다 편리하게 작성할 수 있다.

 

2. JSP 는 내부적으로 Web Container 가 Servlet 으로 변경시켜준다.

 

3. WEB-INF 는 환경 설정 파일이 저장되는 곳

   → 외부에서는 접근 불가 / 금지

lib 라이브러리 파일을 저장(ojdbc6.jar, jstl.jar 등)
J2EE  
J2SE  
Classes class 파일이 저장(servlet)
class > com > util > MyUtil.class
원래는 위와 같이 만들어야 하지만 이클립스가 자동으로 연결
실제 위치는 아래와 같음
C:\WebStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\WebApp20\org\apache\jsp
*.jar java
*.war web(프로젝트 아래 모든 것을 압축할 때)
*.ear jar + war
web.xml context path 의 환경 설정  (배치 기술서 같은 역할!)

 

4. 『init()』 과 『 destory() 』단 한번 호출되며, 『 service() 』 는 클라이언트의 요청이 있을 때 마다 호출된다.

    이제는 JSP 를 『 service() 』 메소드 내부에 코딩하는 것과 같다.

 

5. 『GenericServlet』 이나 『HttpServlet』 을 활용한다.

 

6. URL 패턴을 지정하는 방법은 크게 3가지이다.

 - 『/a』

 - 『/*』

 - 『.do』

 

7. web.xml 을 수정하면 서버를 꼭 재구동한 이후에 실행해야 한다.!!!

 

8. 지금까지 한 실습들은

    JSP(입력) → JSP(처리, 결과)였으나

    JSP 와 함께 Servlet 을 다루게 된 이후에는

    JSP(입력) → Servlet(결과를 위한 처리) → JSP(결과) 방식으로 구성된다.

 


📃 Test1

# Test1.java

① 첫번째 방식

  - 직접적인 값으로 HTML 형식 구성해서 웹페이지에서 확인하는 방법.

protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	response.setContentType("text/html; charset=UTF-8");
	PrintWriter pw = response.getWriter();
    
	pw.println("<html>");
	pw.println("<head>");
	pw.println("<title>" + "Test1.java" + "</title>");
	pw.println("</head>");
	pw.println("<body>");
	pw.println("<div>");
	pw.println("<h1>name : " + "홍길동" + "</h1>");
	pw.println("<h1>age : " + 19 + "</h1>");
	pw.println("</div>");
	pw.println("</body>");
	pw.println("</html>");
}
<servlet>
	<servlet-name>abc</servlet-name>
 	<servlet-class>com.svt.Test1</servlet-class>
</servlet>
  
<servlet-mapping>
 	<servlet-name>abc</servlet-name>
	<url-pattern>/test1</url-pattern>
</servlet-mapping>

 

↓ 내가 헷갈리거나 잊지 않기 위한 코드 설명

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

응답의 ContentType 설정하고~

PrintWriter pw = response.getWriter();

텍스트 데이터를 출력하는데 사용할 수 있는 PrintWriter 객체 생성

이 객체를 통해 서블릿에서 생성한 데이터를 웹 페이지로 출력할 수 있음!

 

② 두번째 방식

- 변수 선언 후 변수로 형식 구성해서 웹 페이지에 출력

protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	String name = "둘리";
	int age = 21;
		
	response.setContentType("text/html; charset=UTF-8");
	PrintWriter pw = response.getWriter();
		
	pw.println("<html>");
	pw.println("<head>");
	pw.println("<title>" + "Test1.java" + "</title>");
	pw.println("</head>");
	pw.println("<body>");
	pw.println("<div>");
	pw.println("<h1>name : " + name + "</h1>");
	pw.println("<h1>age : " + age + "</h1>");
	pw.println("</div>");
	pw.println("</body>");
	pw.println("</html>");
}
<servlet>
  	 <servlet-name>abc</servlet-name>
  	 <servlet-class>com.svt.Test1</servlet-class>
</servlet>
  
<servlet-mapping>
   	<servlet-name>abc</servlet-name>
  	<url-pattern>/test1</url-pattern>
</servlet-mapping>

첫 번째 방식이랑 값 직접 쓰기, 변수 선언해서 변수로 쓰는 것 외에는 차이 없음^~^ 다음 방법으로 고고~!

 

③ 세번째 방식

- 위 2가지 방식은 보여줄 내용이 바뀌면 프로젝트 다시 짜서 다시 코딩해야 함!

   java 에서 변수 , 값 넣어줬는데 배포가 class 로 되기 때문에 java 파일 수정을 못하겠죵~?

   but, 세번째 방식 즉! web.xml 에서 값을 넣어주는 방식은 java에 비해 쉬운 수정 가능

   코드가 배포되어도 java가 아닌 web.xml을 수정하면 되니까!

protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	ServletConfig config = getServletConfig();
		
	String name = config.getInitParameter("name");
	String age = config.getInitParameter("age");

	response.setContentType("text/html; charset=UTF-8");
	PrintWriter pw = response.getWriter();
		
	pw.println("<html>");
	pw.println("<head>");
	pw.println("<title>" + "Test1.java" + "</title>");
	pw.println("</head>");
	pw.println("<body>");
	pw.println("<div>");
	pw.println("<h1>name : " + name + "</h1>");
	pw.println("<h1>age : " + age + "</h1>");
	pw.println("</div>");
	pw.println("</body>");
    pw.println("</html>");
}
<servlet>
	 <servlet-name>abc</servlet-name>
  	 <servlet-class>com.svt.Test1</servlet-class>
  	 <init-param>
  		<param-name>name</param-name>
  		<param-value>홍길동</param-value>
  	 </init-param>
     <init-param>
  		<param-name>age</param-name>
  		<param-value>21</param-value>
  	 </init-param>
</servlet>
  
<servlet-mapping>
  	<servlet-name>abc</servlet-name>
  	<url-pattern>/test1</url-pattern>
</servlet-mapping>

➰체크할 내용

1) ServletConfig config = getServletConfig();

  - 컨테이너가 서블릿을 초기화 할 때, 서블릿 당 하나씩 ServletConfig 를 생성하게 된다. init() 메소드 내에서

    이 객체를 사용함으로써 getInitParameter로 외부 값을 받아올 수 있다.

2) String 변수명 = config.getInitParameter("____");

 

③ 네번째 방식

- ServletConfig는 서블릿에 대한 환경을 설정하는 과정에서 필요한 값들을 전달하는 형태로 주로 사용된다면,

  ServletContext는 서블릿에서 사용되는 컨텍스트를 구성하는 형태로 활용된다.

protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	ServletContext context = getServletContext();
	
    String name = config.getInitParameter("name");
	String age = config.getInitParameter("age");
	String type = context.getInitParameter("type");
		
	response.setContentType("text/html; charset=UTF-8");
	PrintWriter pw = response.getWriter();
		
	pw.println("<html>");
	pw.println("<head>");
	pw.println("<title>" + "Test1.java" + "</title>");
	pw.println("</head>");
	pw.println("<body>");
	pw.println("<div>");
	pw.println("<h1>name : " + name + "</h1>");
	pw.println("<h1>age : " + age + "</h1>");
		
	pw.println("<h1>type : " + type + "</h1>");
		
	pw.println("</div>");
	pw.println("</body>");
	pw.println("</html>");
}
<servlet>
	 <servlet-name>abc</servlet-name>
  	 <servlet-class>com.svt.Test1</servlet-class>
  	 <init-param>
  		<param-name>name</param-name>
  		<param-value>홍길동</param-value>
  	 </init-param>
     <init-param>
  		<param-name>age</param-name>
  		<param-value>21</param-value>
  	 </init-param>
</servlet>
  
<servlet-mapping>
  	<servlet-name>abc</servlet-name>
  	<url-pattern>/test1</url-pattern>
</servlet-mapping>

<context-param>
	<param-name>type</param-name>
	<param-value>유머러스</param-value>
</context-param>


📃 Test2

~ 졸림 이슈로 내일 이어서,, 투비컨티뉴,,,^~^