봄의 이벤트 여기 진행 마무리, 쉬운 컨트롤, 코드 판독, 어려움의 특정 정도의 후속 유지 보수의 남용에 매우 편리하지만, 일부 코드의 값을 변경하는 방법은 여러 가지입니다.
함수는 매개 변수를 수정합니다
argumentResolver
@Component
Public 클래스 HandlerMethodArgumentResolverDemo 구현 HandlerMethodArgumentResolver {
@Override
공개 부울를 supportsParameter (MethodParameter methodParameter) {
경우 (methodParameter = NULL && methodParameter.getParameterType () == String.class && methodParameter.getParameterIndex () == 1!) {
참을 리턴;
}
false를 반환;
}
@Override
공공 개체 resolveArgument (MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory)는 예외 {던졌습니다
에서 System.out.println ( "HandlerMethodArgumentResolverDemo을");
"HandlerMethodArgumentResolverDemo로 설정 인수"를 반환;
}
}
@SpringBootConfiguration
공용 클래스 ConfigDemo는 WebMvcConfigurerAdapter {확장
@Autowired
IntercepterDemo intercepterDemo을;
@Override
공공 무효 addInterceptors (InterceptorRegistry 레지스트리) {
registry.addInterceptor (intercepterDemo) .addPathPatterns ( "/ **"); //配置拦截的路径,可以传多个参数
/*registry.addInterceptor (authorityInterceptor) .addPathPatterns ( " / ** "); * /
}
@Autowired
handlerMethodArgumentResolverDemo handlerMethodArgumentResolverDemo;
@Override
공개 무효 addArgumentResolvers (목록 <HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add (handlerMethodArgumentResolverDemo);
}
}
二 인터셉터
@Component
공용 클래스 IntercepterDemo 구현의 HandlerInterceptor는 {
공공 부울 preHandle은 (HttpServletRequest의 요청, HttpServletResponse를 응답 개체 처리기) {예외를 throw
response.addHeader ( "interceptaddhader", "preintercepter");
에서 System.out.println ( "IntercepterDemo의 preintecepter");
true를 반환;
}
공공 공극 postHandle는 (HttpServletRequest의 요청, 응답 HttpServletResponse를, 대상물 핸들러, @Nullable의 ModelAndView의 ModelAndView)는 예외 발생 {
( "postintercepter"를 "interceptaddhader") response.addHeader 단계;
경우 {(의 ModelAndView = 널!)
modelAndView.addObject ( "addObject");
}
에서 System.out.println ( "IntercepterDemo의 postintecepter");
}
공공 무효 afterCompletion은 (HttpServletRequest의 요청, HttpServletResponse를 응답 개체 처리기, @Nullable 예외 예) 예외 {던졌습니다
( "IntercepterDemo afterCompletion")에서 System.out.println;
}
}
上一个例子的ConfigDemo注册了这个intercepter
세 .aop 방법
스프링 AOP, AspectJ를, 더 일반적으로 사용되는, 그들은 말을하지 않습니다
네 리스너
일반 웹 프로젝트 플러스 청취자 :
리스너 인터페이스 카테고리
1ServletContextListener 모니터의 ServletContext 객체
> ServletContextAttributeListener는 추가로의 ServletContext 속성의 작업을 모니터링, 삭제, 수정,
> HttpSessionListener 세션 객체를 모니터링
> HttpSessionActivationListener 활성 청취하고 (하드 디스크 등) 세션, 부동화는 비활성 세션 영구 장치에 기록 지칭 HTTP의 경우 패시베이션 활성 대향.
세션에서> HttpSessionAttributeListener에 모니터 속성 작업
> ServletRequestListener 청취 Request 객체
동작에서 Requset> ServletRequestAttributeListener 모니터 특성
定义类: 공용 클래스 CountListener의 구현 HttpSessionListener
구성 청취자 :
- <수신기 >
- <리스너 - 클래스 > 웹 .CountListener </ 수신기 - 클래스 >
- </ 청취자 >
springboot 구성 리스너 두 예
@WebListener
공용 클래스 ServletRequestListener 구현 javax.servlet.ServletRequestListener {
공공 무효 requestDestroyed (ServletRequestEvent SRE) {
에서 System.out.println ( "청취자"+ sre.getServletContext 대해 getAttributeNames ()의 toString () ()..);
}
}
일단 서비스를 게시 할 때 //에만 호출하기
@WebListener
공용 클래스가 구현의 ServletContextListener {ServletContextListenerDemo
공공 무효 contextInitialized (ServletContextEvent의 SCE) {
에서 System.out.println을 ( "리스너 비"+ sce.getServletContext 대해 getAttributeNames ()의 toString () ()..);
}
공공 무효 contextDestroyed (ServletContextEvent SCE) {
}
}
@SpringBootApplication
@ServletComponentScan (basePackages = "com.learn.filtertest")
공용 클래스 MvntestApplication {
공공 정적 무효 메인 (문자열 [] 문자열) {
SpringApplication.run (MvntestApplication.class 문자열);
}
}
다섯 필터
각 요청은 필터되면 실행될
@Component
공용 클래스 OncePerRequestFilterDemo이 OncePerRequestFilter {확장
@Override는
(HttpServletRequest의 HttpServletRequest의, HttpServletResponse를 HttpServletResponse를, FilterChain filterChain)는 ServletException을 void 오류 doFilterInternal 보호, IOException가 {
httpServletResponse.addHeader ( "qzltest", "예");
에서 System.out.println ( "OncePerRequestFilterDemo는 요청 URI는 :"+ httpServletRequest.getRequestURI ());
filterChain.doFilter (HttpServletRequest의, HttpServletResponse를);
}
}
六RequestBodyAdvice ReqponseBodyAdvice
@ControllerAdvice
공용 클래스 RequestBodyAdviceDemo 구현의 RequestBodyAdvice {
@Override
공공 부울 지원을 {(? MethodParameter methodParameter는, 유형 유형, 클래스 <HttpMessageConverter <>> aClass 확장)
true를 반환;
}
@Override의
공공 HttpInputMessage beforeBodyRead IOException가 {던졌습니다 (HttpInputMessage httpInputMessage, MethodParameter methodParameter, 유형 유형, 클래스 <? HttpMessageConverter <? >> aClass이 확장)
//httpInputMessage.getBody을 ().
에서 System.out.println ( "RequestBodyAdviceDemo 요청 본문 조언 beforebodyread"+ methodParameter.getMethod () getName ().);
httpInputMessage를 반환;
}
@Override
공공 객체 afterBodyRead {(객체 o를, HttpInputMessage는 MethodParameter methodParameter는, 유형 유형, 클래스 <? HttpMessageConverter <? >> aClass 확장 httpInputMessage)
에서 System.out.println ( "RequestBodyAdviceDemo 요청 본문 조언 afterbodyread"+ methodParameter.getMethod (). 대한 getName ( ));
O를 반환;
}
@Override
공공 객체 handleEmptyBody {(객체 O를, HttpInputMessage httpInputMessage, MethodParameter methodParameter, 유형 유형, 클래스 <? HttpMessageConverter <? >> aClass 확장)
에서 System.out.println ( "RequestBodyAdviceDemo 요청 본문 조언 핸들러 빈 몸"+ methodParameter.getMethod () .getName ());
클래스는 clazz에 methodParameter.getParameterType을 () =;
(clazz에 경우.
"자동 생성"를 반환;
}
o를 리턴;
}
}
@ControllerAdvice
Public 클래스 ResponseBodyAdviceDemo 구현 ResponseBodyAdvice {
@Override
공개 부울을 지원 (MethodParameter methodParameter 클래스 aClass) {
. 리턴 methodParameter.getMethodAnnotations ()의 길이> = 1;
}
@Override
공공 객체 beforeBodyWrite (객체 O를, MethodParameter methodParameter, MediaType에 mediaType 매개 클래스 aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse의 serverHttpResponse) {
경우 (serverHttpResponse.getHeaders (). containsKey ( "qzltest")) {
에서 System.out.println ( "ResponseBodyAdviceDemo 응답 헤더 qzl 포함 URI는 요청 "+ serverHttpRequest.getURI ());
}
O! = NULL && (만약
"문자열 클래스 ResponseFilterDemo에 의해 추가 :"반환 + (문자열) (을)를;
}
o를 리턴;
}
}