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

来源:互联网 发布:友盟推送 php服务器端 编辑:程序博客网 时间:2024/05/17 23:06

  • json输出
  • 配置ServletListenerFilter
    • 基于RegistrationBean的配置
    • 基于注解的配置
  • 配置Log
    • 简单配置

web开发

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

json输出

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

@EnableAutoConfiguration@RestControllerpublic 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;@Configurationpublic 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;@WebListenerpublic 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@ServletComponentScanpublic 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/loglogging.level.com.favorites=DEBUGlogging.level.org.springframework.web=INFOlogging.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
原创粉丝点击