[국비학원 기록/Servlet] 서블릿 스코프(scope), URL - pattern
my code archive
article thumbnail
반응형
서블릿 속성(attribute)
ServletContext, HttpSessionHttpServletRequest 객체에 바인딩되어 저장된 객체(정보)

-각 서블릿 API의 setAttribute(String name, Object Value)로 바인딩함.

-각 서블릿 API의 getAttribute(String name)으로 접근함.

-각 서블릿 API의 removeAttribute(String name)으로 속성을 제거함.

 

 

서블릿 스코프(scope)

1)서블릿 API에 바인딩된 속성에 대한 접근 범위

2)ServletContext 속성은 애플리케이션 전체에서 접근 가능

3)HttpSession 속성은 사용자만 접근 가능

4)HttpServletRequest 속성은 해당 요청/응답에 대해서만 접근 가능

5)각 스코프를 이용해서 로그인 상태 유지, 장바구니, MVC의 Model과 View의 데이터 전달 기능 구현

 

스코프 종류 해당 서블릿 API 속성의 스코프
애플리케이션 스코프 ServletContext 애플리케이션 전체에 대해 접근할 수 있음.
세션 스코프 HttpSession 브라우저에서만 접근할 수 있음.
리퀘스트 스코프 HttpServletRequest 해당 요청/응답 사이클에서만 접근할 수 있음.

 

스코프(scope) 예제
getAttribute.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet("/get")
public class GetAttribute extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        ServletContext ctx = getServletContext();
        HttpSession session = request.getSession();
        
        String ctxMesg = (String)ctx.getAttribute("context");
        String sesMesg = (String)session.getAttribute("session");
        String reqMesg = (String)request.getAttribute("request");
        
        out.print("context 값 :" +ctxMesg +"<br>");
        out.print("session 값 :"+sesMesg +"<br>");
        out.print("request 값 :"+reqMesg+"<br>");
    }
}
cs

 

setAttribute.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
 
@WebServlet("/set")
public class SetAttribute extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String ctxMesg = "context에 바인딩합니다.";
        String sesMesg = "session에 바인딩합니다.";
        String reqMesg = "request에 바인딩합니다.";
        
        //HttpSessionContext 객체, HttpSession 객체, HttpServletRequest 객체를 얻은 후 속성을 바인딩함.
        ServletContext ctx = getServletContext();
        HttpSession session = request.getSession();
        
        ctx.setAttribute("context", ctxMesg);
        session.setAttribute("session", sesMesg);
        request.setAttribute("request", reqMesg);
        
        out.print("바인딩을 수행합니다.");
    }
}
cs

 

<크롬에서 실행했을 때>

<다른 브라우저에서 실행했을 때>

URL-pattern (디렉토리 패턴, 확장자 패턴)

0)서블릿 매핑 시 사용되는 가상의 이름

-클라이언트가 브라우저에서 요청할 때 사용됨, 반드시 /(슬래시)로 시작해야함.

 

1)디렉토리 패턴

-디렉토리 형태로 서버의 해당 컴포넌트(서블릿, JSP)를 찾아서 실행하는 구조를 말함.

-http://localhost:8080/chap07_Servlet/get

==> /get으로 매핑된 Servlet을 찾아가서 실행됨.

 

2)확장자 패턴

-확장자 형태로 서버의 해당 컴포넌트(서블릿, JSP)를 찾아서 실행하는 구조를 말함.

-http://www.weather.go.kr/프로젝트명/*.do 
==> .do로 끝나는 요청을 동일한 do 서블릿으로 찾아가게 매핑함.

 

종류 URL Pattern 매칭 URL 예
exact mapping /login/hello.do http://localhost:8080/chap07_Servlet/login/hello.do 
path mapping /login/*

(login/ 뒤에 아무거나 가능)
http://localhost:8080/chap07_Servlet/login/
http://localhost:8080/chap07_Servlet/login/hello
http://localhost:8080/chap07_Servlet/login/hello.do 
http://localhost:8080/chap07_Servlet/login/test
extension mapping *.do
(아무거나 뒤에 .do 가능)
http://localhost:8080/chap07_Servlet/hi.do
http://localhost:8080/chap07_Servlet/login/hello.do 
default mapping / http://localhost:8080/chap07_Servlet/
http://localhost:8080/chap07_Servlet/hello.do
http://localhost:8080/chap07_Servlet/login
http://localhost:8080/chap07_Servlet/login/hello
http://localhost:8080/chap07_Servlet/login/hello

 

URL-pattern 예제

 

UrlTestServlet01.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/*@WebServlet("first/test")        */                    //정확히 이름까지 알려주는 URL 패턴
public class UrlTestServlet01 extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String context = request.getContextPath();            //컨텍스트 이름만 가져옴
        String url = request.getRequestURL().toString();    //전체 URL을 가져옴
        String mapping = request.getServletPath();            //서블릿 매핑 이름만 가져옴
        String uri = request.getRequestURI();                //URI를 가져옴.
        
        out.print("<html><body bgcolor ='yello'>");
        out.print("<b>UrlTestServlet01입니다.</b><br>");
        out.print("</body></html>");
    }
}
cs

 

UrlTestServlet02.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/first/*")           //디렉토리 이름만 일치하는 URL 패턴
public class UrlTestServlet02 extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String context = request.getContextPath();            //컨텍스트 이름만 가져옴
        String url = request.getRequestURL().toString();    //전체 URL을 가져옴
        String mapping = request.getServletPath();            //서블릿 매핑 이름만 가져옴
        String uri = request.getRequestURI();                //URI를 가져옴.
        
        out.print("<html><body bgcolor ='blue'>");
        out.print("<b>UrlTestServlet01입니다.</b><br>");
        out.print("<b>컨텍스트 이름 : "+context+"</b><br>");
        out.print("<b>전체 경로 : "+url+"</b></br>");
        out.print("<b>매핑 이름 : "+mapping + "</b></br>");
        out.print("<b>uri : "+uri+"</b></br>");
        out.print("</body></html>");
    }
}
 
cs

 

UrlTestServlet03.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/*@WebServlet("*.do") */                //확장자만 일치하는 URL 패턴
/*@WebServlet("/*") */                        //모든 요청 URL 패턴 -- 확장명은 지정하지 않을 수도 있고, do대신 자신이 원하는 이름으로 지정도 가능함.
public class UrlTestServlet03 extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        String context = request.getContextPath();            //컨텍스트 이름만 가져옴
        String url = request.getRequestURL().toString();    //전체 URL을 가져옴
        String mapping = request.getServletPath();            //서블릿 매핑 이름만 가져옴
        String uri = request.getRequestURI();                //URI를 가져옴.
        
        out.print("<html><body bgcolor ='red'>");
        out.print("<b>UrlTestServlet01입니다.</b><br>");
        out.print("<b>컨텍스트 이름 : "+context+"</b><br>");
        out.print("<b>전체 경로 : "+url+"</b></br>");
        out.print("<b>매핑 이름 : "+mapping + "</b></br>");
        out.print("<b>uri : "+uri+"</b></br>");
        out.print("</body></html>");
    }
}
cs

 

.do 로 끝나면 아무거나 올 수 있다.

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

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

반응형