🔎 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
~ 졸림 이슈로 내일 이어서,, 투비컨티뉴,,,^~^