使用Servlet3.0新特性进行web开发小demo
来源:互联网 发布:js获取滚动条的位置 编辑:程序博客网 时间:2024/05/21 06:38
在上一篇文章中我们使用了SpringMVC结合Servlet3.0的新特性进行web开发。在这一篇文章中我们用最原始的Servlet的方式来进行一个简单的web开发的工作。在我们之前的web开发中我们会在web.xml中进行Servlet、Filter、初始化参数等信息的配置。在Servlet3.0中为我们提供了一个接口:javax.servlet.ServletContainerInitializer。我们可以在这个接口的实现类中进行Servlet、Filter等信息的配置。它的作用和web.xml是很像,可以用来取代web.xml。和ServletContainerInitializer可能同时使用的还有一个javax.servlet.annotation.HandlesTypes注解,这个注解可以把指定的类和它的子类作为参数传入到ServletContainerInitializer的onStartup方法中,可以让我们进行一些其他的扩展功能。主要功能代码如下:
javax.servlet.annotation.HandlesTypes注解指定的类:
package com.zkn.servlet3.initializer;import javax.servlet.ServletContext;/** * Created by zkn on 2017/10/30. */public interface WebApplicationContextInitializer { /** * 容器初始化的时候做一些其他动作 * * @param servletContext */ void onStartup(ServletContext servletContext);}
package com.zkn.servlet3.initializer;import javax.servlet.ServletContext;/** * Created by zkn on 2017/10/30. */public class ContextWebApplicationContextInitializer implements WebApplicationContextInitializer { /** * 容器初始化的时候做一些其他动作 * * @param servletContext */ @Override public void onStartup(ServletContext servletContext) { System.out.println("我是ContextWebApplicationContextInitializer"); }}
package com.zkn.servlet3.initializer;import javax.servlet.ServletContext;/** * Created by zkn on 2017/10/30. */public class ServletWebApplicationContextInitializer implements WebApplicationContextInitializer { /** * 容器初始化的时候做一些其他动作 * * @param servletContext */ @Override public void onStartup(ServletContext servletContext) { System.out.println("我是ServletWebApplicationContextInitializer"); }}
实现javax.servlet.ServletContainerInitiali接口的类
package com.zkn.servlet3;import com.zkn.servlet3.filter.DemoFilter;import com.zkn.servlet3.initializer.WebApplicationContextInitializer;import javax.servlet.*;import javax.servlet.annotation.HandlesTypes;import java.lang.reflect.Modifier;import java.util.EnumSet;import java.util.Set;/** * Created by zkn on 2017/10/30. */@HandlesTypes(WebApplicationContextInitializer.class)public class StartServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> classSet, ServletContext servletContext) throws ServletException { if (classSet != null && !classSet.isEmpty()) { classSet.forEach(e -> { //不是接口,也不是抽象类 if (!e.isInterface() && !Modifier.isAbstract(e.getModifiers()) && WebApplicationContextInitializer.class.isAssignableFrom(e)) { try { WebApplicationContextInitializer webApplication = (WebApplicationContextInitializer) e.newInstance(); webApplication.onStartup(servletContext); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } } }); } //添加Servlet ServletRegistration.Dynamic dynamicServlet = servletContext.addServlet("demoServlet", new DemoStartServlet()); //请求路径 dynamicServlet.addMapping("/demo"); //Servlet InitParam dynamicServlet.setInitParameter("demo", "demo"); dynamicServlet.setLoadOnStartup(1); //添加过滤器 FilterRegistration.Dynamic dynamicFilter = servletContext.addFilter("filter", new DemoFilter()); dynamicFilter.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "demoServlet"); }}在ServletContainerInitializer 的实现类中我们指定了Servlet、Filter、并且指定了Servlet的启动顺序。
指定的Servlet如下:
package com.zkn.servlet3;import com.alibaba.fastjson.JSON;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;/** * Created by zkn on 2017/10/30. */public class DemoStartServlet extends HttpServlet { /** * 处理GET请求 * * @param request * @param response */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { Enumeration<String> parameters = request.getParameterNames(); String paramterName; List<String> parameterValue = new ArrayList<>(); parameterValue.add("请求参数:"); if (parameters != null) { while (parameters.hasMoreElements()) { paramterName = parameters.nextElement(); parameterValue.add(paramterName + "=" + request.getParameter(paramterName) + ";"); } } String resultString = JSON.toJSONString(parameterValue); try { PrintWriter printWriter = new PrintWriter(response.getOutputStream()); printWriter.write(resultString); printWriter.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void init(ServletConfig config) throws ServletException { System.out.println("我是Servlet,我被初始化了、、、、、"); super.init(config); }}指定的Filter如下:
package com.zkn.servlet3.filter;import javax.servlet.*;import java.io.IOException;/** * Created by zkn on 2017/10/30. */public class DemoFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化过滤器!"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("执行一个过滤器!"); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("销毁过滤器!"); }}
但是现在我们缩写的功能还不能生效呢,要想使它生效的话,我们还需要进行一些简单的配置:在META-INF下面建立一个services的文件夹,在这个文件夹下面创建一个javax.servlet.ServletContainerInitializer文件,这个文件的内容如下:com.zkn.servlet3.StartServletContainerInitializer。内容就是我们缩写的ServletContainerInitializer的实现类的类路径。到此我们的一系列准备工作是完成了,下面我们在TomCat中启动一下,一些启动日志如下所示:
从上面的日志中我们可以看出来:HandlesTypes中所指定的类的先与过滤器被初始化,过滤器先与Servlet被初始化。还有一点需要注意的是,因为HandlesTypes所指定的类是做为StartServletContainerInitializer中的onStartup方法的参数的,但是这个参数的类型是set类型的,所以HandlesTypes指定的类的顺序可能是乱的,如果我们想让它们顺序指定的话,我们还需要手动的指定一个初始化的顺序。
下面让我们写一个请求来测试一下:
http://localhost:8080/demo?userName=%E5%BC%A0%E4%B8%89&address=wwwe2323
完整代码路径如下:https://github.com/zhangconan/JavaWeb/tree/master/Servlet3Web
- 使用Servlet3.0新特性进行web开发小demo
- Servlet3.0新特性使用详解
- Servlet3.0新特性使用详解
- Servlet3.0新特性使用详解
- servlet3.0 新特性
- servlet3.0新特性
- Servlet3.0新特性
- servlet3.0新特性
- Servlet3.0新特性
- Servlet3.0新特性
- Servlet3.0新特性
- Servlet3.0新特性
- Servlet3.0新特性
- servlet3.0新特性
- Servlet3.0新特性
- Servlet3.0新特性剖析
- Servlet3.0的新特性
- Servlet3.0新特性讲解
- 寻路插件A* Pathfinding Project_Pro的系统学习(三)_AI Path组件_Seeker组件_RaycastSimplifier后期处理组件_移动路径进行修正功能
- 项目中easyUI的知识点
- 条件运算符的应用
- HashSet,TreeSet和LinkedHashSet的区别
- 在unbuntu环境环境中搭建mingw-w64,编译出a.exe到windows环境的执行文件
- 使用Servlet3.0新特性进行web开发小demo
- 29.Oracle杂记——Oracle常用动态视图v$rowcache
- 使用 emacs org-mode 画图
- Python 函数的参数
- R2: 相关系数、复相关系数及半偏相关系数之间的联系
- 30.Oracle杂记——Oracle常用动态视图v$session
- 使用++,--
- 一致hash
- CSS——background系列属性