您的位置:首页 > 其它

Servlet 基础

2010-07-11 22:09 162 查看
(1)、Servlet 特点
Servlet 是一个供(Servlet 引擎)调用的java 类,它不能独立运行,它的运行完全
由Servlet引擎来控制和调度。
Servlet 引擎是一种容器程序,它负责管理和维护所有Servlet对象的生命周期。Servlet
的加载,执行流程,以及如何接受客户端发送的数据和如何将数据传输到客户端等具体
的底层事务,都是由Servlet 引擎来实现的。Servlet 引擎负责将客户端的请求信息
转交给Servlet和将Servlet 生成的响应信息返回给客户端。
Servlet 的最常见应用在于读取Web浏览器传递给Web服务器的参数和生产Web服务器返回给web
浏览器的动态网页文档内容;Servlet也能获取WEB浏览器发送的HTTP请求消息中的各个请求头
和请求行信息,以及生成用于web服务器发送的HTTP响应消息中的状态行和响应头信息;Servlet
还能获取Web服务器和servlet 引擎自身的一些环境和状态信息。

(2)、Servlet 运行过程
a,对请求过来的地址Servlet 引擎首先检查是否已经装载并创建了该
Servlet 的实例对象,如果是直接跳转到d,否则执行b
b,装载并且创建该Servlet的一个实例对象
c、调用Servlet 实例对象的init()方法
d、创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP
响应消息的HttpServletResponse对象。然后调用Servlet service()方法将请求和
响应对象作为参数传递进去。所以init()方法在servlet周期内调用一次,而service()方法可能被多次调用
e、应用程序停止之前,Servlet引擎将卸载Servlet,并且在卸载之前调用Servlet
的destroy()方法。

如果在servlet 元素嵌套了一个<laod-on-startup>元素,表示应用程序启动时就
创建这个Servlet的实例对象,以及调用Servlet 实例对象的init()方法,参数值越小
表明越早被加载。

(3)、Servlet 线程安全问题
Servlet 引擎采用多线程模式运行,它为并发的每个访问请求都使用一个独立的线程来进行响应。这就带来了线程安全问题.
如果对每个servlet 实现SingleThreadModel接口则Servlet引擎则采用单线程模式调用Service()方法,只是创建了多个Servlet实例对象
并发的每个线程都单独调用一个独立的Servlet实例对象的service()方法。
在访问成员变量和其它共享资源的时候要考虑线程安全问题,比如Servlet容器对象和访问数据库。



(4)、ServletConfig接口
Servlet 在有些情况下可能需要访问Servlet容器或者需要借助Servlet容器访问外部资源,
所以Servlet 引擎需要将表示Servlet 容器的对象(Servlet 上下文)传递给Servlet。
另外在web.xml 文件中为某个Servlet设置的初始化参数传递个该Servlet。
Servlet 引擎将代表Servlet容器的对象和Servlet配置参数信息一并封装到一个称为ServletConfig的对象中,并且
在初始化Servlet实例对象的时候传递给该Servlet。ServletConfig接口中定义了一些方法,调用这些方法可以获取
有关信息。
Servlet 引擎调用Servlet 的实例对象的init(ServletConfig config) 方法将ServletConfig 对象传递给Servlet
Servlet.getServletConfig()方法返回值就是init(ServletConfig config)方法传递过来的对象引用。
<servlet>
<servlet-name>serveltTest</servlet-name>
<servlet-class>.....</servlet-class>
<init-param>
<param-name>Corporation</param-name>
<param-value>chenll</param-value>
</init-param>
</servlet>

ServletConfig 接口方法
a、java.util.Enumeration getInitParameterNames() //返回所有初始化名称枚举。
for (Enumeration e = v.elements() ; e.hasMoreElements() ;) {
System.out.println(e.nextElement());
}

b、java.lang.String getInitParameter(String name); //返回名称为name对应的初始化值。
c、javax.servlet.ServletConfig getServletConfig(); //返回值就是init(ServletConfig config)方法传递过来的对象引用。



(5)、Servlet 激活器
激活器用于调用我们自己写的servlet而不用再去写对于的映射文件
/conf/web.xml目录下(conf/web.xml是个全局的web.xml对所有webapps目录下的项目都起作用)
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
web.xml
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

这个激活器配置好以后,我么写的Servlet 比如(HelloServlet)就不再需要在web.xml目录下配置servlet和servlet-mapping。只需要
<%=path%>/servlet/HelloServlet这个路径然后通过Servlet激活器访问到这个HelloServlet

(6)、缺省Servlet
如果某个Servlet 的映射路径仅仅为一个正斜杠/,那么这个就是个缺省的Servlet
凡是在web.xml文件中找不到匹配的<servlet-mapping> 元素的URL,它们的访问请求都将交给缺省Servlet
处理。
/conf/web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
当访问Tomcate 服务器中某个静态HTML文件和图片或者资源时,实际上是在访问这个缺省Servlet.

(7)、Servlet的类装载器
JVM 使用每一个类的第一件事情就是将该类的字节码装载进来,
Tomcate类装载器树形结构
Bootstrap->System->Common->Shared->WebappX
Bootstrap jvm内嵌的类装载器
System 系统装载器,负责加载ClassPath 环境变量下的类,注意Tomcate 不会继承操作系统设置好的环境变量
而是重新做了设置.
在/bin/setclasspath.bat 文件里面
set CLASSPATH=%J***A_HOME%/lib/tools.jar
在/bin/catalina.bat 文件里面
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%/bin/bootstrap.jar
所以环境变量包含了bootstrap.jar和tools.jar两个jar 包
Common类装载器负责从/common/classes 中的.class类文件和/common/lib中的jar包中加载类
Catalina 类加载器,负责/server/classes中的.class类文件和/server/lib/中的jar包中加载类
Shared 类加载器 ,负责/share/classes中的.class类文件和/share/lib/中的jar包中加载类
WebappX类装载器负责当前应用程序/WEB-INF/classes 中的.class文件和/WEB-INF/lib 中的jar包中加载类
补充:
Tomcat6.x在目录上最大的区别就是将 lib 包直接置于 CATALINA_HOME/lib 下,
而tomcat 5.x 系列版本是分common/share/server 三个包存放的。再具体解释一下:
CATALINA_HOME/common
在这个目录下的lib目录,存放Tomcat 服务器和所有Web应用都能访问的JAR.
CATALINA_HOME/share
在这个目录下的lib目录,存放所有Web应用都能访问的,但Tomcat 不能访问的JAR。
CATALINA_HOME/server
在这个目录下的lib目录,存放Tomcat 服务器需要的但Web应用不能访问的JAR。
另外该目录下webapps 存放Tomcat 自带的APP-admin和manager两个应用。



(8)、编写一个Servlet 编译工具
问题(1):怎样把一个servelt需要的jar包引入classpath
(2):怎样把带包一个servlet在WEB-INF/classes目录下形成目录结构。
写一个批处理文件
compile.bat
set classpath=c:/../servlet-api.jar;%classpath%
javac -d c:/../WEB-INF/classes %1
pause


把编写好的Servlet 拖入这个批处理文件就可以了编译了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: