重温Servlet,2020年了,它还有必要学吗?


目录

  • 1、本章前言
  • 2、什么是Servlet
  • 3、创建Servlet程序
    • 3.1、使用web.xml文件配置
    • 3.2、使用注解配置(推荐)
  • 4、Servlet生命周期
  • 5、ServletConfig对象
  • 6、ServletContext对象
    • 6.1、获取Web应用程序的初始化参数
    • 6.2、读取 Web 应用下的资源文件
    • 6.3、多个Servlet之间的通信
  • 7、Servlet,GenericServlet和HTTPServlet
  • 8、HttpServletRequest接口
    • 8.1、HttpServletRequest内封装的请求
    • 8.2、通过request获得请求行
    • 8.3、通过request获得请求头
    • 8.4、通过request获得请求体
    • 8.5、Request乱码问题的解决方法
  • 9、HttpServletResponse
    • 9.1、HttpServletResponse内封装的响应
    • 9.2、Response的乱码问题解决
  • 10、Servlet的转发和重定向
  • 11、补充:web应用中的路径问题(重要)
    • 11.1、相对路径的缺点
    • 11.2、绝对路径
    • 11.3、浏览器解析的绝对路径的解决方案

回到顶部回到顶部回到顶部http://localhost:8080/HelloServlet。

注:如果访问不了则在访问地址加上项目名:http://localhost:8080/{项目名称}/HelloServlet

然后查看可知打印数据:


补充:同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的名称。 例如:

    
    >
        
        >HelloServlet>
        
        >com.thr.MyServlet>
    >

    
    >
        
        >HelloServlet>
        
        >/HelloServlet>
    >


    >
        >HelloServlet>
        >/HelloServlet/HelloServlet>
    >

    >
        >HelloServlet>
        >/HelloServlet/HelloServlet/HelloServlet>
    >

通过上面的配置,当我们想访问名称是MyServlet的Servlet,可以使用如下的几个地址去访问,但结果都是访问的同一个Servlet:

  • http://localhost:8080/HelloServlet
  • http://localhost:8080/HelloServlet/HelloServlet
  • http://localhost:8080/HelloServlet/HelloServlet/HelloServlet



回到顶部http://localhost:8080/HelloServlet1,控制台输出了如下信息:

然后,我们在浏览器中刷新3遍:

接下来,我们关闭Servlet容器:

以上就是一个Servlet的整个生命周期了。可以发现,在Servlet的整个生命周期内,Servlet的init()方法只被调用一次。也就是说当客户端多次Servlet请求时,服务器只会创建一个Servlet实例对象,而且Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,Servlet实例对象才会销毁。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。


上面说当客户端在第一次访问Servlet的时候会才创建Servlet实例对象,那如果这个Servlet程序要处理的信息很多,那就会造成第一次访问的Servlet加载时间较长。所以为了解决这样的问题Servlet提供了自动加载机制,就是在启动服务器的时候就将Servlet加载起来,它的操作很简单。我们可以在web.xml中配置也可以在注解中配置。

  • 在web.xml中进行配置:
    >
        >HelloServlet>
        >com.thr.MyServlet>

        
        >1>
    >

注意:中的整数值越大,创建优先级越低!

  • 在注解中进行配置:
@WebServlet(name = "MyServlet",value = "/HelloServlet",loadOnStartup = 1)
public class MyServlet extends HttpServlet {

通过上面的实例,可以看到Servlet在创建时只会执行一次init()方法,后面每次点击都只调用 service() 方法。那么Servlet的一次执行过程是什么样的呢?

上面这幅图可以这样理解:

1、客户端向 Web 服务器发送请求,服务器查询 web.xml 文件配置。根据请求信息找到对应的 Servlet。

2、Servlet 引擎检查是否已经装载并创建了该 Servlet 的实例对象,如果有,则直接执行第4步,否则执行第3步,

3、Web 服务器加载 Servlet,并调用 Servlet 构造器(只会调用一次),创建 Servlet 的实例对象。并调用 init() 方法,完成 Servlet 实例对象的初始化(只会调用一次)。

4、Web 服务器把接收到的 http 请求封装成 ServletRequest 对象,并创建一个 响应消息的 ServletResponse 对象,作为 service() 方法的参数传入。(每一次访问都会调用一次该方法)

5、执行 service()方法,并将处理信息封装到 ServletResponse 对象中返回

6、浏览器拆除 ServletResponse 对象,形成 http 响应格式,返回给客户端。

7、Web 应用程序停止或者重新启动之前,Servlet 引擎将卸载 Servlet实例,并在卸载之前调用 destory() 方法

回到顶部http://localhost:8080/config 访问Servlet,结果如图所示。

从上图中可以看出,web.xml 文件中配置的信息全部被读取了出来。

回到顶部http://localhost:8080/context 访问,浏览器的显示结果如图所示。

从图中可以看出,web.xml 文件中配置的信息被读取了出来。


http://localhost:8080/context1 访问,浏览器的显示结果如图所示。

从图中可以看出,userInfo.properties 资源文件中的内容已经被读取了出来。


回到顶部回到顶部回到顶部回到顶部http://localhost:8080/项目名称/),重定向需要编写项目名称(默认:http://localhost:8080/)。
  • 跳转范围:转发只能访问到当前web应用中的内容,而重定向则可以访问到任意web应用中的内容 。
  • request对象作用范围:转发后,在转发后的页面中仍然可以使用原来的request对象,而重定向,原来的request对象则失去作用。
  • 回到顶部https://blog.csdn.net/qq_19782019/article/details/80292110
  • 作者: 唐浩荣 出处: https://www.cnblogs.com/tanghaorong 本文版权归作者和博客园共有,欢迎转载,但是转载需在博客的合适位置给出原文链接,否则保留追究法律责任的权利。