Servlet 가상 경로 맵 설정 상세 설명

8939 단어 Servlet경로 맵
지난 편 에서 우 리 는 Servlet 을 처음 알 게 되 었 습 니 다.Servlet 에 대해 서도 알 게 되 었 을 것 이 라 고 믿 습 니 다.Servlet 을 만 드 는 방법 을 알 고 가상 맵 을 추가 하여 프로젝트 를 발표 하고 브 라 우 저 에 대응 하 는 Servlet 을 요청 합 니 다.
우 리 는 Servlet 에 가상 경 로 를 설정 해 야 클 라 이언 트 가 접근 할 수 있다 는 것 을 알 고 있 습 니 다.그러나 Servlet 의 경로 맵 에 대해 서 는 정말 지금 알 고 있 는 것 만 이 이렇게 간단 합 니까?
정 답 은 당시 에 No 였 다.그렇지 않 았 다 면 어떻게 이 문장 이 있 었 을 까?😝,그 속 의 비밀 을 함께 탐구 해 보 자!
Servlet 가상 경로 맵
웹.xml 파일 에서요 소 는 Servlet 의 대외 접근 경 로 를 매 핑 하 는 데 사 용 됩 니 다.이 경 로 는 가상 경로 라 고도 합 니 다.예 를 들 어/TestServlet은'/TestServlet'이 가상 경로 입 니 다.
1.여러 맵 경로 설정
이전 글 에서 우 리 는@WebServlet 의 url Patterns 속성 에 대해 말 했 습 니 다.이것 은 일치 하 는 규칙 일 수 있 습 니 다.즉,하나의 Servlet 은 여러 개의 가상 경 로 를 설정 할 수 있 습 니 다.즉,Servlet 과 가상 경 로 는 한 쌍 이상 의 관계 일 수 있 습 니 다(다 대 다 는 아 닙 니 다.하나의 가상 경 로 는 하나의 Servlet 만 매 핑 할 수 있 습 니 다).그 구체 적 인 실현 은 다음 과 같 습 니 다.doPost 의 코드 를 수정 합 니 다:

@WebServlet(
		description = "My First Servlet", 
		urlPatterns = { "/HelloServlet", "/StillMe" }, 
		initParams = { 
				@WebInitParam(name = "name", value = "lizishu")
		})
public class HelloServlet extends HttpServlet {
 //          
 //...
 
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//        contentType
		//text/plain :         text/html println      
		response.setContentType("text/plain;charset=utf-8");
		//response.setCharacterEncoding("utf-8"); 
		PrintWriter out = response.getWriter();
		out.println("Served at: " + request.getContextPath());
		String name = this.getInitParameter("name");
		out.println("name: " + name);
		out.println("   Servle  :" + HelloServlet.class);
	}
}
가상 경로 맵 을 추가 하 는 것 이 매우 편리 합 니 다.url Patterns 에 하나만 추가 하면 됩 니 다.('/'생략 할 수 없습니다.)항목 을 시작 하고 브 라 우 저 에 url 을 입력 하면 입력 이 든 볼 수 있 습 니 다.http://localhost:8080/FirstProject/HelloServlet역시http://localhost:8080/FirstProject/StillMe페이지 에서 얻 은 출력 내용 이 모두 일치 합 니 다.
url Patterns 는 Servlet 3.0 버 전에 웹.xml 에 설정 되 어 있 으 며,각각 Servlet 에는 해당 하 는 <servlet-mapping> 태그 가 있 으 며,그 중에서 여러 개의 <url-pattern> 을 설정 할 수 있 습 니 다.
2.url Patterns 일치 규칙
Servlet 가상 도로 힘 의 일치 규칙 에 대해 서 는 url Patterns 의 몇 가지 일치 규칙 도 말 해 야 한다.주로 다음 과 같은 네 가지 가 있다.
  • 정확 한 일치:즉,우리 가 위 에서 설정 한 일치 규칙 은 완전히 같 아야 일치 할 수 있 습 니 다.이것 은 우리 가 자주 오류 가 발생 하 는 곳 입 니 다.Servlet 을 요청 할 때 대소 문자 맞 춤 법 오류 로 인해 404 가 발생 합 니 다.
  • 경로 일치:예 를 들 어 rest 로 시작 하 는 모든 요청 과 일치 하려 면'/rest/*'로 쓸 수 있 습 니 다.그 형식 은'/'문자 로 시작 하고'/*'로 끝 납 니 다.
  • 확장자 일치:예 를 들 어.do 로 끝 나 는 모든 요청 과 일치 하려 면'*.do'라 고 쓸 수 있 습 니 다.그 형식 은'*'이 고 뒤에 확장자 가 따라 갑 니 다.
  • 결 성 일치:맵 경 로 는"/"입 니 다.이 Servlet 은 현재 응용 되 고 있 는 결 성 Servlet 입 니 다.가상 경로 와 일치 하지 않 는 요청 을 기본 으로 처리 합 니 다.
  • 주의해 야 할 것 은 경로 일치 와 확장 일치 가 혼합 되 어 사용 할 수 없습니다.즉,url Pattern 은'/rest/*.do'로 쓸 수 없습니다.이것 도 일부 학생 들 을 곤 혹 스 럽 게 하 는 부분 이다.Servlet 의 가상 경로 매 칭 은 완전히 정규 에 따라 일치 하 는 것 이 아니다.경로 매 칭 과 확장 매 칭 은 정규 중의 마스크(*)에 따라 일치 하지만 일부 학생 들 은 특정한 정규 를 쓸 수 있 지만 합 법 적 인 가상 경로 가 아니다.Servlet 용기 가 요청 을 받 으 면 상하 문 경로(request.getContextPath()를 통 해 가 져 온)에서 요청 을 차단 하고 나머지 부분 을 사용 하여 경로 매 칭 을 합 니 다.예 를 들 어 요청 URL 은http://localhost:8080/FirstProject/HelloServlet,그러면 Servlet 용 기 는"/HelloServlet"을 사용 하여 Servlet 과 일치 합 니 다.
    마지막 으로 주의해 야 할 것 은 위의 네 가지 일치 규칙 을 말 했 습 니 다.특히 일치 하지 않 으 면 임의의 요청 에 일치 할 수 있 습 니 다.하나의 요청 이 여러 개의 Servlet 의 가상 경 로 를 일치 시 킬 수 있다 면 어떤 Servlet 을 실행 해 야 합 니까?사실은 이러한 일치 규칙 은 우선 순위 가 있 습 니 다.구체 적 인 우선 순 위 는 정확 한 일치>경로 일치>확장자 일치>결 성 일치 입 니 다.Servlet 용 기 는 우선 순위 가 높 은 가상 경로 부터 일치 합 니 다.일치 하면 바로 해당 하 는 Servlet 에 요청 을 건 네 주 고 다른 Servlet 의 가상 경로 가 일치 하 는 지 에 관심 을 가지 지 않 습 니 다.
    다음은 Servlet 과 그 에 대응 하 는 가상 경 로 를 보 여 드 리 겠 습 니 다.
    urlPatterns
    Servlet Name
    /abc/*
    Servlet1
    /
    Servlet2
    /abc
    Servlet3
    *.do
    Servlet4
    상하 문 경 로 를 제거 한 후 경 로 를"/abc/a.html"로 요청 할 때 상기 규칙 에 따라 Servlet 1 을 호출 합 니 다.
    요청 은"/abc"입 니 다.일치 하 는 우선 순위 에 따라 Servlet 3 를 호출 합 니 다.
    요청 은"/abc/a.do"입 니 다.'/abc/*','*.do'와 일치 하지만 일치 하 는 우선 순위 에 따라 Servlet 1 을 호출 합 니 다.
    요청 은"/a.do"입 니 다.'/','*.do'와 일치 하지만 일치 하 는 우선 순위 에 따라 Servlet 4 를 호출 합 니 다.
    3.Tomcat 에서 제공 하 는 결 성 Servlet
    결 성 된 Servlet 를 테스트 하기 위해 서,우 리 는 테스트 를 진행 합 니 다.우 리 는 Self Default Servlet 을 새로 만 들 었 습 니 다.url Patterns 는"/"로 설정 되 어 있 습 니 다.그 방법 은 수정 되 지 않 습 니 다.
    
    @WebServlet(
    		description = "Self create default Servlet", 
    		urlPatterns = { "/" }
    		)
    public class SelfDefaultServlet extends HttpServlet {
     //...
    }
    프로젝트 를 시작 한 후 브 라 우 저 에 입력 합 니 다.http://localhost:8080/FirstProject/hahaha또는 HelloServlet 가상 경로 에 일치 하지 않 는 다른 요청 은 페이지 의 결 과 는 다음 과 같 습 니 다.이것 도 좋 은 지 404 오 류 를 보고 하지 않 습 니 다.

    그러나 이 때 웹 콘 텐 츠 디 렉 터 리 의 정적 페이지(새로 만 든 welcome.html 파일)를 방문 하고 싶 습 니 다.브 라 우 저 에 입력 하 십시오.http://localhost:8080/FirstProject/welcome.html무슨 일이 일어 날 까요?결 과 를 살 펴 보 겠 습 니 다.그림 에서 보 듯 이 요청 결 과 는 우리 의 생각 대로 되 지 않 았 습 니 다.요청 경로 에 따라 welcome.htm 페이지 를 찾 는 것 이 아니 라 Self Default Servlet 을 호출 했 습 니 다.어 리 석 지 않 습 니까?

    사실 클 라 이언 트 의 모든 요청 은 Servlet 용기 가 가상 경로 의 일치 규칙 에 따라 처리 하 는데 정적 자원 을 포함한다.또한,경로 입력 오류(자신 이 설정 한 결 성 된 Servlet 를 제거 한 후),우리 가 흔히 볼 수 있 는 아래 의 오류 도 Servlet 이 우리 에 게 되 돌아 오 는 것 입 니 다.하하,의외 입 니까?

    우리 가 servlet 를 통 해 간단하게 웹 사 이 트 를 개발 할 수 있 는 이 유 는 우리 가 거인 의 어깨 위 에 서 있 기 때 문 입 니 다.다음은 Sun 회사 가 우리 개발 자 를 위해 어떤 일 을 미리 했 는 지 살 펴 보 겠 습 니 다.Tomcat 는 프로젝트 에 결 성 된 Servlet 을 설정 합 니 다.(프로젝트 에서 자체 설정 하면 적용 되 지 않 습 니 다)설정 파일 은 tomcat 설치 디 렉 터 리 아래 conf 디 렉 터 리 에 있 는 웹.xml 파일 에 있 습 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.결 성 된 Servlet 이름 은 Default Servlet 입 니 다.
    
    <servlet>
     <servlet-name>default</servlet-name>
     <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
     <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
     </init-param>
     <init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
     <servlet-name>default</servlet-name>
     <url-pattern>/</url-pattern>
    </servlet-mapping>
    클 라 이언 트 가 정적 자원 파일 을 요청 할 때 도 결 성 된 Servlet 에서 처 리 됩 니 다.(자신 이 Servlet 을 따로 설정 한 경 우 는 제외)요청 파일 을 찾 을 수 있 으 면 HttpServletResponse 대상 을 통 해 페이지 를 흐 르 는 방식 으로 클 라 이언 트 에 게 되 돌려 줍 니 다.그렇지 않 으 면 404 오 류 를 보고 합 니 다.
    하지만 여기까지 만 말씀 드 리 면 부족 한 Servelt 를 설정 해 보 셨 을 때 welcome.html 에 접근 하 는 경우(Self Default Servlet 을 호출 합 니 다).단,브 라 우 저 에 입력 하면http://localhost:8080/FirstProject/index.jsp(index.jsp 는 만 든 첫 번 째 jsp 페이지 입 니 다)는 요?어떤 결과 일 까요?부족 한 Servlet 을 호출 하 는 건 가요?정말 운행 결 과 는 다음 과 같다.

    이것 은 무슨 원인 입 니까?왜 부족 한 servlet 을 호출 하지 않 았 습 니까?이것 은 tomcat 가 결 성 된 Serlvet 외 에 jsp 파일 을 처리 하 는 Servlet 을 제공 하기 때 문 입 니 다.설정 은 다음 과 같 습 니 다.접두사 가 결 성 된 Servlet 보다 우선 순위 가 높 기 때문에 JSP 를 방문 할 때 JspServlet 에 맡 겨 야 합 니 다.(JSP 는 자바 코드 를 포함 할 수 있 기 때문에 처음 실행 할 때 먼저 컴 파일 해 야 합 니 다.이 작업 은 JspServlet 에 의 해 이 루어 집 니 다)
    
    <servlet>
     <servlet-name>jsp</servlet-name>
     <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
     <init-param>
      <param-name>fork</param-name>
      <param-value>false</param-value>
     </init-param>
     <init-param>
      <param-name>xpoweredBy</param-name>
      <param-value>false</param-value>
     </init-param>
     <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet-mapping>
     <servlet-name>jsp</servlet-name>
     <url-pattern>*.jsp</url-pattern>
     <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>
    4.총화
    본 고 는 url Patterns 속성의 일치 규칙 을 구체 적 으로 논 의 했 는데 주로 네 가지 로 그 우선 순위 도 각각 다르다.우리 가 사용 할 때 도 자신의 수요 에 따라 url Patterns 를 스스로 설정 해 야 한다.그러나 일치 규칙 을 알 게 되면 사용 하기에 도 편리 하고 빠 른 포 지 셔 닝 오 류 를 도 울 수 있다.
    여기 서 Servlet 가상 경로 맵 설정 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 Servlet 가상 경로 맵 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기