springboot-11-servlet, listener, fitlter的添加


springboot中添加servlet, filter, listener有2種方式: 代碼注冊servlet 和自動注解注冊(在使用druid監控有使用過)

代碼注冊通過ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 獲得控制。 也可以通過servletContextInitializer接口直接注冊

在 SpringBootApplication 上使用@ServletComponentScan注解后,Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 注解自動注冊,無需其他代碼。

編寫測試類: 

Servlet:

1), 使用代碼注冊的方式

package com.iwhere.test.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 通過代碼注冊servlet
 * 代碼注冊通過ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 獲得控制。 
    也可以通過實現 ServletContextInitializer 接口直接注冊。
 * @author wenbronk
 * @time 2017年3月17日  下午2:23:21  2017
 */

public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 6272693061640286219L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("method deGet is run");
        doPost(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.out.println("method doPost is run");
        
        resp.setContentType("text/html"); 
        PrintWriter out = resp.getWriter(); 
        out.println("<html>"); 
        out.println("<head>"); 
        out.println("<title>Hello World</title>"); 
        out.println("</head>"); 
        out.println("<body>"); 
        out.println("<h1>這是:MyServlet1</h1>"); 
        out.println("</body>"); 
        out.println("</html>");
    }
    
}

然后在 App.java (或者任意一類中, 該類必須@component被spring管理) 

    /**
     * 使用代碼注冊Servlet
     * 此方法不需要加注解  @ServletComponentScan
     * @return
     */
    @Bean
    public ServletRegistrationBean myServlet() {
         return new ServletRegistrationBean(new MyServlet(),"/myServlet/*");
    }

2), 使用注解的方式實現: 

package com.iwhere.test.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 使用注解的方式注冊servlet
 * 
 * @author wenbronk
 * @time 2017年3月17日 下午4:10:33 2017
 */

@WebServlet(urlPatterns = "/myServlet2/*", description = "Servlet注解方式")
public class AnnotionServlet extends HttpServlet {
    private static final long serialVersionUID = 1121465382990088487L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.err.println("do Get");
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.err.println("do post");

        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>這是:myServlet2</h1>");
        out.println("</body>");
        out.println("</html>");
    }

}

測試: 可通過http://localhost:8080/springboot-learn/myServlet進行訪問: (有加context配置)

 

Filter的配置:

此處只講注解方式, 代碼方式和servlet一樣

package com.iwhere.test.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * 使用注解的方式創建filter, 實現一個filter接口
 * 必須加注解@ServletComponentScan
 * @author wenbronk
 * @time 2017年3月17日  下午4:48:19  2017
 */

@WebFilter(filterName="myFilter", urlPatterns="/*")
public class MyFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("filter is destroy");
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("running filter");
        arg2.doFilter(arg0, arg1);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("filter is init");
    }

    
}

之后必須在main類上添加包掃描或者指定類

@SpringBootApplication
@EnableScheduling
@EnableTransactionManagement(proxyTargetClass = true)
@ServletComponentScan(basePackageClasses = {com.binfo.sqgf.config.SqlInjectFilter.class})
public class SqgfApplication {

或者

 @SpringBootApplication

@EnableAutoConfiguration
@EnableWebMvc
@ServletComponentScan(basePackages = "com.fanyin.eghm")
public class EghmApplication {

    public static void main(String[] args) {
        SpringApplication.run(EghmApplication.class, args);
    }
}

 

 

listener

listener有contextListener, sessionListener,pageListener, beanListener 好多種

servletContextListener;

package com.iwhere.test.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 使用注解的方式實現Contextlistener, 必須實現listener接口
 * 
 * @author wenbronk
 * @time 2017年3月17日  下午4:51:24  2017
 */
@WebListener
public class MyListener implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("servletContext destroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("servletContext init");
    }

}

sessionListener

package com.iwhere.test.web.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * sessionListener, 監聽session的創建和銷毀
 * @author wenbronk
 * @time 2017年3月17日  下午4:56:22  2017
 */
@WebListener
public class MySessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        System.out.println("HttpSession created");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
        System.out.println("HttpSession destroyed");
        
    }

}

 

補充一點, 在listener中使用 springboot的 工廠

mongoTemplate = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(MongoTemplate.class);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM