我们到底能走多远系列(9)

我们到底能走多远系列(9)

扯淡:

  最近晚上在看魅力记录的《玄奘之路》,可以了解些历史,理解些文化,比其它的节目好多了,推荐各位欣赏。

  上周读书,有两个故事:

  第一个:

  有一个养鸡场几千只鸡分别排列的被关在狭小的鸡笼里,鸡笼的前面有传送带为小鸡送来食物,后面有传送带送走产下的鸡蛋。可是却注意到有几十只小鸡在外面“逍遥”,还有饲养员在给他们喂食。

  于是就问:是否需要帮忙吧这些鸡赶到笼子里去呢?

  饲养员回答说:哦,这些鸡是在外面养着的。要是笼子里的那些鸡看不到有的鸡自由自在的生活,它们就会失去信心,不下蛋。没有这些放养的鸡,其它的就会放弃一切,然后死去。

  突然惊异的发现我们的生活方式和这些鸡是何等的相似,有多少人生活在笼子里,看着外面的世界里别人在探险,在实现自己的梦想,自由自在的生活,然后继续省会在自己的笼子里。

  作者描述自己起先放弃一年的时间,去到外面的世界看看,最后放弃了自己的职业,成为了逍遥自在的那一个。

  第二个故事我放到本文的最后告诉各位哦,香港虚拟主机,哈哈。

主题:

在前面的主题中我们已经了解过servlet的工作流程:Servlet-我们到底能走多远系列(7)

问题1:tomcat什么时候加载servlet?

有两种情况  一种是启动时加载

  一种是请求时加载

第一种是在web.xml中的<servlet>节点下增加类似:<load-on-startup>1</load-on-startup>的节点

例子如下:

DicDataInitercom.init.DicDataIniter2DicDataIniter/DicDataIniter

关于load-on-startup,需要了解的是:

1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。2)它的值必须是一个整数,表示servlet应该被载入的顺序2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。5)当值相同时,容器就会自己选择顺序来加载。所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级

第二种的流程类似如下图:

  

问题2:tomcat是怎么加载一个servlet类的呢?

  根据上篇对一个简单的webServer模拟(How Tomcat Works 学习-我们到底能走多远系列(8)),在到达“加载servlet类,实例化一个servlet实例”这一步之前的工作我们已经完成了。我们已经取得了来自http消息中的uri,也就已经取得了需要调用的servlet的名字。

根据《How tomcat works》,先搞一个自己的servlet:没什么逻辑,只是生成class文件放到指定的文件夹下等待加载。

package code.tomcat.servletContainer;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.*;public class PrimitiveServlet implements Servlet{public void init(ServletConfig config) throws ServletException {System.out.print(“init”);}public ServletConfig getServletConfig() {return null;} service(ServletRequest req, ServletResponse res)throws ServletException, IOException {System.out.print(“service”);PrintWriter writer = res.getWriter();writer.println(“Hello. Roses are red.”);}public String getServletInfo() {return null;}public void destroy() {System.out.print(“destroy”);}}

加载方法如下:

package code.tomcat.servletContainer;import java.io.File;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import java.net.URLClassLoader;import java.net.URLStreamHandler;import javax.servlet.Servlet;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class ServletProcessor1 {public void process(Request request, Response response){// 取得request处理好的uriString uri = request.getUri();// servlet 类名 String servletName = uri.substring(uri.indexOf(“/”) + 1);// 类加载器,利用提供的url目录来加载class文件,大多数情况下我们的程序在jvm启动的已经有类加载器加载我们需要的类文件。// 但是最为需要及时部署的服务器-servlet容器,虚拟主机,需要自己去加载放到服务器的工程URLClassLoader loader = null;// URLClassLoader构造函数需要URL数组,这里是需要加载一个类URL[] urls = new URL[1];// 构造URL用,虽然是null,但如果直接在URL中直接用null来代替,编译器不答应啊URLStreamHandler streamHandler = null;File classPath = new File(“/webroot”);try {// servlet文件夹位置String repository = (new URL(“file”, null, classPath.getCanonicalPath() + File.separator)).toString();urls[0] = new URL(null, repository, streamHandler);// 得到传说中的类加载器loader = new URLClassLoader(urls);} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// .class文件加载后就是java中的Class类实例啦Class myClass = null;try {// servlet Class类实例myClass = loader.loadClass(servletName);} catch (ClassNotFoundException e) {e.printStackTrace();}Servlet servlet = null;try {// 用newInstance方法得到一个servlet实例servlet = (Servlet)myClass.newInstance();// 调用PrimitiveServlet的service方法servlet.service((ServletRequest)request, (ServletResponse)response);} catch (Exception e) {System.out.println(e.toString());}}}

如此,servlet流程中的初始加载这一步就可以勉强完成了,tomcat中的实现要复杂很多吧,原理基本是差不多了,先打下基础。

关于类加载:

  其实tomcat启动的时候就有大量的类加载工作需要做,应为tomcat本身就是个java工程嘛。

————

System.getProperty:

有个类似写日志的方法:

人总是珍惜未得到的,而遗忘了所拥有的

我们到底能走多远系列(9)

相关文章:

  • 【算法】直接插入排序C语言实现
  • 嵌入式 FAAC1.28 在海思HI3518C/HI3518A平台linux中的编译优化
  • Android 动画animation 深入分析
  • 你感兴趣的文章:

    标签云:

    亚洲高清电影在线, 免费高清电影, 八戒影院夜间, 八戒电影最新大片, 出轨在线电影, 午夜电影院, 在线影院a1166, 在线电影院, 在线观看美剧下载, 日本爱情电影, 日韩高清电影在线, 电影天堂网, 直播盒子app, 聚合直播, 高清美剧, 高清美剧在线观看 EhViewer-E站, E站, E站绿色版, qqmulu.com, qq目录网, qq网站目录,