4 Servlet l Servlet l Servlet l Servlet

  • Slides: 68
Download presentation

第 4讲 Servlet开发基础 l Servlet的有关概念与前置知识 l Servlet开发入门 l Servlet的特点及运行过程 l Servlet. Config接口 l Generic.

第 4讲 Servlet开发基础 l Servlet的有关概念与前置知识 l Servlet开发入门 l Servlet的特点及运行过程 l Servlet. Config接口 l Generic. Servlet与Http. Servlet类 l Servlet. Context接口 IT资讯交流网 WWW. IT 315. ORG

Servlet开发入门 l Servlet API介绍 l 编写与编译Servlet程序 l Servlet的注册与运行 l Servlet激活器 l 缺省Servlet l Servlet的类装载器

Servlet开发入门 l Servlet API介绍 l 编写与编译Servlet程序 l Servlet的注册与运行 l Servlet激活器 l 缺省Servlet l Servlet的类装载器 l 编写一个自动编译 具 IT资讯交流网 WWW. IT 315. ORG

编写与编译Servlet程序 import java. io. *; import javax. servlet. http. *; public class Hello. Servlet

编写与编译Servlet程序 import java. io. *; import javax. servlet. http. *; public class Hello. Servlet extends Http. Servlet { //从Http. Servlet类的帮助文档中复制service方法的声明部分可避免书写错误 public void service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { Print. Writer out = response. get. Writer(); out. println("<html>"); out. println("<font size=30 color=red>www. it 315. org</font> "); out. println("<marquee>" + new java. util. Date() + "</marquee>"); out. println("</html>"); } } 指点迷津:如何快速入门新技术 动手体验:Servlet程序的编写与编译过程 IT资讯交流网 WWW. IT 315. ORG

Servlet的注册与运行 l Servlet程序必须通过Servlet引擎来启动运行,并且储存目录有特殊要求,通常需要存储 在<WEB应用程序目录>WEB-INFclasses目录中。 l Servlet程序必须在WEB应用程序的web. xml文件中进行注册和映射其访问路径,才可以被 Servlet引擎加载和被外界访问。 l 一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name> 和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。 l 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含 有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和

Servlet的注册与运行 l Servlet程序必须通过Servlet引擎来启动运行,并且储存目录有特殊要求,通常需要存储 在<WEB应用程序目录>WEB-INFclasses目录中。 l Servlet程序必须在WEB应用程序的web. xml文件中进行注册和映射其访问路径,才可以被 Servlet引擎加载和被外界访问。 l 一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name> 和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。 l 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含 有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和 Servlet的对外访问路径。 <web-app>. . . <servlet> <servlet-name>Any. Name</servlet-name> <servlet-class>Hello. Servlet</servlet-class> </servlet>. . . <servlet-mapping> <servlet-name>Any. Name</servlet-name> <url-pattern>/demo/hello. html</url-pattern> </servlet-mapping>. . . </web-app> IT资讯交流网 WWW. IT 315. ORG

Servlet映射的细节 l 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元 素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。 l 在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的 格式:一种格式是“*. 扩展名”,另一种格式是以正斜杠(/)开头并 以“/*”结尾。 <servlet-mapping> <servlet-name> Any. Name </servlet-name>

Servlet映射的细节 l 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元 素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。 l 在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的 格式:一种格式是“*. 扩展名”,另一种格式是以正斜杠(/)开头并 以“/*”结尾。 <servlet-mapping> <servlet-name> Any. Name </servlet-name> <url-pattern> *. do </url-pattern> </servlet-mapping> <servlet-name> Any. Name </servlet-name> <url-pattern> /action/* </url-pattern> </servlet-mapping> IT资讯交流网 WWW. IT 315. ORG

Servlet激活器 l Tomcat的examples应用程序中的例子Servlet的访问路径: http: //localhost: 8080/examples/servlet/<Servlet名称> l 应用程序的web. xml文件中的设置: <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> l

Servlet激活器 l Tomcat的examples应用程序中的例子Servlet的访问路径: http: //localhost: 8080/examples/servlet/<Servlet名称> l 应用程序的web. xml文件中的设置: <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> l confweb. xml文件中的设置: <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org. apache. catalina. servlets. Invoker. Servlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> 动手体验:使用Servlet激活器 IT资讯交流网 WWW. IT 315. ORG

Tomcat中的类装载器 l l Bootstrap为Java虚拟机内嵌的类装载器与 Ext. Class. Loader的总称,负责加载Java核心包 中的类和存放在<JAVA_HOME>/jre/lib/ext目 录下的类。 System即系统类装载器,通常情况下就是 App. Class. Loader,负责加载CLASSPATH环境变 量设置的目录中的类。Tomcat不会继承操作系

Tomcat中的类装载器 l l Bootstrap为Java虚拟机内嵌的类装载器与 Ext. Class. Loader的总称,负责加载Java核心包 中的类和存放在<JAVA_HOME>/jre/lib/ext目 录下的类。 System即系统类装载器,通常情况下就是 App. Class. Loader,负责加载CLASSPATH环境变 量设置的目录中的类。Tomcat不会继承操作系 统上原来设置好的CLASSPATH环境变量的内容, 而是将CLASSPATH环境变量重新设置为仅包含 如下两个jar包: ü<CATALINA_HOME>/bin/bootstrap. jar ü<JAVA_HOME>/lib/tools. jar l l Common类装载器负责从<CATALINA_HOME>/common/classes中的. class类文件和 <CATALINA_HOME>/common/lib中的jar包加载类。 Catalina类装载器负责从<CATALINA_HOME>/server/classes中的. class类文件和 <CATALINA_HOME>/server/lib中的jar包加载类。 Shared类装载器负责从<CATALINA_HOME>/share/classes中的. class类文件和 <CATALINA_HOME>/share/lib中的jar包加载类。 Webapp. X类装载器负责从当前Web应用程序的/WEB-INF/classes中的. class类文件 和/WEB-INF/lib中的jar包加载类。 IT资讯交流网 WWW. IT 315. ORG

Servlet的运行过程 特殊说明 l 在<servlet>元素中嵌套一个<load-on-startup>子元素,WEB应用程序在启动时就 可以装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 举例: <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org. apache. catalina. servlets. Invoker.

Servlet的运行过程 特殊说明 l 在<servlet>元素中嵌套一个<load-on-startup>子元素,WEB应用程序在启动时就 可以装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 举例: <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org. apache. catalina. servlets. Invoker. Servlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> l l 在Servlet的整个生命周期内,它的init方法只被调用一次,而对一个Servlet的每 次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请 求,Servlet引擎都会创建一个新的Http. Servlet. Request请求对象和一个新的 Http. Servlet. Response响应对象,然后将这两个对象作为参数传递给它调用的 Servlet的service()方法。 Tomcat也提供了是否自动重新装载被修改的Servlet的配置选项。在<Tomcat安装主 目录>/conf/server. xml文件中,可以将<Context>元素的reloadable属性设置为 true,这样,Tomcat将监视该WEB应用程序的/WEB-INF/classes和/WEB-INF/lib目 录下的类是否发生了改变,然后自动重新装载那些发生了改变的类。 举例: <Context path="/it 315" doc. Base="d: myweb" debug="0" reloadable="true"/> IT资讯交流网 WWW. IT 315. ORG

Servlet. Config接口 l Servlet在有些情况下可能 需要访问Servlet容器或借 助Servlet容器访问外部的 资源,所以,Serlvet引擎 需要将表示Servlet容器的 对象传递给Servlet。另外, 在web. xml文件中为某个 Servlet设置的友好名称和 初始化参数等信息也需要 传递给该Servlet。

Servlet. Config接口 l Servlet在有些情况下可能 需要访问Servlet容器或借 助Servlet容器访问外部的 资源,所以,Serlvet引擎 需要将表示Servlet容器的 对象传递给Servlet。另外, 在web. xml文件中为某个 Servlet设置的友好名称和 初始化参数等信息也需要 传递给该Servlet。 为Servlet设置参数的例子: <servlet> <servlet-name>Config. Test</servlet-name> <servlet-class>Config. Test. Servlet</servlet-class> <init-param> <param-name>Corporation</param-name> <param-value>北京传智播客公司</param-value> </init-param> </servlet> l Servlet引擎将代表Servlet容器的对象和Servlet的配置参数信息一并封装到一 个称为Servlet. Config的对象中,并在初始化Servlet实例对象时传递给该 Servlet。Servlet. Config接口则用于定义Servlet. Config对象需要对外提供的方 法,以便在Servlet程序中可以调用这些方法来获取有关信息。 l Servlet引擎调用Servlet的实例对象的init(Servlet. Config config)方法将 Servlet. Config对象传递给Servlet。Servlet. get. Servlet. Config()方法必须返回 init(Servlet. Config config)方法传递进来的这个Servlet. Config对象的引用。 IT资讯交流网 WWW. IT 315. ORG

Servlet. Config接口的方法 l get. Init. Parameter. Names l get. Init. Parameter l get. Servlet.

Servlet. Config接口的方法 l get. Init. Parameter. Names l get. Init. Parameter l get. Servlet. Name l get. Servlet. Context IT资讯交流网 WWW. IT 315. ORG

Generic. Servlet类实现 Servlet. Config接口的目的 l Servlet接口中定义了一个get. Servlet. Config方法,该方法必须返回Servlet容器调用 Servlet. init(Servlet. Config config)方法时传递进来的那个Servlet. Config对象的引用, Generic.

Generic. Servlet类实现 Servlet. Config接口的目的 l Servlet接口中定义了一个get. Servlet. Config方法,该方法必须返回Servlet容器调用 Servlet. init(Servlet. Config config)方法时传递进来的那个Servlet. Config对象的引用, Generic. Servlet类已经按此要求实现了get. Servlet. Config方法。 l 在Servlet程序中如何调用Servlet. Config对象的方法 举例:String servlet. Name = get. Servlet. Config(). get. Servlet. Name(); l Generic. Servlet类如何实现Servlet. Config接口中的方法 举例: public String get. Servlet. Name() { return get. Servlet. Config(). get. Servlet. Name(); } l 在Servlet程序中调用Servlet. Config对象的方法的简单方式 举例:String servlet. Name = get. Servlet. Name(); 动手体验:了解Servlet. Config对象的应用 IT资讯交流网 WWW. IT 315. ORG

Generic. Servlet与Http. Servlet类 l 区分回调方法与 具方法 l init方法 l service方法 l destroy方法 l Get.

Generic. Servlet与Http. Servlet类 l 区分回调方法与 具方法 l init方法 l service方法 l destroy方法 l Get. Servlet. Config方法 l Get. Servlet. Info方法 l do. Xxx方法 l 浏览器缓存内幕与get. Last. Modified方法 IT资讯交流网 WWW. IT 315. ORG

init方法的实现技巧 l Servlet接口中定义的init方法的语法格式为: public void init(Servlet. Config config) throws Servlet. Exception l Generic. Servlet类中的其他方法依赖init方法的执行结果:

init方法的实现技巧 l Servlet接口中定义的init方法的语法格式为: public void init(Servlet. Config config) throws Servlet. Exception l Generic. Servlet类中的其他方法依赖init方法的执行结果: public class Generic. Servlet { private Servlet. Config config = null; public void init(Servlet. Config config) throws Servlet. Exception { this. config = config; l 解决办法: } public void init(Servlet. Config config) throws public Servlet. Context get. Servlet. Context() Servlet. Exception { { return config. get. Servlet. Context(); this. config = config; } init(); …… } } l 为了不破坏Generic. Servlet的其他方法的功能,Generic. Servlet子孙类 中的init方法首先应该使用super. init(config)语句。 IT资讯交流网 WWW. IT 315. ORG

service方法的实现技巧 l Servlet接口中定义的service方法的语法格式及处理代码: public void service(Servlet. Request req, Servlet. Response res) throws Servlet. Exception,

service方法的实现技巧 l Servlet接口中定义的service方法的语法格式及处理代码: public void service(Servlet. Request req, Servlet. Response res) throws Servlet. Exception, java. io. IOException { Http. Servlet. Request request = (Http. Servlet. Request)req; Http. Servlet. Response response = (Http. Servlet. Response)res; …… request. Http. Servlet. Request中定义的方法(); response. Http. Servlet. Response中定义的方法(); …… } l Http. Servlet类中定义的重载service方法的语法格式及处理代码: protected void service(Http. Servlet. Request req, Http. Servlet. Response resp) throws Servlet. Exception, java. io. IOException { …… req. Http. Servlet. Request中定义的方法(); res. Http. Servlet. Response中定义的方法(); …… } l Http. Servlet类中实现的service方法的语法格式及处理代码: public void service(Servlet. Request req, Servlet. Response res) throws Servlet. Exception, java. io. IOException { Http. Servlet. Request request = (Http. Servlet. Request)req; Http. Servlet. Response response = (Http. Servlet. Response)res; service(request, response); //这里调用的是那个重载的service方法 } IT资讯交流网 WWW. IT 315. ORG

获取WEB应用程序的初始化参数 l l l 为WEB应用程序设置初始化参数的好处在于不需要修改Servlet源程序,就可以改变 一些参数信息。 Servlet. Context. get. Init. Parameter. Names方法用于返回一个包含WEB应用程序的所有 初始化参数名称的Enumeration集合对象,Servlet. Context.

获取WEB应用程序的初始化参数 l l l 为WEB应用程序设置初始化参数的好处在于不需要修改Servlet源程序,就可以改变 一些参数信息。 Servlet. Context. get. Init. Parameter. Names方法用于返回一个包含WEB应用程序的所有 初始化参数名称的Enumeration集合对象,Servlet. Context. get. Init. Parameter方法 用于返回某个指定名称的初始化参数值。 在server. xml文件的<Context>元素中增加<Parameter>子元素,如下所示: <Context path="/it 315" doc. Base="d: myweb" debug="0" reloadable="true"> <Parameter name="company. Name" value="it 315" override="false"/> </Context> l 在web. xml文件的根元素<web-app>中增加<context-param>子元素,如下所示: <context-param> <param-name>company. Name</param-name> <param-value>it 315_new</param-value> </context-param> 动手体验:了解WEB应用程序的初始化参数的设置与应用 IT资讯交流网 WWW. IT 315. ORG

记录日志 l l Servlet. Context接口中定义了两个重载的log方法来记录日志: - public void log(java. lang. String msg) public void

记录日志 l l Servlet. Context接口中定义了两个重载的log方法来记录日志: - public void log(java. lang. String msg) public void log(java. lang. String message, java. lang. Throwable t) log方法记录日志的文件名称和存储路径因WEB服务器而异,Tomcat使用 server. xml文件中的<logger>元素来设置日志文件的相关信息: <Logger class. Name="org. apache. catalina. logger. File. Logger" directory="logs" prefix="localhost_log. " suffix=". txt" timestamp="true"/> 动手体验:了解WEB应用程序的日志记录 IT资讯交流网 WWW. IT 315. ORG

JDK日志记录模块的属性配置文件 l 属性文件可以通过两种方式指定: - 使用默认的<JRE_HOME>/lib/log. properties文件 为JVM设置java. util. logging. config. file系统属性,即采用如下方式: java -Djava. util.

JDK日志记录模块的属性配置文件 l 属性文件可以通过两种方式指定: - 使用默认的<JRE_HOME>/lib/log. properties文件 为JVM设置java. util. logging. config. file系统属性,即采用如下方式: java -Djava. util. logging. config. file=<属性文件名> <类名> l 属性文件实例 文件清单:log. properties handlers=java. util. logging. Console. Handler. level=INFO org. it 315. xxx. level=FINER java. util. logging. Console. Handler. level=CONFIG java. util. logging. Console. Handler. formatter=java. util. logging. Simple. Formatter 动手体验: 体验JDK日志记录模块的用法 IT资讯交流网 WWW. IT 315. ORG

访问资源文件 l get. Resource. Paths方法 文件目录结构:/welcome. html、/WEB-INF/web. xml get. Resource. Paths("/")返回["/welcome. html", "/WEB-INF/"] get.

访问资源文件 l get. Resource. Paths方法 文件目录结构:/welcome. html、/WEB-INF/web. xml get. Resource. Paths("/")返回["/welcome. html", "/WEB-INF/"] get. Resource. Paths("/WEB-INF/")返回["/WEB-INF/web. xml"] l get. Resource方法 public java. net. URL get. Resource(java. lang. String path) throws java. net. Malformed. URLException l get. Resource. As. Stream方法 public java. io. Input. Stream get. Resource. As. Stream(java. lang. String path) IT资讯交流网 WWW. IT 315. ORG

Servlet. Context接口中的其他方法 l get. Major. Version方法 l get. Minor. Version方法 l get. Mime. Type方法

Servlet. Context接口中的其他方法 l get. Major. Version方法 l get. Minor. Version方法 l get. Mime. Type方法 l get. Server. Info方法 IT资讯交流网 WWW. IT 315. ORG

思考与实践(3) 程序清单:Config. Test. Servlet. java import java. io. *; import javax. servlet. http. *;

思考与实践(3) 程序清单:Config. Test. Servlet. java import java. io. *; import javax. servlet. http. *; public class Config. Test. Servlet extends Http. Servlet { public void service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type("text/plain; charset=GB 2312"); Print. Writer out = response. get. Writer(); out. println("Servlet名称为:" + /*this. */get. Servlet. Name() + " "); out. println("</html>"); } } 如果在上面的例子程序中,覆盖Generic. Servlet的有参数的init(Servlet. Config config)方法,在其方法体中什么也不写,如下所示: public void init(Servlet. Config config) throws Servlet. Exception { } 请问Config. Test. Servlet将是怎样的访问运行效果? 如果将这个方法定义修改为覆盖Generic. Servlet的无参数的init()方法,即修改成如下形式: public void init() throws Servlet. Exception { } 这时,Config. Test. Servlet又将是怎样的访问运行效果? IT资讯交流网 WWW. IT 315. ORG

思考与实践(4) import java. io. *; import javax. servlet. http. *; public class Hello. Servlet

思考与实践(4) import java. io. *; import javax. servlet. http. *; public class Hello. Servlet extends Http. Servlet { //只是在下面将service方法名修改成了do. Get public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { Print. Writer out = response. get. Writer(); out. println("<html>"); out. println("<font size=30 color=red>www. it 315. org</font> "); out. println("<marquee>" + new java. util. Date() + "</marquee>"); out. println("</html>"); } } 因为HEAD请求方式除了不要求WEB服务器返回实体正文部分外,它的操作与GET方式完全一样,所以 只要覆盖了do. Get方法,即使没有覆盖do. Head方法,Servlet也可以支持HEAD请求方式。请针对上面的 例子程序,使用telnet命令做一个HEAD请求方式的访问实验,对实验过程抓图后发送给www. it 315. org站 点。 IT资讯交流网 WWW. IT 315. ORG