Servlet4.0初识总结

JavaEE8

JavaEE8,是自2013年6月Java企业版的首次更新。JAVAEE8提供了一些新的API,提供了对HTTP/2的新支持。

Servlet4.0

Servlet API是JAVA开发人员最熟悉的API之一。

Servlet在JavaWeb的开发中发挥着重要的作用。JAVAEE8对Servlet进行了重要的更新:

  • 服务器推送
  • 提供了对Servlet映射的运行时发现。
  • 简化了Filter的开发。

其中服务器推送是最主要的更新

配置需要:

  • jdk8+
  • tomcat9(支持HTTP/2)
  • tomcat-native
  • openssl

配置tomcat

编辑server.xml,将原来的port="8080" HTTP/1.1替换成:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
            maxThreads="150" SSLEnabled="true" >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
        <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                        certificateFile="conf/localhost-rsa-cert.pem"
                        type="RSA" />
    </SSLHostConfig>
</Connector>

生成SSL证书

生成私钥和证书文件在tomcat-native目录下:

OpenSSL> genrsa -out localhost-rsa-key.pem 2048
OpenSSL> req -new -x509 -key localhost-rsa-key.pem -out localhost-rsa-cert.pem -days 3650

localhost-rsa-key.pemlocalhost-rsa-cert.pem复制到tomcat的conf/文件夹下。

将tomcat-native中bin/(x64/)下的tcnative-1.dlltcnative-1-src.pdb复制到JAVA_HOME的/bin目录下

然后重启tomcat就能用HTTP/2来连接了。

服务器推送

将用户所需的WEB资源提前推送到用户的浏览器缓存中,当用户使用浏览器访问所需WEB资源时,用户不需要再次下载所需的WEB资源,因为用户所需的WEB资源已经存在于用户的浏览器缓存中。

获取:

request.newPushBuilder();

方法:

PushBuilder.path()设置要推送资源的路径。
PushBuilder.push()推送WEB资源到用户的浏览器缓存中。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PushBuilder pb = request.newPushBuilder();
    pb.path("pic01.jpg");
    pb.push();
}

简化:

PushBuilder pb = request.newPushBuilder();
pb.path("pic01.jpg").push();
pb.path("pic02.jpg").push();

HttpServletMapping

在运行时获取Servlet的映射信息(反射机制)

获取:

request.getHttpServletMapping();

方法:

getMappingMatch() 请求路径的类型
getMatchValue() 映射的资源名
getPattern() 返回Servlet映射的路径
getServletName() 返回Servlet的名称

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpServletMapping mapping = request.getHttpServletMapping();
    MappingMatch match = mapping.getMappingMatch();
    System.out.println(match);
    String value = mapping.getMatchValue();
    System.out.println(value);
    String pattern = mapping.getPattern();
    System.out.println(pattern);
    String name = mapping.getServletName();
    System.out.println(name);
}

HttpFilter

Filter的实现类:

  • GenericFilter
  • HttpFilter,是GenericFilter的子类。

通过继承HttpFilter来实现Filter:

@WebFilter(filterName = "FilterDemo",urlPatterns = "/*")
public class FilterDemo extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        System.out.println("FilterDemo:放行前");
        chain.doFilter(request,response);
        System.out.println("FilterDemo:放行后");
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/servlet4-0%e5%88%9d%e8%af%86%e6%80%bb%e7%bb%93/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年11月27日 18:05
下一篇 2019年11月28日

相关推荐

  • 对象的输入输出-Java序列化机制

    对象序列化和反序列化,在Java中体现为两种字节流: ObjectInputStream、ObjectOutputStream 序列化的概念 指堆内存中的java对象数据,通过某种…

    Java 2019年12月21日
    0170
  • JDK8-Stream流库详解

    流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现它。 流的创建 Collection.stream(…

    Java 2020年2月11日
    0150
  • 谈谈Java中的Iterator

    摘要 Iterator的作用? Iterator和Enumeration的区别? Iterator和ListIterator的区别? Iterator和foreach的关联? It…

    Java 2019年12月6日
    0180
  • AbstractCollection默认集合类

    AbstractCollection用于实现基本的Collection结构,提供给普通用户继承使用。也是JDK集合类的父类,部分方法是没有被重载的。 相比Collection接口并…

    Java 2019年11月18日
    0100
  • NIO网络编程之Selector介绍

    Selector 要实现异步IO要通过Selector,甚至我们可以通过一个线程管理多个Channel的读写,这是NIO相较BIO的优越之处之一。 Channel可以注册到一个Se…

    Java 2020年2月7日
    0760
  • 基于BIO模型实现多人聊天室

    第一版 服务端实现: public class ChatServer { private int DEFAULT_PORT = 8888; private final String…

    Java 2020年2月6日
    0380
  • JavaIO-缓冲流与转换流

    缓冲流 概述 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,BufferedO…

    Java 2020年2月4日
    0120
  • JUC包下的读写锁ReentrantReadWriteLock以及StampedLock

    ReentrantReadWriteLock 概述 当读操作远远高于写操作时,这时候使用 读写锁 让 读-读 可以并发,提高性能。 类似于数据库中的 select ... from…

    2020年2月5日
    0140
  • Java基础查缺补漏04

    继续我的复习刷题 接口方法可以使用abstract修饰 问题: java接口的方法修饰符可以为?(忽略内部接口) A. privateB. protectedC. finalD. …

    Java 2020年5月28日
    0200
  • Java多线程基础

    多线程应用 异步调用 以调用方角度来讲,如果+ 需要等待结果返回,才能继续运行就是同步+ 不需要等待结果返回,就能继续运行就是异步 同步在多线程中还有另外一个意思,是让多个线程步调…

    2020年1月31日
    0340

发表回复

登录后才能评论