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
项目下载 :点这里下载