Yuni Devlog
Published 2022. 6. 15. 11:14
[JSP]Servlet(서블릿) 정리 JSP

jsp를 공부하면서 처음 어려웠던 부분이 서블릿이였는데, 저 나름대로 공부하며 정리했던 내용인데 올려봅니다 !

💎Servlet

🔹웹클라이언트의 요청을 처리할 수 있는 클래스

🔹Servlet이 되기 위해서는 Httpservlet을 상속받아야 한다.

🔹a.jsp —> a_jsp.java( _jspService() )를 만드는 것을 서블릿(이건 톰캣이 함)

💎생성하기

🧙🏻‍♂️

1. HttpServlet 상속받는 서블릿 클래스 생성 : 패키지와 클래스명을 입력한 뒤 생성

src -> New -> Servlet

 

2. web.xml 작성

<servlet>
	<servlet-name>Test1</servlet-name>
	<servlet-class>a.b.Test1</servlet-class>
	<load-on-startup>1</load-on-startup>
<servlet-mapping>
	<servlet-name>Test1</servlet-name>
	<url-pattern>/Test1</url-pattern>

3. 서블릿 클래스의 doGet() 내용 작성

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	PrintWriter out=response.getWriter();
	out.write("abc");
}

4. 실행하기

http://localhost:8282/프로젝트명/Test1

💎생성하기

🧙🏻‍♀️ 생성 조건 ?

1️⃣HttpServlet 상속받아야 함 (부모여야 함, super class)

2️⃣web.xml 문서에 태그, 자동으로 생성됨   *이것들의 servlet-name 이름이 동일하면 한 쌍

3️⃣실행하기 ? http://localhost:8282/Servlet1/Test1   *url-pattern을 프로젝트 이름(Servlet1) 뒤에 적음

 

🔹톰캣 엔진은 해당 클래스를 여기서 찾음
⇒ c:/tomcat/webapps/Servlet1/WEB-INF/classes/a.b.Test1

 

🔹http://localhost:8282/Servlet1/Test1

⇒ a.b.Test1의 doGet()을 자동으로 찾음 / url에 직접 요청하면 get~

🔸a.jsp
<form action="/Servlet1/Test1" method="post">
    <input type="hidden" name="a" value="b" />
    <input type="submit" />
</form>

doPost()는 form태그 action에 Servlet1/Test1적고 method="post"적으면 찾음

🔹doGet과 doPost의 차이점

  • form태그의 method는 기본값이 get
    url에 직접 적어 요청하는 방식
    파라미터 넘어간 것 보인다
    데이터 많이 보낼 수 없다
    보안상 취약하다
  • post는 파라미터 넘어간 것 보이지 않는다
    많은 양의 데이터 보낼 수 있다
    파일 전송에 적합한 방식

🔹Test1 o=new Test(); 톰캣이 자동으로 서블릿 객체를 만듦
서블릿 객체 생성되는 시점 ? 최초의 서블릿 요청이 들어왔을 때 !
서블릿 객체는 1번만 메모리에 올라감(생성됨)

🔹서블릿의 라이프사이클

  • init() : 최초로 딱 1번 호출, 서블릿 객체가 만들어질 때
  • 서블릿 객체를 최초로 생성한 뒤, 어떤 작업을 하고 싶다면 ?
    init() 오버라이딩해서 작업내용 작성하기 !
  • destroy() : 서블릿이 메모리에서 사라질 때 호출됨, 서블릿 객체를 메모리에서 없앨 때(어떤 작업을 해야 할 때) 이것을 호출, 서블릿 객체는 톰캣을 꺼야 그 객체가 메모리에서 사라짐.

🔹서블릿 객체를 미리(톰캣 가동될 때) 생성해둘 수 있는 방법?

  • 음수
    ⇒ load-on-startup의 기본값은 음수
    ⇒ init()가 사용자 요청이 왔을 때 호출. 서블릿 객체가 사용자의 요청이 왔을 때 생성.
  • 양수
    ⇒ 이 객체를 톰캣 가동될 때 생성.
    ⇒ 톰캣을 켰을 때 init()가 호출. 서블릿 객체가 톰캣 켰을 때 생성.

🔹init()에서 시간이 많이 걸리는 일을 할 수 있음. ex)하드디스크에서 파일 읽는 것 등

 

🔹out.write("abc");

     ⇒ jsp내장 객체이기 때문에 이렇게만 쓸 수 없다.
         response객체도 jsp내장 객체이지만, doGet으로 넘어와서 사용 가능
     ⇒ PrintWriter out=response.getWriter();
         out.write("abc");
        이렇게 하면 클라이언트에 응답할 수 있다 !


🔹a.jsp / b.js / c.css / d.html / e.png / a.b.ABC(서블릿) ⇒ 파일의 위치를 알아야 함

webapps/프로젝트명/WEB-INF/classes/a.b.ABC, a.b.dto.Member
webapps/프로젝트명/WEB-INF/lib/xxx.jar
webapps/프로젝트명/xxx.jsp
webapps/프로젝트명/xxx.js
webapps/프로젝트명/xxx.css
webapps/프로젝트명/xxx.png


🔹서블릿을 수정하면 톰캣도 재가동해야 함. 프로젝트를 리스타트해야 함.
⇒ 프로젝트가 많으면 속도 느림 ⇒ 톰캣 매니저에서 특정 프로젝트만 다시 로드 가능 !

#a.jsp
<form action="/Servlet1/Test1" method="post">
    <input type="hidden" name="a" value="b" />
    <input type="submit" />
</form>

#Test1.java
doPost
    PrintWriter out=reponse.getWriter();
    out.write("def"); //localhost:8282/Servlet1/a.jsp로 가서 제출누르면 def나옴
    out.write(request.getParameter("a")); //새로고침하고 제출누르면 defb나옴

#Test2.java
    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out=reponse.getWriter();
    out.write("홍길동"); 
    //이것만 적으면 한글깨짐
    //http프로토콜 방식으로 한글을 보내면 언급을 해야함, 응답할 때 한글처리를 해야함

 

🔹context-param은 모든 서블릿에서 공용으로 사용하는 파라메터

🔹application은 jsp내장 객체이기 때문에 얻어오려면..?

  • this는 HttpServlet 상속받은 객체, 즉 this. 하면 HttpServlet 객체의 메서드 다 나옴
  • application의 클래스명은 ServletContext⭐
  • application은 jsp내장 객체 이름이지만, 실제 application은 참조형 변수 이름, 이것의 자료형은 ServletContext
#web.xml에 이렇게 적으면
<context-param>
    <param-name>aa</param-name>
    <param-value>bb</param-value>
</context-param>

#Test1, Test2의 doGet에 이렇게 적어주면 둘 다 사용 가능 !
doGet
    ServletContext application=this.getServletContext();
    PrintWriter out=response.getWriter();
    out.write(application.getInitParameter("aa")); //web.xml의 param-name의 값 얻는 방법
    //Test1, Test2 둘 다 bb 출력

🔹서블릿 태그에 init-param을 주면, 이 값은 이 서블릿 전용

  • 다른 서블릿에서는 null값
  • config는 jsp내장 객체, 이것의 풀네임은 ServletConfig
#web.xml
<init-param>
    <param-name>cc</param-name>
    <param-value>dd</param-value>
</init-param>

#Test1, Test2
doGet
    ServletContext application=this.getServletContext();
    PrintWriter out=response.getWriter();
    out.write(application.getInitParameter("aa"));

    ServletConfig config=this.getServletConfig();
    String s=config.getInitParameter("cc");
    out.print(s);
//Test1은 bbdd
//Test2는 bbnull

💫init-param, context-param의 값 얻어오는 법

  • —> ServletConfig config=this.getServletConfig();
  • —> ServletContext application=this.getServletContext();
<init-param> —> javax.servlet.ServletConfig config
        <param-name>aa
<context-param> —> javax.servlet.ServletContext application
        <param-name>bb

/* <init-param> 
-> 접근하려면 javax.servlet.ServletConfig라는 객체로 얻을 수 있다
이름은 내장객체와 동일하게 config
    <context-param> 
-> 접근하려면 javax.servlet.ServletContext라는 객체로 얻을 수 있다 
이름은 내장객체와 동일하게 application */
ServletConfig config=this.getServletConfig();
ServletContext application=this.getServletContext();
String str1=config.getInitParameter("aa");
String str2=config.getInitParameter("bb");

/*  서블릿에서 내장객체 얻는 법 ?
Httpservlet은 메서드를 가지고 있다 : config와 application 주소를 얻어온다

param-name이 둘 다 있으면 이름을 주면 value값을 얻을 수 있다, 리턴타입은 String형
*/

/*  init-param과 context-param의 차이 ?
init-param은 servlet태그 안에 있음 : 서블릿마다 얻고 싶으면 servlet태그 안에 세팅
context-param은 servlet태그 안에 있지X : 모든 서블릿에서 사용하고 싶으면 context-param에 세팅
*/

💫 즉, init-param은 ServletConfig / context-param은 ServletContext로 얻는다.

- config와 application은 jsp내장 객체 이름이다.

- 서블릿에서는 이 2개를 this.으로 얻어온다.(이미 메모리에 있기 때문에)

- 파라미터 이름을 줘서 값을 얻어온다 !

  • init메서드(초기화하다)는 최초로 딱 1번 호출, 서블릿 객체 만들어질 때 !
  • super.init(config); 호출하지 않으면 ServletConfig config=this.getServletConfig 했을 때 config가 null
  • init메서드에서 시간 많이 걸리는 일들 할 수 있음. ex) HDD에서 파일 읽어 메모리에 올리는 작업
  • init-param, context-param의 값 얻어오는 법
    —> ServletConfig config
    —> ServletContext application
  • 서블릿은 리로드 해야 함. 클래스 파일이 배포되고 톰캣 엔진이 파일을 읽기 위해서 !
  • init메서드 호출되고 나서 사용자가 호출하면 doGet 호출됨

💫경로 얻어오는 법

#web.xml
Test1 밑에
<init-param>
    <param-name>abc</param-name>
    <param-value>def</param-value>
</init-param>

Test3 밑에
<context-param>
    <param-name>AAA</param-name>
    <param-value>BBB</param-value>
</context-param>

#Test1.java
public void init(ServletConfig config) throws ServletException{
    super.init(config);
    String s1=config.getInitParameter("abc");
    ServletContext application=this.getServletContext();
    String s2=application.getInitParmeter("AAA");
    System.out.println(s1);
    System.out.println(s2);
}/*매니저가서 리로드 !
  def
  BBB 콘솔창 출력*/

💎Servlet 화면 이동(서블릿 화면 이동)

🧙🏻‍♂️ *doGet

                  RequestDispatcher rd=request.getRequestDispatcher("b.jsp");

                  rd.forward(request, response);

   *doPost
                  response.sendRedirect("c.jsp");

* http://localhost:8282/Servlet1/Test3?a=100
* a는 100 b는 200

#a.jsp
<form action="/Servlet1/Test3" method="post">
    <input type="hidden" name="a" value="b" />
    <input type="submit" />
</form>

#b.jsp 
<%=request.getParameter("a") %><br/>
<%=request.getAttribute("b") %><br/>

#Test3.java
doGet
        request.setAttribute("b", 200);
        RequestDispatcher rd=request.getRequestDispatcher("b.jsp");
        rd.forward(request, response);
//getRequestDispatcher의 반환형 RequestDispatcher
//forward()가 있음
//이게 jsp forward임
//request는 다음페이지까지 전달

doPost
        response.sendRedirect("c.jsp");

💫서블릿 화면 이동은 2가지 방법이 있다

1. <% response.sendRedirect(”url”); %>

2. <jsp:forward page=”url” />

  • MVC패턴에서 Servlet은 프런트 역할 ! 모든 요청은 doGet으로 옴!
  • Servlet에서 Servlet으로 화면 이동X / 보통 Servlet에서 JSP로 화면이동
http://localhost:8282/SERVLET/Test1?abc=100
=>http://localhost:8282/SERVLET/test.jsp?abc=100
=>url이 변경! / 환영합니다.100 출력

#Test1.java
doGet
    String str=request.getParameter("abc");
//화면바뀌기 전에 파라미터 받기
    response.sendRedirect("test1.jsp?abc="+str);
//다음 화면까지 전달된다
//Servlet은 리로드

#test1.jsp
환영합니다. <%=request.getParameter("abc"); %>
//jsp는 리로드X
객체를 다음페이지까지 전달하려면? 메모리에 계속 저장해야함.
http://localhost:8282/SERVLET/Test1?abc=100
=>url변경되지않음 / 화면바뀌고 / 환영합니다.100 출력

#Test1.java
doGet
    RequestDispatcher rd=request.getRequestDispatcher("test1.jsp");
    rd.forward(request,response)
//forward 매개변수로 request,response 날라감
//test1.jsp request,response객체를 전달, 다음 페이지에 이 주소값을 전달
//url바뀌지않음, test1.jsp가 응답함

#test1.jsp
환영합니다. <%=request.getParameter("abc"); %>
회원 1명 정보를 다음페이지에서 얻으려면?
http://localhost:8282/SERVLET/Test1
=>aa

#Test1.java
doGet
    MemberBean bean=new MemberBean();
    bean.setId("aa");
    bean.setPw("bb");
    bean.setAddr("cc");
    bean.setTel("dd");
    request.setAttribute("member",bean);
    RequestDispatcher rd=request.getRequestDispatcher("test1.jsp");
    rd.forward(request,response)

#test1.jsp
<%
MemberBean bean=(MemberBean)request.getAttribute("member");
//리턴타입이 object이기 때문에 형변환
out.print(bean.getId());
%>
profile

Yuni Devlog

@siyuning

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그