`
DLevin
  • 浏览: 37464 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet&JSP学习系列(1) - 简单的一个WebServer实现

阅读更多
一直从事着.NET的桌面应用程序开发,直到1月份考完研,因为想找一份Java的工作,开始疯狂的看Java方面的书和视频,Java编程思想、SSH之类的,乱七八糟的信息都往脑子里塞。发现只是在看的时候记住了,当真正到做了却一头雾水,基本功不够扎实啊。

从复试结束以后,工作也不想换了,就几个月的时间,那就忍忍吧,所以就打算从基础做起,把基本功打扎实了,然后像高层的框架进军。谨遵老大的教诲,看书一定要看经典的书,因为我们并没有多少时间可以浪费在一些比较差的书上,因而在亚马逊上搜到了coreservlet(Servlet与JSP核心编程)这本书是Servlet和JSP相关的比较经典的书。看完以后确实发现写的很好。打算再看一遍,写写一些事例加深印象。

学一项技术,如果能深入到内部实现的话,那才能说对这项技术有真正的掌握。因而学Servlet,对HTTP协议,Web服务器内部运行机制一定需要有一个透彻的了解。

受coreservlet的影响,我也尝试着自己写了一个简单的WebServer,这个Server很简单,把浏览器传输过来的请求分类以表格的形势打印。

代码比较简单:
基类NetworkServer中,开始服务器在某个端口的监听,当客户端连接请求到来的时候,对到来的连接Socket进行处理:
	public void listen() {
		listener = new ServerSocket(port);
		// Listener on the port for ever unless you shut it down manually.
		while(true) {
			Socket server = listener.accept();
			handleConnection(server);
		}
	}


在处理的时候,根据到来的是GET、POST、PUT、DELETE等请求,用不同的类来处理:
	public void handleConnection(Socket server) {
		try {
			BufferedReader reader = SocketUtils.getReader(server);
			PrintWriter writer = SocketUtils.getWriter(server);
			printResponseHeader(writer);
			printPageContentHeader(writer);
			
			String commandLine = reader.readLine();
			if(null == commandLine) {
				printErrorMsg(writer, "Invalid request : no command data exists.");
				return;
			}
			
			RequestHandler handler = null;
			if(commandLine.toUpperCase().startsWith("GET"))
				handler = new GetRequestHandler();
			else if(commandLine.toUpperCase().startsWith("POST"))
				handler = new PostRequestHandler();
			else if(commandLine.toUpperCase().startsWith("PUT"))
				handler = new PutRequestHandler();
			else if(commandLine.toUpperCase().startsWith("DELETE"))
				handler = new DeleteRequestHandler();
			else {
				printErrorMsg(writer, "Invalid request method");
				return;
			}
			
			handler.service(reader, writer, commandLine);
			
			printPageContentTail(writer);
		}catch(IOException e) {

		}
	}


在具体的处理的时候,将HTTP请求分为三部分,请求命令信息,请求头以及请求的内容分成三个表格。在处理的时候需要注意两点:
1. Get命令的请求内容是在命令行(第一行)中,并且它的内容有可能为空。
2. Post命令的数据是在请求头之后(中间有一个空行),对这些数据需要用read函数,而不能用readLine函数。

主要就是这些了,PUT和DELETE命令还没有实现,另,很多类型也没能考虑,比如文件上传,图片,MINE的不同类型等,这些还不知道HTTP的格式,因而还不知道怎么处理,请求内容的编码问题也没有考虑。过几天再研究研究HTTP协议的具体内容。

有兴趣的人可以看看附件的源码。因为时间的问题,没能很好的设计代码的结构,希望有时间能对这个的功能和设计上有一些改进。

虽然以上代码的基本框架还是源于书本上的内容,但是发现自己实现一遍以后,对HTTP的协议会了解的比较深刻,而且对Web服务器也不再感觉很深奥了。事实上我现在认为(浅显的认为,不知道对还是不对,望高人能够指教 ),Web服务器就是一种TCP的编程,对接收到的HTTP数据进行一些处理,然后以HTTP协议的格式将处理完的数据返回给客户端。

最后,我发现我只是一个简单的form页面,都会有两次请求,一次是正常的请求,还有一次是:GET /favicon.ico HTTP/1.1
而这个请求又不会影响浏览器的显示,不知道这个是做什么用的,我原本以为是和浏览器相关的,开始我用chrome,后来换成IE8还是有这个请求。继续希望高人指教。先谢过
分享到:
评论

相关推荐

    head first servlet&JSP讲解课件java-web

    Servlet是Java平台上的一个标准,用于创建动态Web应用程序,而JSP是Servlet的一种简化表示,更注重于视图层的开发。这两者构成了Java Web后端开发的基础。 【描述】提到的"head first servlet&JSP讲解课件"是一份...

    Head First Servlet & JSP

    本书以其独特的学习风格,深入浅出地介绍了Servlet和JSP(JavaServer Pages)这两项核心的Java Web开发技术。 Servlet是Java平台上的一个标准API,用于构建动态Web应用程序。它允许开发者通过Java代码来处理HTTP...

    jakarta.servlet.jsp.jstl-api-2.0.0.jar

    标题中的"jakarta.servlet.jsp.jstl-api-2.0.0.jar"是一个重要的Java Web开发组件,它属于JavaServer Pages(JSP)标准标签库(JSTL)的一部分,用于提供一套标准的标签来简化HTML或XML文档的生成。JSTL的主要目标是...

    Servlet &JSP学习笔记NetBeans源代码

    Tomcat是一个开源的轻量级Web服务器和应用服务器,专门用于运行Java Servlet和JSP。它是Apache软件基金会Jakarta项目的一部分,被广泛用于教学和小型到中型的Web应用程序部署。 在学习Servlet时,你将接触到以下几...

    Servlet&JSP学习笔记源代码

    而服务器选择的是Tomcat,这是一个轻量级的开源Java EE应用服务器,特别适合初学者和小型项目,它能够快速启动和运行Servlet及JSP应用。 以下是这些源代码可能涵盖的一些关键知识点: 1. **Servlet生命周期**:...

    jstl&standard&jsp-api&servlet-api.jar

    例如,`javax.servlet.jsp.JspPage`接口代表一个JSP页面,`javax.servlet.jsp.tagext.Tag`接口是自定义标签的基础。 4. **Servlet API**:Servlet API是Java Servlet规范的一部分,它定义了服务器端程序(Servlet)...

    servlet&Jsp核心编程第二版英文版

    《Servlet&JSP核心编程第二版》是一本深入探讨Java Web开发的重要书籍,主要关注Servlet和JSP(JavaServer Pages)这两个核心技术。Servlet是Java平台上的一个标准接口,用于扩展服务器的功能,处理HTTP请求,而JSP...

    Servlet&JSP学习笔记

    - **GenericServlet 类**: 提供了一个基本框架,实现了 `Servlet` 和 `ServletConfig` 接口。通过 `getServletConfig()` 方法获取 `ServletConfig` 实例。 - **使用 `@WebServlet` 注解**: - **基本用法**: 使用...

    Java web常用包javax.servlet.jsp.jstl-1.2.1.zip

    在Java Web开发中,`javax.servlet.jsp.jstl`是一个重要的库,全称为JavaServer Pages Standard Tag Library,即JSTL(JavaServer Pages 标准标签库)。这个库提供了用于增强JSP页面功能的一系列标准标签,使得...

    Servlet&JSP;学习笔记源代码

    Servlet和JSP是Java Web开发中的核心技术,广泛用于构建动态网站和Web应用程序。这份"Servlet&JSP学习笔记源代码"是由林信良编著,提供了丰富的实例代码,旨在帮助学习者深入理解这两种技术。 Servlet是Java编程...

    Servlet&JSP-PPT.rar

    Servlet和JSP是Java Web开发中的核心技术,广泛用于构建动态Web应用程序。这个"Servlet&JSP-PPT.rar"压缩包包含了一些关键文件,用于讲解和理解这两种技术。 首先,我们来看"权限表.sql",这通常是一个SQL脚本文件...

    Servlet&jsp;

    《Servlet&JSP教学手册》第二版是一本详尽的指南,旨在教授读者如何使用Servlet和JSP开发Web应用。书中不仅介绍了理论知识,还包含了实践指导,如如何设置开发环境、使用IDE(例如Eclipse)、以及在Tomcat服务器上...

    Web应用开发(Servlet&JSP)PDF版

    Servlet是Java编程语言中的一个接口,它允许开发者创建动态响应的Web应用程序,而JSP(JavaServer Pages)则是一种用于构建动态网页的视图技术,它结合了HTML和Java代码,使得在页面上展示数据更加便捷。 Servlet是...

    基于java--jsp--servlet--tomcat--sqlserver的社区医疗管理系统

    综上所述,基于Java-JSP-Servlet-Tomcat-SQLServer的社区医疗管理系统是一个综合运用多种技术的复杂项目,它集成了Web开发的多个层面,通过MVC模式实现了高效的数据处理和用户交互,是现代医疗信息化的重要实践。

    Servlet&JSP源代码

    Servlet和JSP是Java Web开发中的核心技术,它们用于构建动态网站和Web应用程序。...同时,这也是一个很好的机会去体验和学习马士兵的教学风格,他的教程通常会帮助初学者快速上手,并理解Java Web开发的核心概念。

    servlet和jsp学习指南-高清-2013年4月

    Servlet是一种动态的Web技术,也是Java EE规范中的一个重要组成部分。 1. Servlet生命周期: Servlet拥有自己的生命周期,从创建到销毁,可分为三个阶段:初始化、服务、销毁。 - 初始化:服务器加载Servlet类,...

    javax.servlet---jsp-api jar包

    `Servlet` 是一个服务器端的Java小程序,它可以接收并响应来自客户端(通常是浏览器)的请求。`ServletConfig` 为Servlet提供配置信息,而`ServletContext` 提供了整个Web应用的共享上下文。`HttpServletRequest` 和...

    Servlet&JSP知识点归纳思维导图

    Servlet和JSP是Java Web开发中的核心技术,它们主要用于构建动态Web应用程序。以下是对Servlet和JSP知识点的详细归纳: **Servlet** 1. **Servlet概念**:Servlet是Java编写的小型服务器端程序,运行在Web服务器上...

    林学良Jsp&Servlet学习笔记

    **JSP(Java Server Pages)与Servlet是Java Web开发中的两个核心技术,它们在构建动态网页和处理客户端请求方面起着至关重要的作用。** **JSP技术:** JSP是一种服务器端脚本语言,用于创建动态网页。它允许开发者...

Global site tag (gtag.js) - Google Analytics