ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

初识servlet

2022-03-27 16:32:07  阅读:220  来源: 互联网

标签:web 请求 servlet 方法 初识 Servlet pw


CGI

在服务端以进程方式对客户端请求进行处理,多进程方式进行

 

 

 

缺点:   对每一个客户端请求都需要启动一个进程运行程序,当用户数量增加时,服务端资源被大量占用

    由于开发人员对操作系统和进程的不深刻理解,导致经常产生一些错误

      进程与进程之间相互隔离,不同的CGI之间不能共享资源

FastCGI

对CGI模式的改进,采用pooling技术,事先将进程初始化后放到pool池中,一定程度改善性能,但仍然是基于进程运行,不能从根本解决问题

 

 

 

Servlet

1.概念

  1)全名Server Applet,称为服务端小程序,基于java语言编写;

  2)javaEE平台下的技术规范,定义如何处理客户端请求以及为客户端进行响应的技术,由服务器厂商实现;

  3)由于Web容器与应用服务器实现了Servlet标准,因此Servlet需运行在web容器与应用服务器,包括Tomcat容器也实现了该技术

2.技术特点

  使用单进程(tomcat)多线程(servlet)方式运行

 

 

 

3.在应用程序中的位置

  基于Web服务器和数据库之间

 

 

4.编写第一个servlet程序

 

1)记事本编写HelloServlet.java

 

//必须继承HttpServlet
public class HelloServlet extends HttpServlet{

    public void doGet(HttpServletRequest request,HttpServletResponse reponse) throws ServletException,IOException{


        PrintWriter pw=reponse.getWriter();
        //向客户端浏览器输出内容
        pw.println("<!DOCTYPE html>");
        pw.println("<html lang='en'>");
        pw.println("<head>");
        pw.println("<title>Title</title>");
        pw.println("</head>");
        pw.println("<body>");
        pw.println("<font color='#deb887'>HelloServlet!</font>");
        pw.println("</body>");
        pw.println("</html>");
        pw.flush();
        //关闭流对象
        pw.close();

    }

}

 

2)用命令行编译HelloServlet.java

 

3)创建web.xml

  web.xml是Web项目的部署描述文件,JavaWeb的配置文件,可在其配置servlet、filter等技术。Tomcat启动时会先解析该配置文件获取项目配置信息。

web.xml文件头信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
        
xsi:schemaLocation="http://xmlns.jcp.org/xml/
ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/webapp_4_0.xsd"
         version="4.0">
</web-app>

 

4)在web.xml中配置servlet

  配置servlet全名

        <!--配置servlet全名-->
        <servlet>
         <!--servlet别名-->
        <servlet-name>servlet1</servlet-name>
        <servlet-class>com.it.servlet.HelloServlet</servlet-class>
        </servlet>

  配置servlet的URL

        <!--配置servlet的URL-->
        <servlet-mapping>
        <!--将哪个servlet绑定URL-->
        <servlet-name>servlet1</servlet-name>
        <!--请求资源时所对应的URL-->
        <!--为与jsp做区分,可加'.do',也可不加-->
        <url-pattern>/hello.do</url-pattern>
        </servlet-mapping>

  web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
            http://xmlns.jcp.org/xml/ns/javaee/webapp_4_0.xsd"
            version="4.0">

        <!--配置servlet全名-->
        <servlet>
         <!--servlet别名-->
        <servlet-name>servlet1</servlet-name>
        <servlet-class>com.it.servlet.HelloServlet</servlet-class>
        </servlet>

        <!--配置servlet的URL-->
        <servlet-mapping>
        <!--将哪个servlet绑定URL-->
        <servlet-name>servlet1</servlet-name>
        <!--请求资源时所对应的URL-->
        <!--为与jsp做区分,可加'.do',也可不加-->
        <url-pattern>/hello.do</url-pattern>
        </servlet-mapping>

</web-app>
5)部署servlet

  将servlet放到tomcat当中

  web工程目录结构:

 

 

 

 

 

 

 

 

启动tomcat

 Tomcat运行过程

 

 

1)当用户访问localhost:8080/test/HelloWord.do,请求被发送到Tomcat,被监听8080端口并处理HTTP/1.1协议的Connector获得;

2)Connector将请求交给它所在的Service的Engine处理,并等待Engine的回应;

3)Engine获得请求localhost:8080/test/HelloWord.do,匹配所有的虚拟主机Host

4)Engine匹配到名为localhost的Host虚拟主机来处理test/HelloWord.do请求(匹配不到时会交给默认Host处理)

5)匹配到的Context获得请求/HelloWord.do

6)构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloWorld的doGet ()或doPost().执行业务逻辑、数据存储等程序。

7)Context把执行完之后的结果通过HttpServletResponse(处理响应)对象返回给Host

8)Host把HttpServletResponse返回给Engine

9)Engine把HttpServletResponse对象返回Connector

10)Connector把HttpServletResponse对象返回给客户Browser

 Servlet继承结构

 

 

 

 

 

 

 

 

 

 

Servlet接口

  • init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
  • service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。
  • destroy(),在销毁Servlet对象之前调用该方法,释放资源。
  • getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
  • getServletInfo(),获取servlet相关信息。

ServletConfig接口

  • String getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
  • ServletContext getServletContext(),返回一个代表当前 Web 应用的 ServletContext 对象。
  • String getInitParameter(String name),根据初始化参数名返回对应的初始化参数值。 Enumeration getInitParameterNames(),返回一个 Enumeration 对象,其中包含了所有的初始 化参数名。

 GenericServle抽象类

  GenericServlet是实现了Servlet接口的抽象类。在GenericServlet 中进一步的定义了Servlet接口的具体实现,其设计的目的是为了和 应用层协议解耦,在GenericServlet中包含一个Service抽象方法。

HttpServlet类

  继承自 GenericServlet,针对于处理 HTTP 协议的请求所定制。在 HttpServlet的service() 方法中已经把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转。实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可。

Servlet生命周期

Servlet生命周期由Tomcat容器管理,(由Tomcat实例化),经以下三个阶段:

单例模式:只实例化一次

  init():客户端第一次请求Servlet时,容器(并不是启动时就实例化Servlet)会实例化该Servlet,然后调用init(),只调用一次

  service():在第一次执行service方法处理请求完毕后,容器不会销毁该Servlet,而是做缓存处理,当客户端浏览器再次请求该Servlet时,容器会从缓存中直接找到该Servlet对象,并在新的进程中执行Service方法

  destroy():当容器在销毁Servlet之前会调用一次destroy方法

Servlet处理请求的原理

  • 当浏览器基于get方式请求我们创建Servlet时,自定义的 Servlet中的doGet方法会被执行。
  • doGet方法能够被执行并处理get 请求的原因是:容器在启动时会解析web工程中WEB-INF目录中的 web.xml文件,在该文件中我们配置了Servlet与URI的绑定,容器通过对请求的解析可以获取请求资源的URI,然后找到与该URI绑定 的Servlet并做实例化处理(注意:只实例化一次,如果在缓存中能够 找到这个Servlet就不会再做次实例化处理)。
  • 在实例化时会使用 Servlet接口类型作为引用类型的定义,并调用一次init方法,由于 GenericServlet中重写了该方法所以最终执行的是GenericServlet中 init方法(GenericServlet中的Init方法是一个空的方法体),然后在新的线程中调用service方法。
  • 由于在HttpServlet中重写了Service方法所以最终执行的是HttpServlet中的service方法。
  • 在service方法中通过request.getMethod()获取到请求方式进行判断:如果是Get方式请求就执行doGet方法,如果是POST请求就执行doPost方法。
  • 如果是基于GET方式提交的,并且在我们的Servlet中又重写了 HttpServlet中的doGet方法,那么最终会根据Java的多态特性转而执行我们自定义的Servlet中的doGet方法。

 Servlet的作用

  • 获取用户提交的数据
  • 获取浏览器附加的信息
  • 通过访问数据库或调用接口处理数据
  • 给浏览器产生一个响应
  • 为客户端响应时在响应头信息中添加key-value值丰富响应信息

以上图片来源:https://www.itbaizhan.com/

标签:web,请求,servlet,方法,初识,Servlet,pw
来源: https://www.cnblogs.com/chaplu/p/16044702.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有