Servlet 3.0
- servlet3.0-简介&测试
- 使用前导入servlet相关的依赖
- @WebServlet : 注册servlet ,以及servlet 3.0相关的注解说明,链接在下面:
- servlet3.0 ==> ServletContainerInitializer
- servlet3.0-在ServletContext中利用编码的方式注册三大组件
- servlet3.0-与SpringMVC整合分析
- servlet3.0-异步请求
- springmvc-异步请求-返回Callable
servlet3.0-简介&测试
现在,我们来说说注解版的web,我们以前来写web的三大组件:Servlet、Filter、Listener,包括SpringMVC的前端控制器DispatcherServlet都需要在web.xml文件中来进行注册;而在Servlet3.0标准以后,就给我们提供了方便的注解的方式来完成我们这些组件的注册以及添加,提供了运行时的可插拔的插件能力;
说明:Servlet3.0及以上的标准是需要Tomcat7及以上的支持;
如果使用全注解开发,那么就可以去掉web.xml配置文件了,转用编码方式进行替代
使用前导入servlet相关的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
@WebServlet : 注册servlet ,以及servlet 3.0相关的注解说明,链接在下面:
@WebServlet("/hello")//指定当前servlet的请求映射路径
public class MyServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("大忽悠");
}
}
同样,要注册Filter用@WebFilter注解、注册Listener用@WebListener注解;如果在注册的时候,需要一些初始化参数,我们就可以用@WebInitParam注解;
Servlet 3.0 注解 @WebServlet @WebFilter @WebListener
小细节回顾: 解决tomcat响应中文乱码问题,通知浏览器使用uft-8编码来对数据进行解码
resp.setContentType("text/html;charset=utf-8");
servlet3.0 ==> ServletContainerInitializer
Shared libraries(共享库) / runtimes pluggability(运行时插件能力)
1、Servlet容器启动会扫描,当前应用里面每一个jar包的ServletContainerInitializer的实现
2、提供ServletContainerInitializer的实现类;
必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer
文件的内容就是ServletContainerInitializer实现类的全类名;
总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面
META-INF/services/javax.servlet.ServletContainerInitializer
指定的实现类,启动并运行这个实现类的方法;传入感兴趣的类型;
ServletContainerInitializer;
@HandlesTypes;
第一步:我们写一个MyServletContainerInitializer 类实现ServletContainerInitializer 接口
//容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类或者子接口等)传递过来
//传入感兴趣的类型
@HandlesTypes(value = {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {
/**
* 在应用启动的时候,会运行onStartup方法;
* Set<Class<?>> :感兴趣的类型的所有子类型;
* ServletContext 代表当前的web应用的ServletContext对象,一个web应用相当于是一个ServletContext
* @throws ServletException
*/
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("感兴趣的类型:");
set.forEach(System.out::println);
}
}