什么是Servlet?
Servlet是一种基于Java技术的Web组件,用于生成动态内容,由容器管理。类似于其他Java技术组件,Servlet是平台无关的Java类组成,并且由Java Web服务器加载执行
什么是Servlet容器?
Servlet 容器,有时候也称作为 Servlet 引擎,作为Web服务器或应用服务器的一部分。通过请求和响应对话,提供 Web 客户端与 Servlets 交互的能力。容器管理Servlets实例以及它们的生命周期。
Servlet 3.0前时代
服务组件
- javax.servlet.Servlet
- javax.servlet.Filter(since Servlet 2.3)
上下文组件
- javax.servlet.ServletContext
- javax.servlet.http.HttpSession(服务端)
- javax.servlet.http.HttpServletRequest
- javax.servlet.http.HttpServletResponse
- javax.servlet.http.Cookie(客户端)
配置
- javax.servlet.ServletConfig
- javax.servlet.FilterConfig(since Servlet 2.3 )
输入输出(二进制输入和输出)
- javax.servlet.ServletInputStream
- javax.servlet.ServletOutputStream
异常
- javax.servlet.ServletException
事件
生命周期类型
- javax.servlet.ServletContextEvent
- javax.servlet.http.HttpSessionEvent
- java.servlet.ServletRequestEvent
属性上下文类型
- javax.servlet.ServletContextAttributeEvent
- javax.servlet.http.HttpSessionBindingEvent
- javax.servlet.ServletRequestAttributeEvent
监听器(since Servlet 2.3)
生命周期类型
- javax.servlet.ServletContextListener
- javax.servlet.http.HttpSessionListener
- javax.servlet.http.HttpSessionActivationListener
- javax.servlet.ServletRequestListener
属性上下文类型
- javax.servlet.ServletContextAttributeListener
- javax.servlet.http.HttpSessionAttributeListener
- javax.servlet.http.HttpSessionBindingListener
- javax.servlet.ServletRequestAttributeListener
Servlet 3.0后时代
组件申明注解
@javax.servlet.annotation.WebServlet
@javax.servlet.annotation.WebFilter
@javax.servlet.annotation.WebListener
下面是权限和安全
@javax.servlet.annotation.ServletSecurity
@javax.servlet.annotation.HttpMethodConstraint
@javax.servlet.annotation.HttpConstraint
配置申明
@javax.servlet.annotation.WebInitParam
上下文
javax.servlet.AsyncContext
事件
javax.servlet.AsyncEvent
监听器
javax.servlet.AsyncListener
Servlet 组件注册
javax.servlet.ServletContext#addServlet()
javax.servlet.ServletRegistration
Filter 组件注册
javax.servlet.ServletContext#addFilter()
javax.servlet.FilterRegistration
监听器注册
javax.servlet.ServletContext#addListener()
javax.servlet.AsyncListener
自动装配
初始器
javax.servlet.ServletContainerInitializer
类型过滤
@javax.servlet.annotation.HandlesTypes
Servlet 生命周期
一般情况不会直接实现Servlet接口,而是继承HttpServlet接口,他的service方法会获取当前http请求的方法,然后调用对应的doGet/doHead/doPost/doPut/doDelete/doOptions方法
初始化
当容器启动或者第一次执行时,Servlet#init(ServletConfig)方法被执行,初始化当前Servlet 。
处理请求
当HTTP 请求到达容器时,Servlet#service(ServletRequest,ServletResponse) 方法被执行,来处理请求。
销毁
当容器关闭时,容器将会调用Servlet#destroy 方法被执行,销毁当前Servlet。
Filter 生命周期
初始化
当容器启动时,Filter#init(FilterConfig)方法被执行,初始化当前Filter。
处理请求
当HTTP 请求到达容器时,Filter#doFilter(ServletRequest,ServletResponse,FilterChain) 方法被执行,来拦截请求,在Servlet#service(ServletRequest,ServletResponse) 方法调用前执行。
销毁
当容器关闭时,容器将会调用Filter#destroy 方法被执行,销毁当前Filter。
Servlet On Spring Boot
Servlet 组件扫描
@org.springframework.boot.web.servlet.ServletComponentScan
指定包路径扫描
String[] value() default {}
String[] basePackages() default {}
指定类扫描
Class<?>[] basePackageClasses() default {}
注解方式注册
Servlet组件
1.扩展 javax.servlet.Servlet
javax.servlet.http.HttpServlet
org.springframework.web.servlet.FrameworkServlet
2.标记 @javax.servlet.annotation.WebServlet
Servlet
Filter组件
实现 javax.servlet.Filter
org.springframework.web.filter.OncePerRequestFilter
标记 @javax.servlet.annotation.WebFilter
监听器
监听器组件
实现Listener接口
javax.servlet.ServletContextListener
javax.servlet.http.HttpSessionListener
javax.servlet.http.HttpSessionActivationListener
javax.servlet.ServletRequestListener
javax.servlet.ServletContextAttributeListener
javax.servlet.http.HttpSessionAttributeListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.ServletRequestAttributeListener
标记 @javax.servlet.annotation.WebListener
SpringBootLearnApplication
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.yun.springbootlearn.servlet"})
public class SpringBootLearnApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootLearnApplication.class, args);
System.out.println("start");
}
}
MyFilter
@WebFilter(urlPatterns = "/myservlet")
public class MyFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ServletContext context = request.getServletContext();
context.log("/myservlet was filtered");
filterChain.doFilter(request,response);
}
}
MyServlet
@WebServlet(
name = "myServlet",
urlPatterns = "/myservlet",
initParams ={
@WebInitParam(name = "myname", value = "myvalue")
}
)
public class MyServlet extends HttpServlet {
private String value;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
value = servletConfig.getInitParameter("myname");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Writer writer = resp.getWriter();
//是通过super.init(servletConfig)初始化好才可以得到ServletContent
ServletContext context = getServletContext();
context.log("myServlet do get");
writer.write("<html><body>Hello,World“”“"+value+"</body></html>");
}
}
MyListener
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
ServletContext context = request.getServletContext();
context.log("request was initialized");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
ServletContext context = request.getServletContext();
context.log("request was destoryed");
}
}
Spring Boot API方式注册
Servlet 组件
1.扩展 javax.servlet.Servlet
javax.servlet.http.HttpServlet
org.springframework.web.servlet.FrameworkServlet
2.组装 Servlet
Spring Boot 1.4.0 开始支持
org.springframework.boot.web.servlet.ServletRegistrationBean
Spring Boot 1.4.0 之前
org.springframework.boot.context.embedded.ServletRegistrationBean
3.暴露 Spring Bean
@Bean
Filter 组件
1.实现 javax.servlet.Filter
org.springframework.web.filter.OncePerRequestFilter
2.组装 Filter
Spring Boot 1.4.0 开始
org.springframework.boot.web.servlet.FilterRegistrationBean
Spring Boot 1.4.0 之前
org.springframework.boot.context.embedded.FilterRegistrationBean
3.暴露 Spring Bean
@Bean
监听器组件
1.实现 Listener
2.组装 Listener
Spring Boot 1.4.0 开始
org.springframework.boot.web.servlet.ServletListenerRegistrationBean
Spring Boot 1.4.0 之前
org.springframework.boot.context.embedded.ServletListenerRegistrationBean
3.暴露 Spring Bean
@Bean
MyServlet2
public class MyServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Writer writer = resp.getWriter();
//是通过super.init(servletConfig)初始化好才可以得到ServletContent
ServletContext context = getServletContext();
context.log("myServlet do get 2");
writer.write("<html><body>Hello,World“”“ from myservlet2</body></html>");
}
}
MyFilter2
public class MyFilter2 extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
doSomething();
filterChain.doFilter(request,response);
}
public void doSomething() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
ServletContext servletContext = request.getServletContext();
String requestURI = request.getRequestURI();
servletContext.log(requestURI + " was filtered!");
}
}
SpringBootLearnApplication
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.yun.springbootlearn.servlet"})
public class SpringBootLearnApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootLearnApplication.class, args);
System.out.println("start");
}
@Bean
public static ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new MyServlet2());
servletRegistrationBean.setName("my-servlet2");
servletRegistrationBean.addUrlMappings("/spring-boot/myservlet2");
servletRegistrationBean.addInitParameter("myname","myvalue");
return servletRegistrationBean;
}
@Bean
public static FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter2());
filterRegistrationBean.addServletNames("my-servlet2");
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE);
return filterRegistrationBean;
}
@Bean
public static ServletListenerRegistrationBean servletListenerRegistrationBean() {
ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
servletListenerRegistrationBean.setListener(new MyServletRequestListener());
return servletListenerRegistrationBean;
}
}
激活 传统Servlet Web部署
1.需要引入相应的依赖
<!-- JSP 渲染引擎 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
2.修改打包方式为war包
<packaging>war</packaging>
3.Spring Boot 1.4.0 开始 继承
org.springframework.boot.web.support.SpringBootServletInitializer
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.yun.springbootlearn.servlet"})
public class SpringBootLearnApplication extends SpringBootServletInitializer {
}
4.组装 org.springframework.boot.builder.SpringApplicationBuilder
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
builder.sources(SpringBootLearnApplication.class);
return builder;
}
5.配置JSP视图 在application.properties
org.springframework.boot.autoconfigure.web.WebMvcProperties
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp