- 浏览: 467289 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (371)
- Java (44)
- Flex (25)
- Design Pattern / UML (5)
- JVM (14)
- Software Engineer (4)
- Testing (30)
- Web Backend (60)
- Linux (7)
- Database (11)
- SOA (28)
- English (6)
- FX (5)
- SAP Support (25)
- SAP Development (5)
- SAP Impl & Oprn (8)
- Articles (15)
- Music (4)
- Recipe (14)
- Multi-thread (4)
- Lucene (2)
- CS basic / Algorithm (12)
- Tour (3)
- C C++ (21)
- Others (10)
- Code Repository C++ (1)
- Code Repository Java (1)
- Code Repository Algorithm (1)
- Code Repository SQL (1)
- Web Frontend (4)
最新评论
-
xiangxm:
Java 强引用、 软引用、 弱引用、虚引用 -
nml-lyb:
123
Mule 的第一个例子 -
nml-lyb:
http://www.baidu.com
Mule 的第一个例子 -
white___ant:
...
Java 强引用、 软引用、 弱引用、虚引用 -
joeyon:
...
Java NIO介绍
在第二章中,作者给出了一个简单的web server的实现。麻雀虽小,五脏俱全。
从中我们可以学习到 server 处理客户端请求的一个主体思路。
项目由下面的类组成:
|-- Constants.java // 里面仅仅定义了web root的路径
|-- HttpServer2.java // 核心。处理socket连接,分析http请求,调用servlet容器
|-- Request.java//实现ServletRequest接口,解析socket.inputStream(http请求)
|-- RequestFacade.java // 实现ServletRequest接口,是Request的门面
|-- Response.java//实现ServletResponse接口,关联到socket.outputStream
|-- ResponseFacade.java //Response的门面
|-- ServletProcessor2.java //Servlet 容器
|-- StaticResourceProcessor.java //静态资源容器
下面列出了HttpServer2.java的代码:
package ex02.pyrmont; import java.net.Socket; import java.net.ServerSocket; import java.net.InetAddress; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; public class HttpServer2 { // shutdown command private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; // the shutdown command received private boolean shutdown = false; public static void main(String[] args) { HttpServer2 server = new HttpServer2(); server.await(); } public void await() { ServerSocket serverSocket = null; int port = 8080; try { serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); } catch (IOException e) { e.printStackTrace(); System.exit(1); } // Loop waiting for a request while (!shutdown) { Socket socket = null; InputStream input = null; OutputStream output = null; try { socket = serverSocket.accept(); input = socket.getInputStream(); output = socket.getOutputStream(); // create Request object and parse Request request = new Request(input); request.parse(); // create Response object Response response = new Response(output); response.setRequest(request); //check if this is a request for a servlet or a static resource //a request for a servlet begins with "/servlet/" if (request.getUri().startsWith("/servlet/")) { ServletProcessor2 processor = new ServletProcessor2(); processor.process(request, response); } else { StaticResourceProcessor processor = new StaticResourceProcessor(); processor.process(request, response); } // Close the socket socket.close(); //check if the previous URI is a shutdown command shutdown = request.getUri().equals(SHUTDOWN_COMMAND); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } }
处理过程很清晰:
1、创建一个ServerSocket, 等待客户端的连接。
2、客户端连接后,把底层的socket输入流解析、封装成Request对象。同时把socket的输出流关联给Response对象。
3、根据Request对象中url的属性,相应的调用servlet容器,或者是静态资源的容器。
package ex02.pyrmont; import java.net.URL; import java.net.URLClassLoader; import java.net.URLStreamHandler; import java.io.File; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletProcessor2 { public void process(Request request, Response response) { String uri = request.getUri(); String servletName = uri.substring(uri.lastIndexOf("/") + 1); URLClassLoader loader = null; try { // create a URLClassLoader URL[] urls = new URL[1]; URLStreamHandler streamHandler = null; File classPath = new File(Constants.WEB_ROOT); // the forming of repository is taken from the createClassLoader method in // org.apache.catalina.startup.ClassLoaderFactory String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString() ; // the code for forming the URL is taken from the addRepository method in // org.apache.catalina.loader.StandardClassLoader class. urls[0] = new URL(null, repository, streamHandler); loader = new URLClassLoader(urls); } catch (IOException e) { System.out.println(e.toString() ); } Class myClass = null; try { myClass = loader.loadClass(servletName); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } Servlet servlet = null; RequestFacade requestFacade = new RequestFacade(request); ResponseFacade responseFacade = new ResponseFacade(response); try { servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade); } catch (Exception e) { System.out.println(e.toString()); } catch (Throwable e) { System.out.println(e.toString()); } } }
package ex02.pyrmont; import java.io.IOException; public class StaticResourceProcessor { public void process(Request request, Response response) { try { response.sendStaticResource(); } catch (IOException e) { e.printStackTrace(); } } }
上面两段代码分别为 servlet容器 和 静态资源的容器。容器和servlet的关系就像柜子和衣服的关系。容器做了什么很显然,但是容器具体是怎么做的通过上面的代码就能了解到。
值得一提的是,本章中引入了一种设计模式,facade模式。这种模式使用的目的有若干个,但是在这里是为了实现安全性而引入。servlet容器调用具体的servlet的service方法时,如果直接把request对象转型成ServletRequest接口类型,潜在的问题是这个request对象可以被转型回Request类型,进而可以使用ServletRequest接口之外的Request对象的方法。
facade类型关联到Request类型的对象,同时仅仅实现ServletRequest接口。这样facade对象传递给service方法后,就不会有上述的安全问题。
下面给出具体servlet的实现,里面的service方法,将会被容器调用:
import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; public class PrimitiveServlet implements Servlet { public void init(ServletConfig config) throws ServletException { System.out.println("init"); } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("from service"); PrintWriter out = response.getWriter(); out.println("Hello. Roses are red."); out.print("Violets are blue."); } public void destroy() { System.out.println("destroy"); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
发表评论
-
Servlet Async
2015-05-15 02:29 465http://www.importnew.com/8864. ... -
EHcache
2014-09-06 23:32 495http://blog.csdn.net/liuzhenwe ... -
Maven构建并热部署一个简略的Web Project
2014-08-01 01:51 707zz from : http://www.myexcept ... -
Tomcat 权限配置,当使用Eclipse启动时都会被修改为默认
2014-07-31 07:57 514http://zhidao.baidu.com/link?u ... -
解决tomcat占用8080端口问题图文教程
2014-07-30 21:59 599zz from http://jingyan.baidu. ... -
HttpURLConnection用法详解
2013-09-04 02:08 643http://www.cnblogs.com/guodong ... -
使用HttpSessionListener接口监听Session 的创建和失效
2013-09-03 03:55 789http://uule.iteye.com/blog/824 ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2013-09-03 03:49 336http://www.cnblogs.com/JesseV/ ... -
servlet listener
2013-09-03 03:43 623http://sakyone.iteye.com/blog/ ... -
servlet filter
2013-09-03 03:42 678http://sakyone.iteye.com/blog/ ... -
Servlet中Request的getAttribute getParameter 区别
2013-08-29 12:31 1076http://blog.csdn.net/yangqillo ... -
用windows启动tomcat
2013-07-04 09:36 616services.msc -
Spring 加载 application.xml 出错FileNotFoundException
2013-06-23 21:26 919http://zhidao.baidu.com/questi ... -
<context-param>与<init-param>的区别与作用
2013-06-18 08:08 681http://www.cnblogs.com/hzj-/ar ... -
HttpWatch工具简介及使用技巧
2012-05-09 14:13 3882http://cfeng518.blog.163.com/bl ... -
Web Service (Axis2实现)
2012-04-19 11:13 1292转载from http://wangyaobeiji ... -
Tomcat4 源代码分析 (20) How Tomcat Works 第二十章
2009-07-27 17:24 874Chapter 20 : JMX-Based Manageme ... -
Tomcat4 源代码分析 (19) How Tomcat Works 第十九章
2009-07-27 17:19 753Chapter 19 : Manager Servlet ... -
Tomcat4 源代码分析 (18) How Tomcat Works 第十八章
2009-07-27 16:58 793Chapter 18 : Deployer T ... -
Tomcat4 源代码分析 (17) How Tomcat Works 第十七章
2009-07-24 17:57 1039Chapter 17 : Tomcat Startup ...
相关推荐
Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache ...
《How Tomcat Works》中文版一书详细剖析了Tomcat服务器的内部工作机制。该书基于Tomcat 4.1.12和5.0.18两个版本,深入讲解了其servlet容器的架构和运作原理,尤其是代号为Catalina的核心组件。 Tomcat是一个开源的...
HowTomcatWorks书籍课程实例工程与代码 书籍剖析了Tomcat 4.1.12和Tomcat 5.0.18--一个免费的、开源的、深受大众欢迎的、代号为Catalina的servlet容器,并讲解其容器的内部运行机制。通过迭代实现一个简化版软件来...
**Apache Tomcat 8源代码解析** Apache Tomcat是一款开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是许多Web应用开发者的重要工具。Tomcat 8是其发展的一个重要版本,引入了许多新...
【Tomcat 源代码调试笔记 - 看不见的 Shell】这篇笔记主要探讨了如何在Tomcat运行时动态插入过滤器,以及遇到的问题和解决方法。Tomcat作为一个流行的Java应用服务器,它允许开发者通过Servlet规范中的`...
《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的书籍,中文版的提供使得国内开发者能够更方便地理解这一流行的开源Java Servlet容器。这本书不仅涵盖了Tomcat的基础知识,还详细解析了其内部机制,对于...
《How Tomcat Works》这本书及其源代码,为开发者提供了深入理解Tomcat内部工作机制的宝贵资源。本文将基于提供的文件名"如何Tomcat工作",结合Tomcat的工作流程,深入探讨其核心组件和功能。 1. **Tomcat架构概述*...
这个源代码压缩包提供了Tomcat6的完整源码,对于开发者来说,深入理解其内部工作原理、优化性能或者定制功能都具有极大的价值。下面将详细介绍Tomcat6的一些关键知识点。 1. **Servlet容器**: Tomcat作为一个...
《How Tomcat Works》是一份深入探讨Apache Tomcat工作原理的重要资源,包含了英文PDF文档、中文HTML翻译以及源代码,旨在帮助读者理解Tomcat服务器的内部运作机制。这份资料是IT从业者,特别是Java Web开发者、系统...
在《How Tomcat Works》这本书中,作者详细剖析了Tomcat的内部工作机制,特别是对Tomcat的4.1.12和5.0.18两个版本的源代码进行了深入的分析。本书通过逐步揭示Tomcat的各个组件,帮助读者理解Tomcat的内部结构和运作...
### How Tomcat Works中文版深度解析 #### 一、引言与概述 《How Tomcat Works》是一本针对Apache Tomcat服务器内部工作机制进行深入剖析的专业书籍。本书详细介绍了Tomcat 4.1.12和5.0.18两个版本的内部结构与...
《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的宝贵资源,它全面深入地讲解了这个流行的Java Servlet和JavaServer Pages(JSP)容器的内部机制。书中的20个章节涵盖了从基础概念到高级特性的广泛...
《深入剖析Tomcat7源代码》 Tomcat7是一款广泛使用的开源Java Servlet容器,它实现了Java EE中的Web应用规范,包括Servlet、JSP和EL(Expression Language)等。本资源包含Tomcat7的源代码以及运行所需的jar包,...
4. **JSP编译**:Tomcat在首次遇到JSP页面时,会将其转换为Servlet源代码并编译成.class文件。这个过程涉及JSP标签库、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的解析。 5. **...
源代码分析对于理解Tomcat的工作原理、优化性能或进行自定义扩展非常有价值。这里的“简单实用”可能是指通过研究源码,开发者可以更直观地了解Web服务器内部机制,从而更好地应用在实际项目中。 **Tomcat 8源代码...
《How Tomcat Works》这本书深入浅出地介绍了Apache Tomcat这款广泛应用的Java Servlet容器的工作原理。Tomcat作为开源软件,是许多Web应用的基础,尤其在轻量级开发和测试环境中非常常见。以下是对Tomcat核心知识点...
Apache Tomcat 7 是一个广泛...通过分析和学习Tomcat 7的源代码,开发者可以提升对Web服务器运行机制的理解,进而更好地优化应用程序,解决性能问题,或者开发新的功能。同时,这也是向高级Java EE开发迈进的重要一步。