初识servlet
作者:互联网
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