확장자가 .java인 파일
자바의 일반적인 클래스와 동일한 개념
웹을 다룰 수 있도록 해주는 "HttpServlet"클래스를 상속받은 클래스를 의미
웹서버에서 서블릿/JSP 실행 불가. 서블릿/JSP실행기가 있어야 실행 가능
서블릿/JSP실행 엔진용 WS : 톰캣, 레진, 웹로직/웹스피어/제우스
- 웹로직/웹스피스/제우스 (톰캣X)
WAS (WebApplicationServer) : WebServer + ApplicationServer + 다양한서비스
웹서버연동 : 톰캣 + 아파치 / 톰캣 + IIS / 톰캣 + nginx
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
properties -> resuorce
톰캣에 배포된 구조가 표준화된 구조이다.
배포 될때는 src는 필요 없이 class만 필요하다.
톰캣 시작 -> 웹 컨텍스트별 ServletContext 타입의 객체 생성
웹컨텍스트 =웹 모듈 = 웹어플리케이션
ex) back / back 2
객체 생성시 init( ) 자동 호출
HttpServlet은 GenericServlet로부터 상속
호출이 끝나고 나면 Request 객체, Response객체는 사라진다
요청할때마다 생성되고, 요청이 끝나면 사라짐.
Servlet 기존 객체 내용과 리로드된 클래스가 일치 하지않으면 servlet객체는 메모리에서 소멸 됨.
객체소멸시 destroy( ) 자동호출됨
톰캣이 꺼질 때 ServletContext타입의 객체는 자동 소멸 된다
어트리뷰트 : 좀 더 오랫동안 살아있어야 할 어트리뷰트는 ServletContext에 등록하면 됨.
Requst에 어트리뷰트를 넣으면 요청과 응답이 사라지면 사라짐.
HttpServletRequest : 사용자가 보낸 데이터를 저장하는 객체 -> 데이터관련된 기능제공하는 객체
HttpServletResponse : 사용자(client)에게 응답할 정보를 가지고 있는 객체
HttpServletResponse객체를 이용해서 응답 메세지 작성하기
↓
이제 생성된 서블릿 web.xml에서 등록하고 mapping하기
-<servlet></servlet>태그를 이용해서 등록
<servlet-name> : web.xml내부에서 사용하는 이름(변수명), 서블릿을 구별함
<servlet-class> : 등록할 서블릿의 경로와 이름 * 패키지명까지 작성
*위에 두태그가 없으면 실행안됨
- mapping해주기 등록된 서블릿을 주소와 맵핑
<servlet-name> : 등록한 서블릿의 servlet-name값을 가져와 사용
<url-pattern> : 연결된 주소의 명칭
interface를 구현한 하위 클래스가 있어야함
하위 클래스는 톰캣이 제공 함.
2.5버전은 web.xml (배치 기술서)을 만들어주어야 함.
3.0버전부터 WebServlet 어노테이션으로 변경되어 web.xml이 필요없게됨
서블릿 요청 방법
1) url입력해서 요청
서블릿 엔진이 객체 생성 후 init( )호출
init( ) 호출 되기 전까지는 sc객체 값이 null
init( )연결이 되면 reload됨
요청할때마다 servlet객체가 있는 경우 doGet( ), doPost( )호출
servlet객체가 없는 경우 init( ) 호출
지역변수 -> 멤버변수로 변경
reload가 되는 시간동안은 실제 서비스가 되지 않기 때문에 시스템을 잠시 중단해야 한다.
이때 사용자 입장에서는 사용하지 못 하기 때문에 매출에 많은 영향을 줄 수 있다.
중단 했다 재컴파일 했다가 reload될때까지 기다렸다가 다시 실행 해주어야 함.
현업에서 배포하는 시간이 반 나절 이상 걸리는 경우가 많음.
결론적으로 소스 코드를 재컴파일 하지 않는게 가장 좋음.
그래서 a.txt를 xml파일로 빼주는게 좋다!
servletContext객체의 parameter로 등록 됨.
parameter값이 오래동안 유지되어야 할 값인 경우, sevletContext에 등록하면 됨.
요청
getParameter( );
getParameterValues( );
응답
1. 응답형식 지정
렌더링 엔진이 어떤식으로 해석할지 미리 알려줘야 함.
print( ) 권장
package control;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.Scanner;
import javax.servlet.Servlet;
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 Lifecycle extends HttpServlet {
private static final long serialVersionUID = 1L;
private String aFileRealPath;
/**
* @see HttpServlet#HttpServlet()
*/
public Lifecycle() {
super();
// ServletContext sc = this.getServletContext();
// String aFileRealPath = sc.getRealPath("a.txt"); //톰캣의 배포경로 \a.txt파일의 실제 경로얻기
// System.out.println("a.txt파일의 실제 경로:" + aFileRealPath);
}
/**
* @see Servlet#init(ServletConfig)
*/
private String developer;
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext sc = this.getServletContext();
developer = sc.getInitParameter("developer");
String fileName = this.getInitParameter("fileName");
aFileRealPath = sc.getRealPath("a.txt");
System.out.println("a.txt파일의 실제 경로:" + aFileRealPath);
System.out.println("init()호출됨");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("doGet()호출됨, 총개발자:" + developer);
FileInputStream fis = null;
try {
fis = new FileInputStream(aFileRealPath);
Scanner sc = new Scanner(fis);
while(sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
}catch(IOException e) {
e.printStackTrace();
}finally {
if(fis != null) {
}try {
fis.close();
}catch(Exception e) {
}
}
System.out.println("request.getContextPath():" + request.getContextPath()); // "/backstudy"
System.out.println("request.getRequestURL():" + request.getRequestURL()); // "/backstudy/life"
System.out.println("request.getServletContext():" + request.getServletContext());
System.out.println("request.getServletpath():" + request.getServletPath());
System.out.println("request.getContentType(): "+ request.getContentType());
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value =request.getHeader(name);
System.out.println("request header name =" + name + ",value=" + value);
}
System.out.println("request.getContentType() = " + request.getContentType());
//요청전달데이터 얻기
String tValue = request.getParameter("t"); // "~/life?t=bbbccddee" "~/life?t=" "~/life" //"~/life?t="
System.out.println("요청전달데이터 t=" + tValue); //"ab" "" null
String[] cValues = // "~/life?c=1&c=2 "~life?"
request.getParameterValues("c");//{1,2} null
if(cValues != null) {
for(String cValue: cValues) {
System.out.println("요청전달데이터 c=" + cValue);
}
}
//--------------------------------------------------
//---응답형식지정 : MIME
response.setContentType("text/html;charset=utf-8"); //application/json
//응답출력 스트림 얻기
PrintWriter out = response.getWriter();
out.print("<h1>WELCOME</h1>");
out.print("<h3>lucy입니다</h3>");
out.println(new Date()); //new Date().toString()
out.print("<hr>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package control;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
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;
/**
* Servlet implementation class A
*/
public class A extends HttpServlet {
private static final long serialVersionUID = 1L;
private String aFileRealPath;
private String developer;
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext sc = this.getServletContext();
developer = sc.getInitParameter("developer");
String fileName = this.getInitParameter("fileName");
aFileRealPath = sc.getRealPath(fileName);
System.out.println(fileName + "파일의 실제경로: " + aFileRealPath);
System.out.println("init()호출됨");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileInputStream fis = null;
try {
fis = new FileInputStream(aFileRealPath);
Scanner sc = new Scanner(fis);
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
}catch (IOException e) {
}finally {
if(fis != null) {
try {
fis.close();
}catch (Exception e) {
}//catch
}//if
System.out.println("doGet()호출됨, 총개발자: " + developer);
}//finally
}//doget()
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>backstudy</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<context-param>
<param-name>developer</param-name>
<param-value>임쥰</param-value>
</context-param>
<servlet>
<description></description>
<display-name>Lifecycle</display-name>
<servlet-name>Lifecycle</servlet-name>
<servlet-class>control.Lifecycle</servlet-class>
<init-param>
<param-name>fileName</param-name>
<param-value>a.txt</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Lifecycle</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>A</display-name>
<servlet-name>A</servlet-name>
<servlet-class>control.A</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>A</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
</web-app>
'개발 공부 > WEB' 카테고리의 다른 글
jsp / Servlet (0) | 2023.07.12 |
---|---|
redirect / forward (1) | 2023.07.11 |
Jackson library 설치 (0) | 2023.07.07 |
ajax / jquery (0) | 2023.07.05 |
JavaScript (0) | 2023.07.03 |