web基础和http协议 ┌─────────┐┌─────────┐ │░░░░░░░░░││o ░░░░░░░│ ├─────────┤├─────────┤ │░░░░░░░░░││ │ ├─────────┤│ │ │░░░░░░░░░│└─────────┘ └─────────┘ │ request 1 │ │─────────────────────>│ │ request 2 │ │─────────────────────>│ │ response 1 │ │<─────────────────────│ │ request 3 │ │─────────────────────>│ │ response 3 │ │<─────────────────────│ │ response 2 │ │<─────────────────────│ ▼ ▼
我们注意到http协议是一个请求-响应协议,它总是发送一个请求,然后接收一个响应。能不能一次性发送多个请求,然后再接收多个响应呢?http 2.0可以支持浏览器同时发出多个请求,但每个请求需要唯一标识,服务器可以不按请求的顺序返回多个响应,由浏览器自己把收到的响应和请求对应起来。可见,http 2.0进一步提高了传输效率,因为浏览器发出一个请求后,不必等待响应,就可以继续发下一个请求。
http 3.0为了进一步提高速度,将抛弃tcp协议,改为使用无需创建连接的udp协议,目前http 3.0仍然处于实验推广阶段。
什么是servlet在javaee平台上,处理tcp连接,解析http协议这些底层工作统统扔给现成的web服务器去做,我们只需要把自己的应用程序跑在web服务器上。为了实现这一目的,javaee提供了servlet api,我们使用servlet api编写自己的servlet来处理http请求,web服务器实现servlet api接口,
实现底层功能.
// webservlet注解表示这是一个servlet,并映射到地址 hello.do@webservlet(urlpatterns = "/hello.do")public class helloservlet extends httpservlet { protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { // 设置响应类型: resp.setcontenttype("text/html"); // 获取输出流: printwriter pw = resp.getwriter(); // 写入响应: pw.write("<h2>hello, world!</h2>"); // 最后不要忘记flush强制输出: pw.flush(); }}
一个servlet总是继承自httpservlet,然后覆写doget()或dopost()方法。注意到doget()方法传入了httpservletrequest和httpservletresponse两个对象,分别代表http请求和响应。我们使用servlet api时,并不直接与底层tcp交互,也不需要解析http协议,因为httpservletrequest和httpservletresponse就已经封装好了请求和响应。以发送响应为例,我们只需要设置正确的响应类型,然后获取printwriter,写入响应即可。
而这样的一个项目最终会打包成一个*.war文件,运行这个文件,需要使用支持servletapi的web容器(web服务器)。
因此,我们首先要找一个支持servlet api的web服务器。
常用的服务器有:
tomcat:由apache开发的开源免费服务器;
jetty:由eclipse开发的开源免费服务器;
glassfish:一个开源的全功能javaee服务器。
servlet的生命周期在通过一个url路径发起对一个servlet请求的过程中,其本质是在调用执行servlet实例的doxxx()方法。该servlet实例创建和使用的过程,被称为servlet的生命周期。整个生命周期包括:实例化、初始化、服务、销毁。
实例化:根据servlet请求的路径(例如:home.do),查找该servlet的实例。如果实例不存在,则通过调用构造方法,完成servlet实例的创建。
初始化:通过该servlet的实例,调用init()方法,执行初始化的逻辑。
服务:通过该servlet的实例,调用service()方法,如果子类没有重写该方法,则调用httpservlet父类的service()方法,在父类的该方法中进行请求方式的判断,如果是get请求,则调用doget()方法;如果是post请求,则调用dopost()方法;
如果子类重写doxxx()方法,则调用子类重写后的doxxx()方法;
如果子类没有重写doxxx()方法,则调用父类的doxxx()方法,在父类的方法实现中,返回一个405状态码的错误页面。
405状态码:代表请求的方式服务器不提供支持。
4.销毁:服务器关闭或重启时,会销毁所有的servlet实例,会调用servlet实例的destroy()方法。
package com.my.hyz.web.servlet; import java.io.ioexception;import javax.servlet.servletexception;import javax.servlet.annotation.webservlet;import javax.servlet.http.httpservlet;import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse;//@webservlet("/home.do")public class homeservlet extends httpservlet { public homeservlet() { system.out.println("实例化"); } @override public void init() throws servletexception { system.out.println("初始化"); //super.init(); } @override protected void service(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { system.out.println("调用service实例"); } @override public void destroy() { system.out.println("销毁咯!!!!"); } @override protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { // todo auto-generated method stub system.out.println("哎呦get到了"+this.hashcode()); } @override protected void dopost(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { system.out.println("哎呦post到了"); }}
以上就是java中的servlet怎么实现的详细内容。