成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Boot之 Servlet、Fiter、Listener的使用

Simon_Zhou / 860人閱讀

摘要:生長(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 ServletListenerRegistrationBean servletListenerRegistrationBean(){
        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

相關(guān)文章

  • 【圖片抓取】003-JAVA WEB(上)

    摘要:圖片抓取上本項(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...

    jiekechoo 評(píng)論0 收藏0
  • 第二十七章:SpringBoot使用ApplicationEvent&Listener完成業(yè)

    摘要:實(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ù)邏輯之...

    Reducto 評(píng)論0 收藏0
  • SpringBoot

    摘要:基于,支持后面的版本二基本使用網(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)集成第三方...

    mykurisu 評(píng)論0 收藏0
  • 慕課網(wǎng)_《RabbitMQ消息中間件極速入門與實(shí)戰(zhàn)》學(xué)習(xí)總結(jié)

    摘要:慕課網(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...

    mykurisu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<