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
项目下载 :点这里下载
- SpringBoot 实战 (二) :web 综合应用(配置Servlet、Listener、Filter,Log)
- springBoot配置servlet,filter,listener
- SpringBoot中Servlet&Listener&Filter的应用
- SpringBoot--添加配置Servlet,Filter,listener
- SpringBoot项目实战(7):Filter、Listener
- springboot注册servlet,Filter,Listener
- SpringBoot初始教程之Servlet、Filter、Listener配置(七)
- SpringBoot初始教程之Servlet、Filter、Listener配置(七)
- SpringBoot初始教程之Servlet、Filter、Listener配置
- SpringBoot初始教程之Servlet、Filter、Listener配置
- 在SpringBoot中使用 Servlet Filter Listener
- springboot 使用Servlet,Filter,Listener的方法
- springboot实战之注册filter和listener
- web.xml中关于Servlet、Filter、Listener的配置
- Java web项目listener Filter servlet启动顺序和配置
- Java web项目listener Filter servlet启动顺序和配置
- Java web项目listener Filter servlet启动顺序和配置
- Java web项目listener Filter servlet启动顺序和配置
- Ajax随笔,介绍ajax的优缺点和详细的工作原理
- 简单封装本地存储的方法
- effective C++ 条款十解读
- 【Data_Structure笔记1】线性表的顺序存储【顺序表】
- HDU
- SpringBoot 实战 (二) :web 综合应用(配置Servlet、Listener、Filter,Log)
- HDU_6154 CaoHaha's staff
- android 关于apk 打包后的地图定位和导航失败的问题
- 自定义标签实现按钮权限
- Java集合源码分析→ArrayList
- C++学习笔记系列四
- API生命周期第三阶段:API实施:使用swagger codegen生成可部署工程,择取一个作为mock service
- nyoj 49开心的小明
- present or future: optimal pricing for spot instances文章阅读笔记