Servlet入门笔记

来源:互联网 发布:java jdk中文文档 编辑:程序博客网 时间:2024/06/06 14:07
1、Servlet是sun公司提供的一门用于开发动态web资源的技术
1-sun公司在其api中提供了一个servlet接口,开发一个Java程序向浏览器输出数据,需要编写一个Java类,实现servlet接口,并把开发好的servlet部署到web服务器中
2-编译带包的java文件:javac -d . test.java(编译Servlet需要servlet-api包,并配置classpath,.表示编译后放在当前目录)


2、Servlet入门(手写servlet):
1)在tomcat中新建一个web应用,然后在web应用中新建一个WEB-INF/classes目录。
2)在classes目录中新建一个servlet
3)set classpath=%classpath%;...servlet.jar 编译servlet,见1.2_
4)在WEB-INF目录中新建一个web.xml文件,配置servlet的对外访问路径
servlet(用于注册servlet)
servlet-name
servlet-class
servlet-mapping(用于映射一个已注册的Servlet的一个对外访问路径)
servlet-name
url-pattern
同一个servlet可以映射多个servlet-mapping(在Servlet映射到的URL中这能有两种固定的格式:一种是“*.扩展名”,一种是以正斜杠开头并以“/*”结尾。如*.html、/*等,当有地址冲突时,比较像的哪个被调用,并且“*.扩展名”的优先级较低)
5)启动tomcat,访问


3、Servlet调用过程:
1)连上web服务器
2)发送http请求
3)解析出想访问的主机名
4)解析想访问的web应用
4)解析出想访问的web资源
6)第一次访问创建servlet实例对象(反射技术)
7)调用servlet的init方法完成对象初始化
8)调用servlet的service方法响应客户端的请求(创建request、response对象)
9)service方法执行,向代表客户端响应的response对象写入了向客户机输出的数据
10)service方法返回
11)服务器从response中取出数据,构建出一个http响应,回写给客户机
12)回写http响应
13)浏览器解析HTTP响应,提取数据显示
从中可以看出servlet生命周期:
servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
Servlet在第一次访问(不一定,见4.5)时服务器实例化,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行完成服务,当服务器决定将实例销毁的时候调用其destroy方法。web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过用service()方法实现。结束服务,web容器(web服务器关闭或者删除web应用时)调用servlet的destroy()方法。


4、servlet细节
1)复制项目到myeclipse中只改工程名不可以,注意修改配置信息,在Properties->myeclipse->web中
2)伪静态,如将servlet映射到/1.html地址上
3)Servlet引擎,Jsp引擎即调用他们的web服务器,servlet和jsp不能单独运行
4)Servelet是一个供其他Java程序(servelet引擎)调用的Java类,它不能独立运行,他的运行完全由Servlet引擎来控制和调度;针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出,servlet实例对象才会销毁;在Servlet的整个生命周期内,Servlet的init方法只被调用一次,而对一个Servlet的每次请求访问都导致Servlet引擎调用一次Servlet的service方法,对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
5)如果在xml文件中servlet中即servlet-class同级下面加上<load-on-startup>1</load-on-startup>,那么在web应用程序在启动时,就会装载并创建Servlet的实力对象、以及调用Servlet实例对象的init方法,而不是等第一次访问时,其中数字代表优先级,越小优先级越高
6)如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet;凡是在web.xml中找不到匹配的servlet-mapping元素的URL,他们的访问请求都将交给缺省的Servlet处理,也就是说,缺省的Servlet用于处理所有其他Servlet都不处理的访问请求;在tomcat安装目录\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省的Servlet;当访问Tomcat服务器中的某个静态Html文件和图片时,实际上是在访问这个缺省的Servlet。(也就是说,web都是先找Servlet,找不到了再访问其他的,所以,在配置自己的Servlet时,如果自己配置了缺省的Servlet,则本web应用中的静态资源无法访问)
7)Servlet线程安全问题:如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法;SingleThreadModel接口中中并没有定义任何的方法(这样的接口一般称为标记接口,例如Serializable、cloneable等都是),只要在servlet类定义中增加实现SingleThreadModel接口的声明即可;对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该类的多线程并发访问,其采用的方式是产生多个Servelet实例对象,并发的访问每个线程分别调用一个独立的Servlet实例对像;实现singleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上的解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用访问的问题。事实上,在Servlet API 2.4中,已经SingleThreadMOdel标记为Deprecated(已过时)。解决Servlet线程安全问题使用synchronized(Object){}同步块
8)<WatchedResource>WEB-INF/web.xml</WatchedResource>tomcat服务器context.xml中的这句话,使得开发时改变web.xml文件时不用重启服务器
1 0