! 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기 바랍니다 !
WebApp21
■■■ Sevlet(서블릿) ■■■
0. 웹 어플리케이션을 구축하기 위한 웹 프로그램을 구성하는 언어의 한 종류.
(JAVA 기반)
1. JSP 에서 정적인 부분을 담당하고, Servlet 에서는 동적인 처리를 위한
부분으로 사용되어 보다 효율적인 웹 어플리케이션을 구축할 수 있다.
- JSP → 단점, MVC 패턴을 적용하기 힘들다.
- Servlet → 단점, 웹 페이지(view) 작성이 번거롭고 복잡하다.
- Servlet + JSP → MVC 패턴 적용 및 웹 페이지(view)를 보다 편리하게 작성.
단점, 구조가 복잡해지게 된다.
2. JSP 는 내부적으로 Web Container 가 Servlet 으로 변경시켜준다.
3. WEB-INF 는 환경 설정 파일이 저장되는 곳
(→ 외부에서는 접근 불가 / 금지) check~!!!
- lib : 라이브러리 파일을 저장(ojdbc6.jar, jstl.jar등)
- J2SE
- J2EE
- classes : class 파일이 저장(servlet)
『classes > 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()』과 『destroy()』는 단 한 번 호출되며
『service()』는 클라이언트의 요청이 있을 때 마다 호출된다.
이제는 JSP 를 『service()』 메소드 내부에 코딩하는 것과 같다.
5. 일반적으로 『GenericServlet』 이나 『HttpServlet』을 활용한다.
6. URL 패턴을 지정하는 방법은 크게 3가지 이다.
- 『/a』
- 『/*』
- 『.do』 --확장자
7. web.xml 을 수정하면 서버를 꼭 재구동한 이후에 실행해야 한다.
8. JSP를 공부한 지금까지는
JSP(입력) → JSP(처리, 결과)의 구조였으나
Servlet 을 다루게 된 이후에는
JSP(입력) → Servlet(결과를 위한 처리) → JSP(결과) 방식으로 구성된다.
SampleServlet.java
: 기본 틀
/*======================
SampleServlet.java
=======================*/
package com.svt;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SampleServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
}
}
WEB-INF > web.xml
<servlet>
<servlet-name>hongjildong</servlet-name> 3. 이름이 있으면
<servlet-class>com.svt.Test1</servlet-class> 4. 실행하게 해라
</servlet>
<servlet-mapping>
<servlet-name>hongildong</servlet-name> 2. 이 이름을 찾아라
<url-pattern>/test1</url-pattern> 1. 요청이 들어오면 (실행되는 url이 이런 패턴을 가졌으면)
</servlet-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>WebApp00</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- Test1 클래스 → Servlet 구성 ① -->
<!--
<servlet>
<servlet-name>gogildong</servlet-name> 3. 이름이 있으면
<servlet-class>com.svt.Test1</servlet-class> 4. 실행하게 해라
</servlet>
<servlet-mapping>
<servlet-name>gogildong</servlet-name> 2. 이 이름을 찾아라
<url-pattern>/test1</url-pattern> 1. 요청이 들어오면
</servlet-mapping>
-->
<!-- Test1 클래스 → Servlet 구성 ② -->
<!--
<servlet>
<servlet-name>gogildong</servlet-name>
<servlet-class>com.svt.Test1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gogildong</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
-->
<!-- Test1 클래스 → Servlet 구성 ③ -->
<!--
<servlet>
<servlet-name>gogildong</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>13</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>gogildong</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
-->
<!-- Test1 클래스 → Servlet 구성 ④ -->
<servlet>
<servlet-name>gogildong</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>13</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>gogildong</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
<context-param>
<param-name>type</param-name>
<param-value>말썽쟁이</param-value>
</context-param>
<!-- Test2 클래스 → Servlet 구성 -->
<servlet>
<servlet-name>test2servlet</servlet-name>
<servlet-class>com.svt.Test2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test2servlet</servlet-name>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
<!-- Test2ok 클래스 → Servlet 구성 -->
<servlet>
<servlet-name>test2okservlet</servlet-name>
<servlet-class>com.svt.Test2Ok</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test2okservlet</servlet-name>
<url-pattern>/test2ok</url-pattern>
</servlet-mapping>
</web-app>
Test1.java
: doGetPost 메소드 작성
/*=================
Test1.java
==================*/
package com.svt;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test1 extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
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("<html>");
pw.println("<title>" + "Test.java" + "</title>");
pw.println("</head>");
pw.println("<h1>name : 강백호</h1>");
pw.println("<h1>age : 19</h1>");
pw.println("<html>");
pw.println("</body>");
pw.println("</html>");
*/
//② _변하는 값
/*
String name="강백호";
String age = "19";
response .setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<html>");
pw.println("<title>" + "Test.java" + "</title>");
pw.println("</head>");
pw.println("<h1>name : " + name + "</h1>");
pw.println("<h1>age : " + age + "</h1>");
pw.println("<html>");
pw.println("</body>");
pw.println("</html>");
*/
// ③ _.xml파일에서 값을 가져와서 출력 ☆
// 『ServletConfig』
//-- 컨테이너가 서블릿을 초기화할 때
// 서블릿 당 하나씩 ServletConfig 을 생성하게 된다.
/*
ServletConfig config = getServletConfig();
// 『web.xml』 에 『<init-param>』 사용
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("<html>");
pw.println("<title>" + "Test.java" + "</title>");
pw.println("</head>");
pw.println("<h1>name : " + name + "</h1>");
pw.println("<h1>age : " + age + "</h1>");
pw.println("<html>");
pw.println("</body>");
pw.println("</html>");
*/
// ④ ☆
ServletConfig config = getServletConfig();
// 『web.xml』 에 『<init-param>』 사용
String name = config.getInitParameter("name");
String age = config.getInitParameter("age");
// 『ServletContext』
//-- ServletConfig 는 서블릿에 대한 환경을 설정하는 과정에서
// 필요한 값들을 전달하는 평태로 주로 사용하지만...
// ServletContext 는 서블릿에서 사용되는 컨텍스트로
// 구성하는 형태로 활용된다.
ServletContext context = getServletContext();
// ”web.xml』 에 <context~prpram>,사용
String type = context.getInitParameter("type");
response .setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("<html>");
pw.println("<title>" + "Test.java" + "</title>");
pw.println("</head>");
pw.println("<h1>name : " + name + "</h1>");
pw.println("<h1>age : " + age + "</h1>");
pw.println("<h1>type : " + type + "</h1>");
pw.println("<html>");
pw.println("</body>");
pw.println("</html>");
}
}
WEB-INF 파일에 Test2.jsp와 Test2_ok.jsp를 담아놓으면
더 이상 Test2.jsp 와 Test2_ok.jsp를 직접적으로 실행시킬 때 내용을 보여줄 수 없음
경로를 /WEB-INF/Test2.jsp 나 /WEB-INF/Test2_ok.jsp로 설정하여 넘겨줘야 내용 보기 가능
따라서 WebContent 에 test2의 빈 파일을 만들어서 실행시키기만해도(이때의 url 이 /test2이기 때문에)
web.xml에서 만들었던
이 구문을 통해 Test2.java > Test2.jsp > Test2Ok.java > Test2_ok.jsp 가 모두 실행됨.
Test2.java
/*======================
Test2.java
=======================*/
package com.svt;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test2 extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 포워딩~!!!
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Test2.jsp");
rd.forward(request, response);
}
}
Test2.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test2.jsp</title>
<link rel="stylesheet" type="text/CSS" href="css/main.css">
</head>
<body>
<div>
<h1>서블릿에서 데이터 흐름</h1>
<hr>
</div>
<div>
<form action="<%=cp %>/test2ok" method="post">
이름 <input type="text" name="name" class="txt"><br>
나이 <input type="text" name="age" class="txt"><br>
<button type="submit" class="btn">확인</button>
</form>
</div>
</body>
</html>
Test2ok.java
/*=================
Test2OK.java
==================*/
package com.svt;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test2Ok extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGetPost(request, response);
}
protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 서블릿 관련 코딩
// 이전 페이지(Test2.jsp)로부터 데이터 수신
// → name, age
// 한글 깨짐 방지 인코딩 처리
request.setCharacterEncoding("UTF-8");
// 데이터 수신
String strName = request.getParameter("name");
String strAge = request.getParameter("age");
// 업무 처리
String str = "이름은 " + strName + "이며, 나이는 " + strAge + "세 입니다.";
// 처리한 업무 넘기기
request.setAttribute("result", str);
//-- 포워딩하는 페이지에 처리한 값을 넘기기 위한 준비(설정)
// 즉, str 값을 result라는 이름으로 Test2_ok.jsp 페이지로 넘길 준비
// 포워딩~!!!
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Test2_ok.jsp");
rd.forward(request, response);
}
}
Test2_ok.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
// 이전 페이지(Test2OK.java)로부터 데이터 수신
// → result
String result = (String)request.getAttribute("result");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test02_ok.jsp</title>
<link rel="stylesheet" type="text/CSS" href="css/main.css">
</head>
<body>
<div>
<h1>최종 결과값 수신</h1>
<hr>
</div>
<div>
<h2><%=result %></h2>
</div>
</body>
</html>
! 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기 바랍니다 !
'JAVA개념&실습' 카테고리의 다른 글
WEB : [0607] JSTL 코어 실습 (0) | 2023.06.14 |
---|---|
WEB : [0602] EL / JSTL (0) | 2023.06.06 |
WEB : [0602] JDBC 연동 게시판 작성 실습04 (댓글기능추가) (0) | 2023.06.06 |
WEB : [0602] JDBC 연동 게시판 작성 실습03 (0) | 2023.06.06 |
WEB : [0602] JDBC 연동 게시판 작성 실습02 (0) | 2023.06.06 |