热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Servlet的起源以及Servlet到底是什么,rocketmq教程教程

1.创建服务器socket,并绑定端口号,可以自己指定。ServerSocketssnewServerSocket(8888);循环监听客户端连接while(true){监听客户端



//1.创建服务器socket,并绑定端口号,可以自己指定。

ServerSocket ss = new ServerSocket(8888);

//循环监听客户端连接

while (true) {

//监听客户端连接,返回对应的socket对象.此方法在成功返回之前一直阻塞!

Socket socket = ss.accept();

//启动一个线程处理该连接

serverExecutors.submit(new myCall(socket));

}

}

static class myCall implements Callable {

Socket socket;

public myCall(Socket socket) {

this.socket = socket;

}

@Override

public Object call() throws Exception {

//处理请求

processData();

//返回响应

responseData();

return null;

}

private void processData() throws IOException {

//创建输入流,使用read()读取数据,如果未读取到数据,此方法将一直阻塞!

InputStream is = socket.getInputStream();

byte[] b = new byte[1024];

int read = is.read(b);

//获取请求的数据

System.out.println(new String(b, 0, read));

}

private void responseData() throws IOException {

//给客户端响应,获得输出流,发送数据

OutputStream os = socket.getOutputStream();

String str = "HTTP/1.1 200 OK   " +

"Server: Apache-Coyote/1.1   " +

“Accept-Ranges: bytes\n” +

“ETag: W/“480-1543570084000”\n” +

“Last-Modified: Fri, 03 Dec 2020 17:47:04 GMT \n” +

“Content-Type: text/html       \n” +

“Content-Length: 480           \n” +

“Date: Fri, 30 Nov 2018 16:39:05 GMT   \n” +

“\n” +

“\n” +

“\n” +

" \n" +

“\n” +

“\n” +

"   \n" +

"   \n" +

"   \n" +

"  
\n" +

" \n" +

" " +

" 响应的html数据,This is my HTML page. " +

"   \n" +

“\n”;

os.write(str.getBytes());

os.flush();

}

}

}

这里我们仅提供局域网的交互!在自己的电脑中浏览器中访问:http://localhost:8888/,随后运行main函数,即“启动服务器”,即可在浏览器中获取响应,完成一次请求和响应交互。也可以在局域网中将localhost换成自己的ip即可实现远程计算机访问!

下面是客户端浏览器显示的服务器发送的响应数据!

在这里插入图片描述

3 Web服务器与Servlet

================

上文中,我们已经模拟了一个简单的HTTP服务器,可以接收请求,发送响应,似乎也没那么难,然而,实际上我们这个服务器仅仅提供了非常简单的获取请求和响应数据的功能,其他的比如http请求中各种参数的解析,响应数据的处理,以及更底层的TCP连接复用,多线程IO,异常处理等功能则没有编写,这些功能需要编写大量的代码,并且进行多次的测试、优化,对于大部分菜鸡程序员来说(比如本人),是不具备这些底层功能的编写以及优化能力的!

在一个web中项目中,大多数程序员最关心的应该是业务层面的功能,而非网络传输、请求解析、发送响应等底层功能,实际上在我们开发的web项目中,确实也没有写这些网络通信的底层代码,仅仅是写的“业务代码”而已,为什么可以这样呢?这就是web服务器的功劳!我们只需要将编写的web应用放到web服务器指定的位置,随后启动web服务器,即可根据请求实现我们的业务功能。web服务器也是一个应用程序,专门用于处理TCP连接、接受HTTP请求、响应数据等底层的功能,简单的说就是处理网络请求与响应。这样,有了web服务器,对于大多数程序员来说,就能一心一意的实现业务功能,而不必关心网络通信这一底层功能!典型的web服务器就是tomcat。

到此,我们可以知道编写的“Web应用”是不具备处理网络请求的接收与响应的功能的,它仅仅是一个在中间工作程序,用于处理已经被Web服务器解析、封装好的网络请求。web服务器将接受到的请求转发给对应的web应用的处理程序,处理完毕之后再将结果响应给客户端。

**那么web服务器如何将封装好的请求传递给web应用,以及web应用如何将响应结果数据传递给web服务器,以及二者交互的数据的格式是怎样的,对于这种通用的问题,制定一个统一的标准最好了,所有的web项目都可以按照这个标准来开发,web服务器也按照这个标准来实现。这对于Java来说很简单,那就是抽象成为一个接口(


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

开源分享完整内容戳这里


interface)即可,这就是Servlet,Servlet没有标准中文翻译,直译过来就是“小型应用程序”,Servlet就是一个Java中的接口而已,接口的作用是什么?对,就是标准、规范,Servlet就定义了通过Java开发web应用处理网络请求以及响应数据的接口规范。换一个说法, Servlet就是Java方便进行动态web应用开发的一个统一的标准(模版)。**

Servlet的简单规范如下:我们想要开发某个项目,只需要开发对应的Servlet实现,并将其对应到一个请求url地址,随后在方法里面编写业务逻辑即可,而请求和响应,都已被同样实现了Servlet标准的web服务器(比如tomcat)帮我们封装为ServletRequest和ServletResponse对象,当一个请求到来时,tomcat会将封装好的参数对象传递到Servlet的方法参数中,我们可以直接从ServletRequest参数对象中获取请求的参数,也可以通过ServletResponse参数对象发出响应。这样,就解决了web服务器和web应用数据交互的问题,所有的Java Web应用都可以按照这个模式/标准来开发。

因此,大部分人所说的web项目开发,主要就是Servlet开发。虽然现在都是基于框架开发,比如Spring MVC,但是Spring MVC只是对Servlet原生API进行封装,它的Controller方法就是Servlet方法的入口,内部的Service层和DAO层不过是为了方便开发而拆分出来的,它们的方法都直接或者间接的被Controller方法调用。

总结一下:Servlet就是一个sun制订的使用Java语言开发Web项目的一个规范,我们使用Servlet规范开发的Web项目,就能够运行在同样实现了Servlet规范的Web服务器中,这样的好处是,解析客户端网络请求、线程复用、响应数据给客户端等一系列底层的网络编程工作都由Web服务器帮我们完成了,而我们的“Web项目”仅仅需要编写Servlet的实现,在实现中仅仅需要编写业务逻辑就行了,随后我们还需要将指定的Servlet实现与指定的请求路径绑定。

Web服务器以多线程的形式处理请求,当一个请求到来的时候,Web服务器会使用一条线程帮我们将请求参数和响应数据都封装成为一个HttpServletRequest和HttpServletResponse对象,并将HttpServletRequest和HttpServletResponse传递给对应请求路径的Servlet实例,在Servlet的方法中的业务逻辑处理完之后,Web服务器又自动将我们的return返回的结果封装成对应的响应数据返回给客户端,总体而言就这么简单。

Servlet,甚至于我们编写的整个web应用程序,在一次请求与响应过程中,都是非常被动的一个角色,我们不需要手动创建Servlet对象,应用中也没有main方法,我们只需要将应用中某个Servlet和某个URL请求对应上,然后将web应用交给tomcat,随后启动tomcat,之后tomcat接受到请求之后就会自动映射到对应的Servlet,创建Servlet对象并调用Servlet的方法,这个方法中就是我们自己开发的处理请求的逻辑,从而完成一次请求和响应,因此tomcat由于支持Servlet和JSP的运行,因此也被称为Servlet/jSP容器!注意,一个Servlet只会实例化一次,但是一个请求对应着一个不同的线程,因此它们可能共用一个Servlet实例,所以我们开发的Servlet需要注意线程安全问题。

对于大部分程序员而言,他们不具备或者说不精通网络编程的能力,因此,使用Servlet规范开发Web项目对于他们而言是再好不过了(对我来说也是一样的)! 那么,不使用Servlet规范开发Web项目行不行呢?那肯定也是可以的呀,完全没问题,只不过这需要我们自己来解析请求、返回响应,比如说在“Web请求”部分的案例中,我们就只使用了一个类就给客户端浏览器响应了数据。当然,一个大型项目业务众多,各种请求,甚至包括文件上传、下载之类的,网络编程的实现远比这个案例复杂,那就相当于你自己开发一个项目的同时还顺便开发一个Web服务器了。当然,这就比较夸张了,实际上我们基于Netty就能比较轻松实现一个Web服务器,自己解析请求、响应,就能构建一个不遵循Servlet规范的Web项目。



推荐阅读
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文探讨了如何在 Java 中将多参数方法通过 Lambda 表达式传递给一个接受 List 的 Function。具体分析了 `OrderUtil` 类中的 `runInBatches` 方法及其使用场景。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
author-avatar
wzy523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有