SpringBoot Web(下)

什么是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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值