맨손으로 자바 로 웹 서버 와 프레임 워 크 를 쓰 세 요.

6715 단어
맨손으로 자바 로 웹 서버 와 프레임 워 크 를 쓰 세 요.
맨손으로 자바 로 웹 서버 와 프레임 워 크 를 쓰 세 요.
이 장 에 서 는 먼저 웹 프레임 의 기능 을 말 하고 초기 형태 가 있다.
먼저 Service 를 만 들 고 정규 주소 로 연결 합 니 다.주해 와 반 사 를 썼 다.
프로젝트 주소: Telemarketer
 
2017 년 08 월 02 일 업데이트
Service 정의
텔 레 마 케 터 의 서 비 스 는 서비스 다.그것 과 연 결 된 주 소 를 요청 했다 면 그것 이 당신 을 위해 서 비 스 를 제공 할 것 입 니 다.
그것 은 대외 적 으로 한 가지 방법 만 필요 하 다.그리고 이 방법 에 대한 요 구 는 대략 하나의 Request 만 입력 하면 Response 를 되 돌려 줄 수 있 습 니 다.
그럼 이렇게
public interface Service {
    Response execute(Request request);
}

 
문제 가 생 겼 습 니 다. 어떻게 그것 을 uri 에 연결 합 니까?첫 번 째 아 이 디 어 는 등록 센터 를 만 드 는 것 이다.
서비스 바 인 딩
이 부분의 코드 는 여기에 있 으 니 참고 하여 볼 수 있다.
일단 수 동 기어.
새로운 종류의 ServiceRegistry 를 만 들 고 그 안에 정적 지 도 를 넣 습 니 다.
 private static Map services = new TreeMap<>(); 
이런 방법 도 제공 했다.
 public static void register(String pattern, Service service) {services.put(pattern, service);} 
그리고 서 비 스 를 찾 는 방법 을 제공 합 니 다.
public static Service findService(String pattern) {
    for (Map.Entry entry : services.entrySet()) {
        if (pattern.matches(entry.getKey())) {
            return entry.getValue();
        }
    }
    return null;
}

request ? 。

그런데 생각해 보 니 이렇게 많은 번 거 로 움 을 일 으 키 는데 도 사람 으로 하여 금 전문 적 으로 장 소 를 찾 아 등록 하 게 해 야 합 니까?그 건 불편 해. 게 으 름 이 제일 생산력 이 야!
그럼 오토 매 틱 으로 바 꿔.
다시 자동 기어
Spring 의 프레임 워 크 를 조금 만 생각해 보 세 요. 주해 로 주입 에 의존 하 는 것 은 날 아 오 르 는 것 입 니 다. Telemarkeeter 도 괜 찮 습 니 다!자, 한다 면 해라!
먼저 주해 세 가지 요점 을 확정 하 다
  • 목표 확정: 클래스
  • 확정 범위: 운행 시
  • 확인 내용: String 하나 에 주소 정규 를 넣 으 면 됩 니 다
  •  
     @Target(ElementType.TYPE)
     @Retention(RetentionPolicy.RUNTIME)
     public @interface InService {
         String urlPattern();
     }

    이것 이 있 으 면 빨리 서 비 스 를 써 서 먼저 표시 해라.주 소 는 루트 디 렉 터 리 와 일치 합 니 다.
    1 @InService(urlPattern = "^/$")
    2 public class IndexService implements Service {
    3     @Override
    4     public Response execute(Request request) {
    5         return new FileResponse(Status.SUCCESS_200, PropertiesHelper.getTemplateFile("index.html"));
    6     }
    7 }

     
     PropertiesHelper.getTemplateFile("index.html")  html 파일 을 되 돌려 줍 니 다. 당분간 신경 쓰 지 마 세 요.FileResponse 는 파일 내용 을 포함 하 는 Response 입 니 다.
    됐어, 이제 어떻게 이 주석 으로 자동 으로 등록 할 수 있 을 까?
    만약 에 우리 가 이 유형의 이름 이 edu. telemarketer. services. servicesimples. IndexService 라 는 것 을 알 게 된다 면.먼저 하 나 를 반사:
     Class> aClass = Class.forName("edu.telemarketer.services.servicesimpls.IndexService"); 
    여기 서 Class.forName() 와 ClassLoader 의 load () 방법 으로 차이 점 을 주의 하 십시오. Class. forName () 은 클래스 의 정적 도 메 인 을 초기 화 합 니 다. 모든 static 이 준비 되 어 있 으 며, ClassLoader 의 load 는 이러한 효과 가 없습니다.
    이 Class 대상 을 찾 으 면 InService 레이 블 을 가 져 옵 니 다.
     InService annotation = aClass.getAnnotation(InService.class); 
    null 인지 아 닌 지 판단 하고 Service. class 가 이런 인터페이스 인지 아 닌 지 판단 해 보 세 요.다 만족 하면 우리 가 찾 아야 할 부류 야.그것 을 예화 하 라!등록 해!
    if (annotation != null && Service.class.isAssignableFrom(aClass)) {
        ServiceRegistry.register(annotation.urlPattern(), aClass.asSubclass(Service.class).newInstance());
    }

     
    이 곳 의 isAssignable From 와 instanceof 의 차 이 를 주의 하 십시오. isAssignable From 왼쪽 은 오른쪽 에 있 는 부모 클래스 나 인터페이스 입 니 다.
    전체 과정 은 루트 디 렉 터 리 를 먼저 가 져 온 다음 에 모든. class 를 재 귀적 으로 스 캔 하여 상기 판단 을 하 는 것 입 니 다.그리고 반사 할 때 는 전체 이름 을 사용 해 야 하 며, 동시에 가방 경 로 를 다시 기록 해 야 한다.구체 적 으로 소스 코드 를 볼 수 있 습 니 다.
    이 과정 에서 문제 가 발생 했 습 니 다. 처음에 edu. telemarketer 의 가방 이름 을 가 져 왔 습 니 다. 경로 로 바 꾸 려 면 name. replace All ("\ \", File. separator) 을 사 용 했 습 니 다.windows 환경 에서 테스트 에 이상 이 생 겼 다.조 사 를 통 해 replace All 은 "\" 가 나타 나 면 안 되 고 헷 갈 릴 수 있 습 니 다.그래서 단독 separator 대신 Matcher. quote Replacement (File. separator) 을 사용 합 니 다.구체 적 인 점 은 여기 StackOverflow -- replaceAll "/" 를 File. separator 로 합 니 다.
    여기까지 자동 기 어 를 다 했 습 니 다.
    커 넥 터 에서 의 사용
    첫 번 째 장 에서 이벤트 의 커 넥 터 를 읽 은 것 을 기억 하 십 니까? 이것 은 Runnable 을 실현 한 클래스 입 니 다. run 에는 대략 이러한 과정 이 있 습 니 다.
    1 Request request = Request.parseRequest(channel);
    2 Service service =ServiceRegistry.findService(request.getFilePath());
    3 Response response = service.execute(request);
    4 channel.register(selector, SelectionKey.OP_WRITE, response);

     
    시작 해서 페이지 가 나 왔 는 지 확인 해 보 세 요.
    서비스 처리 전과 처 리 를 제출 한 후에 서버 가 먼저 헤드 필드 의 일부 정 보 를 처리 해 야 합 니 다. 예 를 들 어 연결 을 유지 하거나 쿠키 를 처리 하 는 등 입 니 다.이런 부분 은 나중에 보완 하 자.

    좋은 웹페이지 즐겨찾기