SpringBoot 实战 (二) :web 综合应用(配置Servlet、Listener、Filter,Log)

web开发

spring boot web开发非常的简单,其中包括常用的json输出、filters、property、log等

json输出

只需要类添加 @RestController 即可,默认类中的方法都会以json的格式返回。
下面是样例代码,需自己手动创建User类。

@EnableAutoConfiguration
@RestController
public class HelloWorldJsonController {

    @RequestMapping("/getUser")
    public User getUser() {
        User user=new User();
        user.setUserName("alice");
        user.setPassword("123456");#
        return user;
    }

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

运行结果:
这里写图片描述

如果我们需要使用页面开发只要使用 @Controller

配置Servlet/Listener/Filter

Spring Boot集成了servlet容器,当我们在pom文件中增加spring- boot-starter-web的maven依赖时,不做任何web相关的配置便能提供web服务,这还得归于spring boot 自动配置的功能(因为加了EnableAutoConfiguration的注解),帮我们创建了一堆默认的配置,以前在web.xml中配置,现在都可以通过spring bean的方式进行配置,由spring来进行生命周期的管理,大多数情况下,我们需要重载这些配置(例如修改服务的启动端 口,contextpath,filter,listener,servlet,session超时时间等)

下面讲解在SpringBoot中如何配置Servelt、Filter、Listener。大家可能已经注意到,在SpringBoot中,不光将Spring的配置文件省略了,连web容器的web.xml文件都省略了,而之前,我们通常都是将Servelt、Filter、Listener等配置在web.xml中配置的,而SpringBoot提供了更加简化的配置。

SpringBoot提供了2种方式配置Servlet、Listener、Filter。一种是基于RegistrationBean,另一种是基于注解。

基于RegistrationBean的配置

DemoServelt.java

package com.ailianshuo.web.controller;

import java.io.IOException;

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

import com.ailianshuo.web.domain.User;
public class DemoServlet  extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            System.out.println("==>DemoServlet接受请求");
            ServletContext servletContext=req.getSession().getServletContext();
            User user= (User) servletContext.getAttribute("user1");
            resp.getWriter().write("DemoServlet Access:"+user.toString());

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

DemoFilter.java

package com.ailianshuo.web.utility;
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;
public class DemoFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("==>DemoFilter启动");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("==>DemoFilter拦截请求 开始");
        chain.doFilter(request, response);
        System.out.println("==>DemoFilter拦截请求 结束");
    }

    @Override
    public void destroy() {
        System.out.println("==>DemoFilter destroy");
    }
}

DemoListener.java

package com.ailianshuo.web.utility;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.ailianshuo.web.domain.User;

public class DemoListener implements ServletContextListener{
    private ServletContext context = null;    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("==>DemoListener启动");
        context = sce.getServletContext();          
        User user = new User();
        user.setUserName("1234");
        user.setPassword("111111");
        context.setAttribute("user1", user);    

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("==>DemoListener Begin Destroy");
        User user = (User)context.getAttribute("user1");         
        System.out.println(user.toString());
        this.context = null;    
        System.out.println("==>DemoListener End Destroy");
    }
}

编写配置类WebConfig.java

package com.ailianshuo.web.config;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.ailianshuo.web.controller.DemoServlet;
import com.ailianshuo.web.utility.DemoFilter;
import com.ailianshuo.web.utility.DemoListener;


@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
    @Bean
    public FilterRegistrationBean getDemoFilter(){
        DemoFilter demoFilter=new DemoFilter();
        FilterRegistrationBean registrationBean=new FilterRegistrationBean();
        registrationBean.setFilter(demoFilter);
        List<String> urlPatterns=new ArrayList<String>();
        urlPatterns.add("/*");//拦截路径,可以添加多个
        registrationBean.setUrlPatterns(urlPatterns);
        registrationBean.setOrder(1);
        return registrationBean;
    }
    @Bean
    public ServletRegistrationBean getDemoServlet(){
        DemoServlet demoServlet=new DemoServlet();
        ServletRegistrationBean registrationBean=new ServletRegistrationBean();
        registrationBean.setServlet(demoServlet);
        List<String> urlMappings=new ArrayList<String>();
        urlMappings.add("/demoservlet");访问,可以添加多个
        registrationBean.setUrlMappings(urlMappings);
        registrationBean.setLoadOnStartup(1);
        return registrationBean;
    }
    @Bean
    public ServletListenerRegistrationBean<EventListener> getDemoListener(){
        ServletListenerRegistrationBean<EventListener> registrationBean
                                   =new ServletListenerRegistrationBean<>();
        registrationBean.setListener(new DemoListener());
//      registrationBean.setOrder(1);
        return registrationBean;
    }
}

这个类编写好,就相当于已经完成了配置。

运行SpringbootWebApplication.java,控制台输出:
这里写图片描述

可以看到Listener和Filter在应用启动的时候,都初始化了。
在浏览器中访问servlet:http://localhost:8080/demoservlet
这里写图片描述

可以看到servlet可以接受到请求并响应。而在控制台中,我们还可以看到
这里写图片描述
说明对于servlet的请求,Filter是可以进行成功拦截的。

基于注解的配置

AnnotationDemoServlet.java

package com.ailianshuo.web.controller;

import java.io.IOException;

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;

import com.ailianshuo.web.domain.User;

@WebServlet(name = "AnnotationDemoServlet",urlPatterns = "/annotationdemo")
public class AnnotationDemoServlet extends HttpServlet{
      @Override
      public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          ServletContext servletContext=req.getSession().getServletContext();
            User user= (User) servletContext.getAttribute("user2");
          resp.getWriter().print("annotationdemo : "+user.toString());
          resp.getWriter().flush();
          resp.getWriter().close();
      }

      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          this.doGet(req, resp);
      }
}

AnnotationDemoFilter.java

package com.ailianshuo.web.utility;

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;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.annotation.Order;

@Order(1)
@WebFilter(urlPatterns = "/*", filterName = "annotationDemoFilter")
public class AnnotationDemoFilter implements Filter{
    Log log = LogFactory.getLog(AnnotationDemoFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
         System.out.println("==>AnnotationDemoFilter 启动");
        log.info("init IndexFilter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("doFilter IndexFilter");

        System.out.println("==>AnnotationDemoFilter 拦截请求 开始");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("==>AnnotationDemoFilter 拦截请求 结束");
    }

    @Override
    public void destroy() {
        System.out.println("==>AnnotationDemoFilter 销毁");
    }
}

比较核心的代码是自定义类上面加上@WebFilter,其中@Order注解表示执行过滤顺序,值越小,越先执行

AnnotationDemoListener.java

package com.ailianshuo.web.utility;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ailianshuo.web.domain.User;

@WebListener
public class AnnotationDemoListener implements ServletContextListener{
      private Log log = LogFactory.getLog(AnnotationDemoListener.class);
      private ServletContext context = null;    
      @Override
      public void contextInitialized(ServletContextEvent servletContextEvent) {
          System.out.println("==>AnnotationDemoListener启动");
          context = servletContextEvent.getServletContext();          
          User user = new User();
          user.setUserName("user2");
          user.setPassword("88888");
          context.setAttribute("user2", user);    
          log.info("AnnotationDemoListener contextInitialized");
      }

      @Override
      public void contextDestroyed(ServletContextEvent servletContextEvent) {
          System.out.println("==>AnnotationDemoListener Begin Destroy");
        User user = (User)context.getAttribute("user2");         
          System.out.println("AnnotationDemoListener -- contextDestroyed: "+user.toString());
          this.context = null;    
        System.out.println("==>AnnotationDemoListener End Destroy");
          log.info("AnnotationDemoListener contextDestroyed");
      }
}

把注解@ServletComponentScan加到入口处(SpringbootWebApplication)启动即可

package com.ailianshuo.web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class SpringbootWebApplication {

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

运行SpringbootWebApplication.java,控制台输出:
这里写图片描述

浏览器输入:http://localhost:8080/annotationdemo

这里写图片描述

后台输出:
这里写图片描述

配置Log

简单配置

在src/main/resources/application.properties
配置输出的地址和输出级别

logging.path=E:/sample/springboot/log
logging.level.com.favorites=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=ERROR

path为本机的log地址,logging.level 后面可以根据包路径配置不同资源的log级别

浏览器输入:http://localhost:8080/annotationdemo 可以查看日志:

2017-08-22 23:32:55.210  INFO 4036 --- [http-nio-8080-exec-1] c.a.web.utility.AnnotationDemoFilter     : doFilter IndexFilter

项目下载 :点这里下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值