1、-1-,JAVA基础教程-绝推推荐!,Java入门教程,课程名称:java Web开发,任课教师:李晓明 E-mail:,-3-,明确目标:,1.了解软件企业的用人需求 2.确立专业方向,制定学习与就业目标 3.作为一名Java软件工程师你应该具备哪些专业知识 4.相信自己,肯定自己,为目标的实现而努力,-4-,教材、参考书与课时安排:,教材 Java Web 应用开发教程 参考书 Core Servlets and JavaServer Pages 课时安排 授课 :48学时 上机 :16学时 上机安排上机地点:计算机系机房(6405)上机时间: 周五上午8:0010:00(从第5周至第16
2、周),-5-,上课要求:,认真记好笔记(非常必要,非常重要) 保持课堂安静,头脑清醒,思维活跃,要全力以付 认真、独立、按时完成并提交作业,作业必须经上机调试通过 重视上机实践,有效利用宝贵的上机时间,发现上机时间游戏或上网的,按缺席一次处理 分值安排:考试成绩 50% ,平时成绩 20%,项目成绩30%,-6-,怎样学好Java Web开发-How,端正学习态度态度决定一切 课前预习有目的 课后复习温故知新 认真完成作业检验学习成果 多做练习熟能生巧 参考课外书籍它山之石 互相交流兼听则明,-7-,第一章:开发环境的搭建,1.安装和配置JDK:首先到SUN的官方网站(http:/)下载最新版
3、本的J2SE,下载完成后双击图表开始安装,具体安装步骤如下: (1)签署许可证协议,-8-,(2)设置安装路径,-9-,-10-,(3)设置虚拟机安装路径,-11-,-12-,(4)安装完成,-13-,(5)设置环境变量,安装完JDK后,还要设置环境变量,在桌面上右击”我的电脑“图标,在弹出的快捷菜单中选择”属性“命令,选择”高级“选项卡,如下图所示。,-14-,然后单击”启动和故障恢复 ”栏下的“ 环境变量”按钮,弹出如下图所示的 “环境变量” 对话框,在 “系统变量” 栏中,设置3项变量,JAVA_HOME,PAHT,CLASSPATH,若已经存在则单击“编辑”按钮,不存在则单击“新建”按
4、钮。,-15-,JAVA_HOME指明JDK的安装路径,就是刚才安装的时的设置路径,如: D:javajdk1.6,此路径下包括lib,bin,jre等文件夹,以后运行Tomcat,Eclipse等都需要依赖此变量,使用%JAVA_HOME%就可以引用JAVA_HOME的值。,-16-,PATH使得系统可以在任何路径下识别java命令,系统变量中有PATH变量,编辑该变量时,在变量值最后加上:;%JAVA_HOME%bin;%JAVA_HOME%jrebin。,-17-,CLASSPATH为java加载类路径,只有类在CLASSPATH中,java命令才能找到,设为:.;%JAVA_HOME%
5、lib;%JAVA_HOME%libtools.jar。这里需要注意的是:在设置CLASSPATH时,第一个分号前面应该加一个“.”,代表当前路径。,-18-,2.安装并配置服务器-Tomcat,Tomcat是一个免费的开源的Servlet的容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。它可以和目前大部分的主流HTTP服务器(如IIS和Apache服务器)一起工作,而且运行稳定、可靠、效率高。Tomcat服务器是一种Servlet/JSP容器。(Servlet是一种运行在支持java语言的服务器上的组件。它最常见的用途
6、是扩展Java Web服务器功能,提供非常安全、可移植的、易于使用的CGI替代品。它是一种动态加载的模块,为来自Web客户的请求提供服务。它完全运行在java虚拟机上。由于它在服务器端运行,因此它的运行不依赖于浏览器。)。Tomcat作为Servlet容器,负责处理客户请求,把请求传送给Servlet并把结果返回给客户。Servlet容器与Servlet之间的接口由Java Servlet API定义的,在Java Servlet API中定义了Servlet的各种方法,这些方法在Servlet生命周期的不同阶段被Servlet容器调用;当客户请求访问某个Servlet时,Servlet容器将
7、创建一个ServletRequest对象和ServletResponse对象。在ServletRequest对象中封状了客户的请求信息,然后Servlet容器把ServletRequest对象和ServletResponse对象传给客户所请求的Servlet。Servlet把响应结果写到ServletResponse中,然后由Servlet容器把响应结果传给客户。Servlet容器响应客户请求的过程如下图所示。,-19-,客户,Servlet容器,Servlet,请求数据,响应数据,ServletResponse对象,ServletRequest对象,Tomcat可以在官方网站 (http:/
8、jakarta.apache.org/tomcat/index.html) 免费下载,以下以Tomcat5.5.25为例讲述。,-20-,(1)双击Apache-Tomcat5.5.25.exe,如下图所示,点击Next按钮。,-21-,(2)签署许可证协议:单击 “I Agree” 按钮继续安装。,-22-,(3)选择安装类型:在”Select the type of install” 下拉列表中选择”Full”选项,单击“Next”按钮。,-23-,(4)选择安装路径:在”Destination Falder”文本框中设置Tomcat的安装路径,然后单击“Next”按钮。,-24-,(5)
9、填写配置信息:在”http/1.1 Connector Port”文本框中设置Tomcat的Web服务端口号,用默认的端口号8080,要注意8080端口不能被其他Web服务器占用,否则安装失败。Tomcat自带有管理工具,其超级管理员的用户名和密码可以在此设置。单击“Next”按钮。,-25-,(6)填写虚拟机安装路径:先检查默认的虚拟机安装路径与实际的是否相符,如果不符,则输入java虚拟机的安装目录。点击”Install”按钮,开始正式安装。,-26-,-27-,(6)安装完成:如果选择了”Run Apache Tomcat”复选框,按下“Finish”按钮之后,会直接启动Tomcat,在
10、计算机的右下角会出现兰色箭头符号。,-28-,(7)测试Tomcat:打开浏览器,在地址栏中输入http:/localhost:8080后,假设安装成功,会看到如下所示的页面。,-29-,(8)设置环境变量:,TOMCAT_HOME:Tomcat的安装目录,如:TOMCAT_HOME=D:Tomcat5.5.25 CLASSPATH:%TOMCAT_HOME%commonlib,如: CLASSPATH=.;%JAVA_HOME%lib;%TOMCAT_HOME%commonlib,-30-,3.配置Tomcat服务器,(1)Tomcat的目录结构:,-31-,(2)Tomcat的组件结构:,
11、Tomcat服务器是由一系列可配置的组件构成,其中核心组件是Catalina Servlet容器,它是所有其他Tomcat组件的顶层容器。Tomcat的组件可以在/conf/server.xml文件中进行配置,每个Tomcat组件在server.xml文件中对应一种配置元素,其结构如下:,-32-,1.顶层类元素顶层类元素包括元素和元素,它们位于整个配置文件的顶层。 2.连接器类元素连接器类元素代表了介于客户与服务之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应结果传送给客户。 3.容器类元素容器类元素代表处理客户请求并生成响应结果的组件,有3种容器类元素,它们是Engine、H
12、ost、和Context。Engine组件为特定的Service组件处理所有客户请求,Host组件为特定的虚拟主机处理所有客户请求,Context组件为特定的Web应用处理所有客户请求。 4.嵌套类元素嵌套类元素代表了可以加入到容器中的组件,如元素、元素和元素。,以上这些元素可以分为4类:,-33-,元素元素代表整个Catalina Servlet容器,它是Tomcat实例的顶层元素。元素可以包含一个或多个元素。元素元素中包含一个元素,以及一个或多个元素,这些元素共享同一个元素。 元素元素代表和客户程序实际交互的组件,它负责接收客户请求,以及向客户返回响应结果。 元素每个元素只能包含一个元素。
13、元素处理在同一个中所有元素接收到的客户请求。 元素一个元素中可以包含多个元素,每个元素定义了一个虚拟主机,它可以包含一个或多个Web应用。 元素元素是使用最频繁的元素。每个元素代表了运行在虚拟主机上的单个Web应用。一个元素中可以包含多个元素。,-34-,Tomcat各个组件之间的嵌套关系如下图:,-35-,4.创建与发布Web应用,Java Web应用是由一组静态HTML页、Servlet、JSP和其他相关的class组成。每种组件在Web应用中都有固定的存放目录。Web应用的配置信息存放在web.xml文件中。在开发某些组件(如Servlet)时,必须在web.xml 文件中添加相应的配置
14、信息。 (1)Web应用的目录结构Web应用具有固定的目录结构,这里假定开发一个userLoginapp(用户登陆)的Web应用。首先应该在/webapps目录下创建一个web应用的目录结构,参见下图所示。,-36-,userLoginapp应用的目录结构,-37-,(1)index.html文件,userLoginapp欢迎您光临本网站,祝大家学习愉快!请点击进入登陆界面,-38-,(2)login.html文件,登陆界面username:password:,-39-,(3)Web配置文件,LoginServletcom.lxm.LoginServletLoginServlet/login,
15、-40-,元素的属性,-41-,元素属性,用来配置一个servlet的映射,它有两个属性。xxx引用前面设定的Servlet实例名(必须和Servlet标签中的后的值相同)。 /xxx设定访问该Servlet的URL(访问Servlet的相对URL路径,必需以“/”开头)。 ,-42-,(4)LoginServlet.java文件,package com.lxm; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class LonginServlet extends HttpServle
16、tprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doPost(request,response);,-43-,protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(“text/html;
17、charset=UTF-8“);PrintWriter out=response.getWriter();String username=request.getParameter(“username“);String password=request.getParameter(“pwd“);out.print(“welocome you “+username+“!“);out.print(“password is “+password+“ “);if(username!=null ,-44-,(5)如何修改Tomcat的默认端口,在Tomcat安装过程中可以更改Tomcat的默认端口,如果在安
18、装过程中未修改,而在以后的运行过程中将默认是8080更改的话,其实通过修改Tomcat配置文件servlet.xml中的Connector元素的port 属性值即可,如: . 注:元素代表与客户程序实际交互的组件,它负责接收客户请求,以及向客户返回响应结果。(第一个元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求。第二个定义了一个JK Connector,通过8009端口接收由其他HTTP服务器(如APACHE)转发过来的客户请求)。,-45-,常用端口属性介绍,Port:定义TCP/IP端口号,默认是8080 maxThreads:设定处理客户请求的线程的最大数
19、目,这个值也决定了服务器可以同时响应请求的最大数目,默认值是200。 enableLookups:如果为true表示支持域名解析,可以把IP地址解析为主机名Web应用中调用request.getRemostHost方法将返回客户的主机名,该属性的默认值为true。 redirectPort:指定转发端口。如果当前端口只支持non-SSL请求,在需要安全通信的场合,将把客户请求转发到基于SSL的redirectPort端口。 acceptCount:设定在监听端口队列中的最大客户请求数,如果队列已满,客户请求将被拒绝。 connectionTimeout:定义建立客户连接超时的时间,以毫秒为单位
20、,如果设置为-1,表示不限制建立客户连接的时间。,-46-,(6)如何配置虚拟主机,虚拟主机是一种在一个Web应用服务器上服务多个域名的机制,对每个域名而言,都好象独享了整个主机。目前Internet上的大多数中小型网站均采用虚拟主机来实现。在Tomcat中配置虚拟主机,只要在servlet.xml中添加一个Host元素即可,不过有一点需要注意,每个Host元素必须包括一个或多个context元素,且所包含的context元素中必须有一个是默认的context,这个默认的context的访问路径应该设置为空,例如:name:定义虚拟主机的名字appBase:指定虚拟主机的目录,可以指定绝对目录
21、,也可以指定相对于的相对目录.如果此项没有设定,默认值为/webapps 元素由org.apache.catalian.Context接口定义.它是使用最频繁的元素,每个元素代表了在虚拟主机上的单个Web应用.一个元素可以包含多个元素.,-47-,path:指定访问该Web应用的URL入口docBase:指定Web应用的文件路径,可以是绝对路径也可以是相对于Host的appBase属性的相对路径.如果Web应用采用开放目录结构,那就指定Web应用的根目录.reloadable:如果这个属性设定为true,Tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/li
22、b目录下CLASS文件的改动.如果检测到有class文件被更新,服务器会自动重新加载Web应用.cookies:指定是否通过Cookies来支持Session.默认值为true,-48-,第二章 Servlet开发基础,1.Servlet的相关概念与前置知识 (1)什么是动态网页如果浏览器在不同时刻或不同条件下访问Web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态网页。 注意:要能区分动态网页与动态HTML页面的概念。document.write(new Date(); ,-49-,(2)动态网页程序与引擎,Web服务器的的作用在于实时接收浏览器的请求,并将
23、响应结果回送给浏览器,对于静态HTML的访问请求,Web服务器可以直接从文件系统中读取并返回给浏览器但对于要根据某些条件去动态创建内容的访问请求,web服务器本身不具备处理这种请求的能力,而是需要专门的Web服务器程序模块来处理,因此,动态网页内容的创建过程包含两个步骤:首先使用某种编程语言编写出相应的动态网页程序;然后由一个专门的Web服务器程序模块来解释执行该动态网页程序。动态网页程序可以完成各种程序逻辑控制、获取客户端传递的数据、对数据进行操作、创建输出内容等功能。Web程序开发就是指使用某种编程语言来编写完成上述功能的动态网页程序。动态网页程序需要有一个专门的Web服务器程序模块来解释
24、执行,专门解释和执行某种动态网页程序的Web服务器程序模块习惯上被称为引擎。如ASP引擎、Servlet引擎,JSP引擎等等。 只有引擎才可以与浏览器直接进行信息交换,动态网页程序不直接与浏览器进行信息交换,动态网页程序只与引擎进行信息交换。由引擎将浏览器的信息传递给动态网页程序,并将动态网页程序生成的结果回送给浏览器。引擎要与动态网页程序进行通信,必须提供一些API(编程接口)给动态网页程序调用。浏览器、引擎、API和动态网页程序之间的工作关系如下:,-50-,浏览器、引擎、API和动态网页程序之间的工作关系图,-51-,(3)Servlet技术简介,Servlet技术SUN公司提供的一种实
25、现动态网页的解决方案,它是基于JAVA编程语言的Web服务器端编程技术,主要用于在WEB服务器端获得客户端的访问请求信息和动态生成对客户端的响应消息。 Servlet技术也是JSP技术(另一种动态网页开发技术)的基础。一个Servlet程序就是一 个实现了特殊接口的Java类,它由支持Servlet的Web服务器(具有Servlet引擎)调用和启动运行。一个Servlet程序负责处理它所对应的一个或一组URL地址的访问请求,并用于接收客户端发出的访问请求信息和产生响应内容。 Servlet程序具备以下的基本功能:获取客户端HTML的FORM表单提交的数据和URL后面的参数信息。 创建和客户端的
26、响应消息内容。 访问服务器端的文件系统。 连接数据库并开发基于数据库的应用。 调用其他JAVA类。,-52-,(4)B/S系统架构与C/S系统架构,C/S系统架构:也就是客户端/服务器架构,它是早期出现的一种分布式架构,通常采用两层软件组件:一层是客户端程序;另一层是服务器端的数据库。采用两层软件组件的C/S有如下一些缺陷:1。来自于数据库连接方面的问题;如果每个客户端程序都与数据库保持持久的连接,而数据库支持的并发连接数有限,那么这就限制了同时运行的客户端程序的数目。如果将客户端程序设计成不要与数据库保持持久连接,而是每次要传输数据时才建立连接,数据传输完毕后立即断开连接,这样可以实现多个客
27、户端程序与数据库轮流建立连接,从而增加同时运行的客户端程序数目,但是这种方式给程序的事务处理带来极大困难,并且客户端每次与数据库建立连接的过程需要相对较长的时间,所以这种方式并不适合需要频繁与数据库进行交互的客户端程序,而只适合偶尔与数据库交互一下的Web应用。 2。业务逻辑处理和界面显示都要由客户端程序负责处理,没有对业务逻辑和界面进行分离,一旦业务逻辑或显示界面要发生变化,则需要对整个客户端程序进行修改,不利于软件的维护和功能的扩展。,-53-,3。软件升级困难。由于在每个客户机上都需要安装客户端程序,对于大一点的企业来说,如果客户端程序发生了修改,则需要系统管理人员到几百甚至上千台客户机
28、上去重新安装客户端程序,这种工作量之大和效率之低是可想而知的。优点:由于C/S架构中的客户端程序就是计算机上的一个桌面程序,因此它也存在着一些优点,功能可以做的非常强大,例如:在数据库服务器不可以用时仍然可以独立运行,可以将事务记录临时保存到本地桌面数据库中,然后在集中提交给数据库服务器,很容易对数据库中的数据进行实时监控和实现报警功能。,-54-,B/S架构:浏览器/服务器架构,B/S架构与C/S架构的最大区别就是将软件系统的用户操作界面以网页的形式在客户机的Web浏览器中展现给用户,在客户端计算机上不需要安装应用软件的客户端程序,而Web浏览器则是每台客户机的操作系统自带的工具软件,也不需
29、要单独安装。通俗的讲B/S架构就是一个通过浏览器与之进行交互的网站系统,通过该网站系统可以实现企业的信息管理。最简单的B/S架构如下图:,-55-,B/S架构的优点:,B/S架构将程序中的界面显示和业务逻辑处理都移到了Web服务器中来实现,其应用全部集中到了Web服务器端,客户端只需要具备浏览器就可以作为B/S架构 的操作终端而不用安装和部署任何程序。系统的维护,修改,升级都在服务器端进行,不需要在客户机上进行任何的操作和部署,在用户的不知不觉中迅速完成,另外,由于客户端不直接与数据库建立连接,而是只有Web服务器端的程序需要与数据库建立连接,所以数据库并发连接数量有限的问题也得到了解决。,-
30、56-,(5)Servlet的API,Servlet的框架是由两个Java包组成的:javax.servlet和javax.servlet.http。在javax.servlet包中定义了所有的Servlet类都必须实现和扩展的通用接口和类。在javax.servlet.http包中定义了采用HTTP协议通信的HttpServlet类。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。在Servlet接口中定义了5个方法,其中有3个方法代表了Servlet的生命周期:init 方法,负责初始化Servlet对象service方法
31、,负责响应客户的请求destroy方法,但Servlet对象退出生命周期时,负责释放占 用的资源,-57-,Servlet的框架结构图如下:,-58-,-59-,(6)Servlet的特点:,Servlet是一个供其他java程序(Servlet引擎)调用的java类,它不能独立运行。Servlet与Servlet引擎之间的关系就如同Applet与Web浏览器之间的关系一样,Servlet的运行完全由Servlet引擎来控制和调度。 Servlet引擎是一种容器程序,它负责管理和维护所有Servlet对象的生命周期,因此也被称为Servlet容器或Web容器。 Servlet的加载、执行流程,
32、以及如何接收客户端发送的数据和如何将数据传输到客户端等具体的底层事务,都是由Servlet引擎来实现的。 Servlet引擎负责将客户端的请求信息转交给Servlet和将Servlet生成的响应信息返回给客户端。,-60-,下图是通过Servlet程序查询数据库的工作过程,-61-,(7)Servlet的生命周期(运行过程):,Servlet引擎按照下面的过程来调用一个Servlet程序: (1.)接收到访问某个Servlet的HTTP请求之后, Servlet引擎首先检查是否已经装载并创建了该Servlet的实例对象。如果已经装载并创建了给Servlet的实例对象, Servlet引擎则直接
33、执行第4步,否则执行第2步。 (2.)装载并创建Servlet的一个实例对象。 (3.)调用Servlet实例对象的init()方法,以便执行Servlet的一些初始化工作。 (4.)创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。 (5.)在一个Web应用程序被停止或重新启动之前, Servlet引擎将卸载其中运行的Servlet。在卸载Servlet之前, Servlet引擎将调用Servlet的destroy(
34、)方法,以便在这个方法中执行Servlet的一些清尾工作,例如释放一些被该Servlet占用的资源。 Servlet引擎卸载某个Servlet之后,该Servlet实例对象变成垃圾,等待java虚拟机的垃圾收集器将其彻底从内存中清除。,-62-,补充说明:,在Servlet的整个生命周期内, Servlet只被初始化一次,而对一个Servlet的每次访问请求都导致Servlet引擎调用一次Servlet的service()方法,所以在Servlet的整个生命周期内,它的init()方法只被调用一次,但它的service()方法可能被调用多次,对于每次访问请求, Servlet引擎都会创建一个新
35、的HttpServletRequest请求对象和HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法。在service()方法内部首先从请求对象中获得请求信息,接着处理请求和访问其他资源以获得需要返回的信息,然后调用响应对象的方法将响应内容写入到Servlet引擎的缓冲区中,再由Web服务器发送给客户端。,-63-,浏览器访问Servlet的过程示意图:,(1)浏览器根据用户的请求生成http请求消息,并将其发送给Web容器,-64-,(2)Web容器检查内存中是否存在负责处理当前请求的Servlet程序的实例对象,如果不
36、存在,则加载和创建该Servlet对象。,-65-,(3)Web容器创建针对该次访问的请求对象(request)和响应对象(response)。请求对象中包含了http的请求信息,从它里面可以获得HTTP请求消息的内容;响应对象用于封装将要回送给浏览器的http响应信息,响应对象中的初始内容为空,但是以后可以调用它的各种方法来生成HTTP响应消息的各个部分。HttpServletRequest对象和 HttpServletResponse对象是Servlet引擎与Servlet程序进行通信的纽带。,-66-,(4)Web容器调用Servlet的service(ServletRequest,re
37、quest,ServletResponse response)方法,并将请求对象和响应对象传递给该方法。,request,response,-67-,(5)Servlet对象的Service方法从请求对象中读取请求信息,并向响应对象中写入响应头和响应体信息。,请求头请求体,-68-,(6)Service方法执行完毕后返回。,-69-,(7)Web容器从响应对象中读取响应信息。,-70-,(8)Web容器将响应信息发送给浏览器处理显示,一次请求响应过程完全结束,request 和response变成垃圾,等待垃圾收集器将其彻底从内存中清除。,-71-,Servlet响应Web容器客户请求流程的U
38、ML时序图:,-72-,Servlet生命周期状态图:,-73-,(8)Servlet的线程安全问题:,Servlet引擎采用多线程模式运行,它为并发的每个访问请求都预备一个独立的线程来进行响应。Servlet引擎采用的多线程模式可以提高访问的性能,但也带来了线程的安全问题。例如,如果并发的多个请求访的是同一个Servlet,那么将有多个线程来并发调用该Servlet的service方法。 Public class ThreadServlet extends HttpServlet/统计访问次数private int count=0;public void service(HttpServle
39、tRequest request,HttpServletResponse response)throws ServletException,IOExceptioncount+;tryThread.sleep(500);catch(Exception e)System.out.println(“这是第“+count+”次访问“+”,这次访问的线程名称是:“+Thread.currentThread().getName(); ,-74-,public class ThreadServlet extends HttpServlet private int count=0;protected void
40、 service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException synchronized(this) count+; try Thread.sleep(500); catch (InterruptedException e) e.printStackTrace(); System.out.println(count); ,-75-,SingleThreadModel接口:,Servlet API中定义了一个javax.servlet.SingleThr
41、eadModel接口,如果某个Servlet实现了这个接口,那么Servlet引擎将以单线程模式来调用其service方法。保证其单个实例对象的service方法不会同时被两个线程调用,但是,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是生产多个Servlet实例对象,并发的每个线程分别调用独立的Servlet实例对象,这样,可以同时有多个Servlet实例对象并发运行,每个Servlet实例对象的service方法都不会被多个线程并发调用。实现了SingleThreadModel接口的Servlet的多个实例对象共同组成一个Servlet对象池,当Web容器接收
42、到针对该Servlet的访问请求时,将从Servlet对象池中挑选一个空闲的Servlet实例对象进行响应。实现SingleThreadModel接口并不能真正解决Serlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,多个并发的请求分别由不同的Servlet实例对象处理,或者被单个Servlet实例对象啄个依次排队处理,而真正意义上的多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。所以,如果多个并发的service方法调用有线程安全问题,最好是自己在service方法中编写多线程的同步控制代码,而不是才用单线程的模式运行。,-76-,实现Si
43、ngleThreadModel接口:,Public class ThreadServlet extends HttpServlet implements SingleThreadModel/统计访问次数private int count=0;public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOExceptioncount+;tryThread.sleep(500);catch(Exception e)System.out.println(“这是
44、第“+count+”次访问“+”,这次访问的线程名称是:“+Thread.currentThread().getName(); ,-77-,哪些情况下要考虑线程安全问题:,在Servlet程序中除了访问成员变量时要注意线程安全问题,访问其他共享资源时也要注意线程安全问题,例如,Web应用程序对象,Session对象,数据库等都可能涉及多个Servlet线程同时访问的问题,如果servlet中没有定义成员变量和service方法中没有访问无同步访问控制的共享数据时,即使多个线程并发调用service方法,也不会存在任何线程安全问题。,-78-,一些编码建议:,-79-,并发需要注意的:,-80-
45、,3.ServletConfig接口:,Servlet程序是发布到Web应用程序中运行的,此Web应用程序就称之为Servlet容器,Servlet是在Servlet容器中运行的程序,它在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以Servlet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet。 Servlet引擎将代表Servlet容器的对象和Servlet的配置参数信息一并封装到一个称之为ServletConfig的对象中,并在初始
46、化Servlet实例对象时传递给该Servlet。ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关的信息,例如,获取代表Servlet容器的对象,获取在web.xml文件中为Servlet设置的友好名称和初始化参数等等。 Servlet引擎装载并创建一个Servlet的实例对象后,接着调用该实例对象的init(ServletConfig config)方法将ServletConfig对象传递给Servlet。 Servlet.getServletConfig()方法必须返回init(ServletCo
47、nfig config)方法传递进来的这个ServletConfig对象的引用。,-81-,在web.xml中配置的Servlet初始化参数:,ConfigTestcom.lxm.ConfigTest初始化参数名称初始化参数值. /可以配置多个初始化参数信息 ,-82-,getInitParameterNames方法:,在web.xml文件中可以为Servlet设置若干个初始化参数,getInitParameterNames()方法用于返回一个Enumeration集合对象,该对象中包含在web.xml文件中为当前Servlet设置的所有初始化参数的名称。例如:ConfigTestcom.lx
48、m.ConfigTestfirstnamelixiaominglastnamesunchengqiang,-83-,Import java.util.Enumeration; Response.setContentType(“text/html;charset=UTF-8”); PrintWriter out=response.getWriter(); Eunmeration e=getServletConfig().getInitParameterNames(); While(e.hasMoreElements()String key=(String )e.nextElement();Str
49、ing value=getInitParameter(key);out.println(“,-84-,getInitParameter(key)方法:,getInitParameter()方法用于返回在web.xml文件中为Servlet所设置的某个名称的初始化参数的值,如果指定名称的初始化参数不存在,则返回值为NULL。,-85-,getServletName()方法:,getServletName方法用于返回在Servlet在web.xml文件中的注册名称。,对于没有在web.xml文件中注册的Servlet,getServletName方法返回的结果是该Servlet的类名。,-86-,getServletContext()方法:,在Servlet程序中,每个Web应用程序(Servlet容器)都用一个各自的ServletContext对象来表示,ServletConfig对象中包含了ServletContext对象的引用,getServletContext方法用于返回ServletConfig对象中所包含的ServletContext对象的引用。,