摘要:生長(zhǎng)速度越快的樹木,其致密度就越低,生命往往也越短暫而松樹柏樹胡楊等樹種,要上百年才能成材,用起來卻可千年不朽。
Spring Boot之 Servlet、Fiter、Listener的使用
新建項(xiàng)目:http://start.spring.io/
Servlet的使用新建MyServlet類
package com.adagio.chat.servlet; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; 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( name = "myservlet", urlPatterns = {"/myservlet1", "/myservlet2"} ) public class MyServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Writer writer = response.getWriter(); writer.write("Hello World"); } }
啟動(dòng)類添加注解 @ServletComponentScan(basePackages = {"com.adagio.chat.servlet"})
啟動(dòng)運(yùn)行訪問:http://localhost:8080/myservlet1和http://localhost:8080/myservlet2
servlet的使用很簡(jiǎn)單:
添加注解 @WebServlet
配置name,可以不用配置
配置路徑,urlPatterns 可以配置多值
Filter的使用使用方式和Servlet十分類似
package com.adagio.chat.servlet; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.filter.OncePerRequestFilter; //@WebFilter(servletNames = "myservlet") @WebFilter(urlPatterns = "/myservlet1") public class MyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { ServletContext servletContext = getServletContext(); servletContext.log("url myservlet was filter"); filterChain.doFilter(request, response); } }
可以直接使用servletNames過濾,如@WebFilter(servletNames = "myservlet"),訪問http://localhost:8080/myservlet1和http://localhost:8080/myservlet2都會(huì)在控制臺(tái)打印日志
也可以使用@WebFilter(urlPatterns = "/myservlet1"),訪問上面兩個(gè)鏈接,只有訪問http://localhost:8080/myservlet1這個(gè)地址才會(huì)打印日志
Listener的使用使用方式也是類似的
package com.adagio.chat.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpServletRequest; @WebListener public class MyListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { HttpServletRequest request = (HttpServletRequest)sre.getServletRequest(); ServletContext servletContext = request.getServletContext(); servletContext.log("request was destroyed"); } @Override public void requestInitialized(ServletRequestEvent sre) { HttpServletRequest request = (HttpServletRequest)sre.getServletRequest(); ServletContext servletContext = request.getServletContext(); servletContext.log("request was initialized"); } }
訪問http://localhost:8080/myservlet2 觀察控制臺(tái)
執(zhí)行順序2017-09-10 16:11:18.247 INFO 7692 --- [io-8080-exec-10] o.a.c.c.C.[Tomcat].[localhost].[/] : request was initialized 2017-09-10 16:11:18.271 INFO 7692 --- [io-8080-exec-10] o.a.c.c.C.[Tomcat].[localhost].[/] : url myservlet was filter 2017-09-10 16:11:18.271 INFO 7692 --- [io-8080-exec-10] o.a.c.c.C.[Tomcat].[localhost].[/] : servlet was doGet 2017-09-10 16:11:18.275 INFO 7692 --- [io-8080-exec-10] o.a.c.c.C.[Tomcat].[localhost].[/] : request was destroyed
先監(jiān)聽器的初始化,再經(jīng)過濾器,然后執(zhí)行doGet方法,最后執(zhí)行監(jiān)聽器的消亡
使用注入的方式注冊(cè)效果和上面的方式一樣的,具體實(shí)現(xiàn)見代碼
package com.adagio.chat.spring.boot; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.filter.OncePerRequestFilter; public class MyFilter2 extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // ServletContext servletContext = getServletContext(); // // //動(dòng)態(tài)獲取URI // String requestURI = request.getRequestURI(); // // servletContext.log("url "+requestURI+" was filter from MyFilter2"); doSomething(); filterChain.doFilter(request, response); } /** * 當(dāng)沒有request的時(shí)候,可以使用這種方式獲取request */ public void doSomething(){ RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)requestAttributes; HttpServletRequest request = servletRequestAttributes.getRequest(); ServletContext servletContext = getServletContext(); //動(dòng)態(tài)獲取URI String requestURI = request.getRequestURI(); servletContext.log("url "+requestURI+" was filter from MyFilter2"); } }
package com.adagio.chat.spring.boot; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; 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; public class MyServlet2 extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ ServletContext servletContext = request.getServletContext(); servletContext.log("servlet2 was doGet"); Writer writer = response.getWriter(); writer.write("Hello World From MyServlet2"); } }
package com.adagio.chat; import javax.servlet.DispatcherType; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import com.adagio.chat.servlet.MyListener; import com.adagio.chat.spring.boot.MyFilter2; import com.adagio.chat.spring.boot.MyServlet2; @SpringBootApplication @ServletComponentScan(basePackages = {"com.adagio.chat.servlet"}) public class ChatApplication { public static void main(String[] args) { SpringApplication.run(ChatApplication.class, args); } @Bean public static ServletRegistrationBean servletRegistrationBean(){ ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); servletRegistrationBean.setServlet(new MyServlet2()); servletRegistrationBean.addUrlMappings("/spring/boot/myservelt2"); servletRegistrationBean.setName("myservlet2"); return servletRegistrationBean; } @Bean public static FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter2()); // filterRegistrationBean.addUrlPatterns("/spring/boot/myservelt2"); filterRegistrationBean.addServletNames("myservlet2"); filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE); return filterRegistrationBean; } /** * 監(jiān)聽器會(huì)監(jiān)聽所有請(qǐng)求 * 可以重復(fù)注冊(cè)監(jiān)聽器 * @return */ @Bean public static ServletListenerRegistrationBeanservletListenerRegistrationBean(){ ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener()); return servletListenerRegistrationBean; } }
急事慢做:成長(zhǎng)是長(zhǎng)時(shí)間努力、積累和進(jìn)步的結(jié)果,是水到渠成的事情,絕不是心急就能做到的。
生長(zhǎng)速度越快的樹木,其致密度就越低,生命往往也越短暫;而松樹、柏樹、胡楊等樹種,要上百年才能成材,用起來卻可千年不朽。 - 俞敏洪
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70385.html
摘要:圖片抓取上本項(xiàng)目主要講述項(xiàng)目的搭建和啟動(dòng)過程,為以后繼續(xù)圖片抓取的業(yè)務(wù)展示做基礎(chǔ)。用于處理請(qǐng)求和響應(yīng)的攔截處理。這樣相比容器直接發(fā)到處理,大大減少了代碼重復(fù)工作而且方便統(tǒng)一管理。上下文關(guān)系從上圖可以看出主要在和兩部分做工作。 【圖片抓取】003-JAVA WEB(上) 本項(xiàng)目主要講述java web項(xiàng)目的搭建和啟動(dòng)過程,為以后繼續(xù)圖片抓取的業(yè)務(wù)展示做基礎(chǔ)。項(xiàng)目中采用tomcat+spr...
摘要:實(shí)體代碼如下所示恒宇少年碼云用戶名密碼創(chuàng)建內(nèi)添加一個(gè)注冊(cè)方法,該方法只是實(shí)現(xiàn)注冊(cè)事件發(fā)布功能,代碼如下所示恒宇少年碼云用戶注冊(cè)方法省略其他邏輯發(fā)布事件事件發(fā)布是由對(duì)象管控的,我們發(fā)布事件前需要注入對(duì)象調(diào)用方法完成事件發(fā)布。 ApplicationEvent以及Listener是Spring為我們提供的一個(gè)事件監(jiān)聽、訂閱的實(shí)現(xiàn),內(nèi)部實(shí)現(xiàn)原理是觀察者設(shè)計(jì)模式,設(shè)計(jì)初衷也是為了系統(tǒng)業(yè)務(wù)邏輯之...
摘要:基于,支持后面的版本二基本使用網(wǎng)頁(yè)生成訪問生成項(xiàng)目并下載。這里的配置項(xiàng)可以自動(dòng)提示。數(shù)據(jù)配置文件配置四整合映射跟之前一樣注冊(cè)注冊(cè)攔截器五整合基本整合使用映射文件映射文件和注解同時(shí)存在注解引入配置文件增加事務(wù)六自動(dòng)配置自動(dòng)原理配置項(xiàng) 一、SpringBoot簡(jiǎn)介 1. 使用SSM開發(fā)項(xiàng)目的時(shí)候有什么不足之處 創(chuàng)建ssm項(xiàng)目比較麻煩 配置比較麻煩 依賴的配置比較多比較麻煩 手動(dòng)集成第三方...
摘要:慕課網(wǎng)消息中間件極速入門與實(shí)戰(zhàn)學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《RabbitMQ消息中間件極速入門與實(shí)戰(zhàn)》學(xué)習(xí)總結(jié) 時(shí)間:2018年09月05日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:RabbitM...
閱讀 2524·2021-11-18 10:02
閱讀 2000·2021-11-09 09:45
閱讀 2454·2021-09-26 09:47
閱讀 1039·2021-07-23 10:26
閱讀 1082·2019-08-30 15:47
閱讀 3374·2019-08-30 15:44
閱讀 988·2019-08-30 15:43
閱讀 895·2019-08-29 13:50