知识大全 Tomcat加载servlet类文件
Posted 文件
篇首语:满堂花醉三千客,一剑霜寒十四洲。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Tomcat加载servlet类文件相关的知识,希望对你有一定的参考价值。
Tomcat加载servlet类文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
第一个
有一个养鸡场几千只鸡分别排列的被关在狭小的鸡笼里 鸡笼的前面有传送带为小鸡送来食物 后面有传送带送走产下的鸡蛋 可是却注意到有几十只小鸡在外面 逍遥 还有饲养员在给他们喂食
于是就问 是否需要帮忙吧这些鸡赶到笼子里去呢?
饲养员回答说 哦 这些鸡是在外面养著的 要是笼子里的那些鸡看不到有的鸡自由自在的生活 它们就会失去信心 不下蛋 没有这些放养的鸡 其它的就会放弃一切 然后死去
突然惊异的发现我们的生活方式和这些鸡是何等的相似 有多少人生活在笼子里 看着外面的世界里别人在探险 在实现自己的梦想 自由自在的生活 然后继续省会在自己的笼子里
作者描述自己起先放弃一年的时间 去到外面的世界看看 最后放弃了自己的职业 成为了逍遥自在的那一个
第二个故事我放到本文的最后告诉各位哦 哈哈
主题
在前面的主题中我们已经了解过servlet的工作流程 Servlet 我们到底能走多远系列( )
问题 :tomcat什么时候加载servlet?
有两种情况
一种是启动时加载
一种是请求时加载
第一种是在web xml中的<servlet>节点下增加类似 <load on startup> </load on startup>的节点
例子如下
<servlet>
<servlet name>DicDataIniter</servlet name>
<servlet class> init DicDataIniter</servlet class>
<load on startup> </load on startup> </servlet> <servlet mapping>
<servlet name>DicDataIniter</servlet name>
<url pattern>/DicDataIniter</url pattern> </servlet mapping>
关于load on startup 需要了解的是
)load on startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法) )它的值必须是一个整数 表示servlet应该被载入的顺序 )当值为 或者大于 时 表示容器在应用启动时就加载并初始化这个servlet; )当值小于 或者没有指定时 则表示容器在该servlet被选择时才会去加载 )正数的值越小 该servlet的优先级越高 应用启动时就越先加载 )当值相同时 容器就会自己选择顺序来加载 所以 <load on startup>x</load on startup> 中x的取值 代表的是优先级
第二种的流程类似如下图
问题 :tomcat是怎么加载一个servlet类的呢?
根据上篇对一个简单的webServer模拟(How Tomcat Works 学习 我们到底能走多远系列( )) 在到达 加载servlet类 实例化一个servlet实例 这一步之前的工作我们已经完成了 我们已经取得了来自消息中的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方法那么就不会就不会调用父类的service方法从而调用doGet或doPost
public void 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 MalformedURLException;import URL;import URLClassLoader;import URLStreamHandler;import javax servlet Servlet;import javax servlet ServletRequest;import javax servlet ServletResponse;public class ServletProcessor
public void process(Request request Response response)
// 取得request处理好的uri
String uri = request getUri()
// servlet 类名
String servletName = uri substring(uri indexOf( / ) + )
// 类加载器 利用提供的url目录来加载class文件 大多数情况下我们的程序在jvm启动的已经有类加载器加载我们需要的类文件
// 但是最为需要及时部署的服务器 servlet容器 需要自己去加载放到服务器的工程
URLClassLoader loader = null;
// URLClassLoader构造函数需要URL数组 这里是需要加载一个类
URL[] urls = new URL[ ];
// 构造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[ ] = 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:
有个类似写日志的方法
/**
* 写日志
* @param logString
* @throws IOException
*/
public void writeLog(String logString) throws IOException
File logFile = new File( d:\\\\我的文档\\\\test log )
// 写
FileWriter writer = new FileWriter(logFile true)
// 取得回车符号
String nextLine = System getProperty( line separator )
writer write(logString + nextLine)
writer flush()
writer close()
其中System getProperty( line separator )方法 值得熟悉
我们可以通过这样的方式取得一些System级别的常量
java version Java 运行时环境版本java vendor Java 运行时环境供应商java vendor url Java 供应商的 URLjava home Java 安装目录java vm specification version Java 虚拟机规范版本java vm specification vendor Java 虚拟机规范供应商java vm specification name Java 虚拟机规范名称java vm version Java 虚拟机实现版本java vm vendor Java 虚拟机实现供应商java vm name Java 虚拟机实现名称java specification version Java 运行时环境规范版本java specification vendor Java 运行时环境规范供应商java specification name Java 运行时环境规范名称java class version Java 类格式版本号java class path Java 类路径java library path 加载库时搜索的路径列表java io tmpdir 默认的临时文件路径piler 要使用的 JIT 编译器的名称java ext dirs 一个或多个扩展目录的路径os name 操作系统的名称os arch 操作系统的架构os version 操作系统的版本file separator 文件分隔符(在 UNIX 系统中是 / )path separator 路径分隔符(在 UNIX 系统中是 : )line separator 行分隔符(在 UNIX 系统中是 /n )user name 用户的账户名称user home 用户的主目录user dir 用户的当前工作目录
好吧 来讲一下第二个故事吧
一个印第安人和他的朋友走到美国繁华的街道上 汽车的鸣笛声 警笛声 人们的喊声 整个街道噪声简直震耳欲聋
突然一个印第安人说 我听到有个蟋蟀在叫
他的朋友说 什么?你疯了吗?在这么吵的地方 你怎么可能听到蟋蟀的叫声呢?
可是那个印第安人却非常肯定 他走到街对面的一块水泥石板前 上面长满了灌木 他在灌木堆里找 就在那里找到了一只蟋蟀
他的朋友问 太不可思议了 你是怎么做到的?
印第安人说 没有什么不可思议的 著取决于什么对你是真正重要的 来我来告诉你怎么回事
他拿出一块硬币 扔到人行道上 他们发现几乎所有在人行道上的人都低头去查看地上的硬币是不是他们遗落的
你明白了吗?这一切取决于什么对你来说是最重要的
让我们继续前行
努力不一定成功 但不努力肯定不会成功
cha138/Article/program/Java/hx/201311/25895相关参考
在Tomcat的conf/webxml文件里把listings值改为false 如: <servlet> <servletname>default</servl
知识大全 Tomcat下JSP、Servlet和JavaBean环境配置
Tomcat下JSP、Servlet和JavaBean环境配置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
Servlet被WEB应用程序加载过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一<
知识大全 访问JSP文件或者Servlet文件时提示下载的解决方法
访问JSP文件或者Servlet文件时提示下载的解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
使用JSP/Servlet上载文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz
编者按现在开发JavaWeb应用建立和部署Web内容是一件很简单的工作使用JakartaTomcat作为Servlet和JSP容器的人已经遍及全世界Tomcat具有免费跨平台等诸多特性并且更新得很
在Tomcat中运行JSP文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 有些网友不知道怎么
Tomcat目录结构配置文件基础学习 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 假设你已将T
知识大全 servlet实现从oracle数据库的blob字段中读出文件并显示
/* *ReadFilejava * *Createdon年月日下午: */ packagejgwlapp; importjavaio*;import*
Spring动态加载Hibernate映射文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb