版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.1简介典型的桌面应用程序的示例有记事本,媒体播放器等等。是本地.exe程序。用户和桌面程序的交互如图1.1。图1.1用户和桌面程序的交互随着Internet的兴起,现在大多数电脑用户更加习惯Internet的Web应用。用户和Web应用程序的交互如图1.2所示。图1.2用户访问网站Web应用程序和桌面程序相比,优点如下。首先,Web应用程序的访问更加容易,用于访问Web应用的标准协议为HTTP协议,为绝大多数操作系统所支持。此外,所要求的客户端仅仅是浏览器。其次,维护和部署成本低,Web应用程序在浏览器中请求运行,不需要在每个客户端系统上安装客户端软件。Web应用程序代码可以再服务器端进行修改和维护,这将节省更新和部署应用程序所需要的时间和成本。Web应用运行在服务器上,服务器是一台设备,它为网络上的不同设备,即客户端的请求提供信息。最初,通过编写CGI(CommonGatewayInterface,通用网关接口)程序来实现数据在Web上的传输,但是,对于客户端作出的每个请求,必须创建CGI程序的一个新实例,这将占用大量内存。因此,为了解决这个问题,引入了Servlet技术。Servlet是一个用Java编写的应用程序,在服务器上运行,处理请求的信息并将其发送到客户端。Servlet的客户端可以提出请求并获得该请求的响应,它可以使任何Java应用程序、浏览器或任何设备。对于所有的客户端请求,只需要创建Servlet的实例一次,因此节省了大量的内存。Servlet在初始化后即驻留内存中,因此每次作出请求时无需加载。1.2HTTP基础知识用户的请求和Web应用程序的相应需要通过Internet从一台计算机发送到另一台计算机或服务器,使用超文本传输协议HTTP。HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。通过使用Web浏览器等工具,客户端发起一个到服务器上指定端口的HTTP请求。应答的服务器上存储着一些资源,比如HTML文件和图像。HTTP协议并没有规定必须使用它和基于它支持的层。事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定其下层协议提供可靠的传输,任何能够提供这种保证的协议都可以被其使用。1.2.1GET和POST方法区别HTTP请求消息使用GET或POST方法以便在Web上传输请求。检索信息时一般用GET方法,如检索文档、图表、或数据库查询结果。要检索的信息作为字符序列传递,称为查询字符串。因此,传递的数据对客户端是可见的,即将查询字符串附加到URL中,但是,查询字符串的长度有限制,最多124字节。GET方法是表单默认的方法。我们用google检索“java”,可以知道google使用了GET方法对用户输入的搜索字符串检索搜索结果。如图1.1所示。图1.1HTTP定义的另一种请求方法是POST方法。使用POST发送的数据对客户端是不可见的,且对发送的数据的量没有限制。下面我们来对比一下GET和POST方法。GET是从服务器上获取数据;POST是向服务器传送数据。在客户端,GET通过URL提交数据,数据在URL中可见;POST把数据放在form的数据体内提交。GET提交的数据最多只有1024字节;POST提交的数据量无限制。由于使用GET时,参数会显示在地址栏上,而POST不会,所以,如果这些数据是非敏感数据,那么使用GET;如果包含敏感数据,为了安全,用POST。1.3Servlet简介和优点自427年1月SunMicrosystems公司所组成的JavaSoft部门将ServletAPI定案以来,推出了ServletAPI1.0,就当时功能来说,Servlet所提供的功能包含了当时的CGI与NetscapeServerAPI(NSAPI)之类产品的功能。发展至今,它依旧是一个具有跨平台特性、10%PureJava的Server-Side程序,Servlet不只限定于HTTP协议,开发人员可以利用Servlet自定义或延伸任何支持Java的Server,包括WebServer、MailServer、FtpServer、ApplicationServer或任何自定义的Server。Server有以下优点:可移植性,Servlet皆是利用Java语言来开发的,因此,延续Java在跨平台上的表现,不论Server的操作系统是什么,Windows、Linux、Solaris、HP-UX等,都能够将我们写好的Servlet程序放在这些操作系统上执行,借助Servlet的优势,就可以真正达到WriteOnce,ServeAnywhere的境界。Servlet是在Server端执行的,所以,程序员只要专心开发能在实际应用的平台环境下测试无误即可。除非从事做ServletContainer的公司,否则不须担心写出来的Servlet是否能在所有的JavaServer平台上执行。强大的功能,Servlet能够完全发挥JavaAPI的威力,包括网络和URL存取、多线程、影像处理、RMI(RemoteMethodInvocation)、分布式服务器组件、对象序列化等。若想写个网络目录查询程序,则可以利用JNDIAPI,相连接数据库可以用JDBC,偶这些强大功能的API做后盾,相信Servlet更能发挥其优势。性能,Servlet在加载执行后,其对象实体通常会一直停留在Server的内存中,若有请求发生时,服务器再调用Servlet来服务,假若收到相同服务的请求时,Servlet会利用不同的线程来处理,不像CGI程序必须产生许多进程来处理数据。在性能表现上,大大超过CGI程序。Servlet在执行时,不是一直停留在内存中,服务器会自动将停留时间过长一直没有执行的Servlet从内存中移除,不过有时候也可以自行写程序来控制,至于停留时间长短通常和选用的服务器有关。安全性,Servlet也有类型检查的特性,并且利用Java的垃圾回收与没有指针的设计,使得Servlet避免内存管理的问题。由于在Java的异常处理机制下,Servlet能够安全地处理各种错误,不会因为发生程序上逻辑错误而导致整体服务器系统的崩溃。例如,某个Servlet发生除以零或其他不合法的运算时,会抛出一个异常让服务器处理,如记录在Log日志中。1.4第一个Servlet例程我们现在来创建一个简单的Servlet:FirstServlet类,功能只是输出“Hello!大家好!”。代码如例1.1。/**FirstServlet.java*2002-06-16*功能:通过Servlet输出页面*/packagecom.jy.sample.servlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***HelloWorldServlet.*@authorJY*/publicclassFirstServletextendsHttpServlet{/**serialVersionUID.*/privatestaticfinallongserialVersionUID=217251451801586160L;@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//设定内容类型为HTML网页UTF-8编码resp.setContentType("text/html;charset=UTF-8");//输出页面PrintWriterout=resp.getWriter();out.println("<html><head>");out.println("<title>FirstServletHello</title>");out.println("</head><body>");out.println("Hello!大家好!");out.println("</body></html>");out.close();}}例1.1下面我们来看看这段代码,一开始我们必须导入javax.servlet.*和javax.servlet.http.*。其中,javax.servlet.*存放与HTTP协议无关的一般性Servlet类;javax.servlet.http.*增加了与HTTP协议有关的功能。所有Servlet都必须实现javax.servlet.Servlet接口,但是通常我们都会从javax.servlet.GenericServlet或javax.servlet.http.HttpServlet择一来实现。如果写的Servlet代码和HTTP协议无关,那么必须继承GenericServlet类;若有关,就必须继承HttpServlet类。我们的例子中继承的是HttpServlet类。javax.servlet.*里面的ServletRequest和ServletResponse接口提供存取一般的请求和响应;而javax.servlet.http.*里面的HttpServletRequest和HttpServletResponse接口,则提供HTTP请求及响应的存取服务。通过代码了解到,我们代码中用到的是HttpServletRequest和HttpServletResponse。我们的代码中,利用HttpServletResponse接口的setContentType()方法来设定内容类型,我们要显示为HTML网页类型,因此,内容类型设为“text/html”,这是HTML网页的标准MIME类型值。之后,用getWriter()方法返回PrintWriter类型的out对象,它与PrintStream类似,但是它能够对Java的Unicode字符进行编码转换。最后,利用out对象把“Hello!大家好!”的字符串显示在网页上。代码写好后,我们来设定web.xml文件,web.xml文件在我们Web项目的WEB-INF文件夹内。如图1.4。图1.4我们来详细看一看web.xml中这段关于Servlet的配置。配置一个Servlet需要配置两个标签,第一个<servlet>,一个是<servlet-mapping>。对于<servlet>,在其中可以配置Servlet的名字,所要调用的Java类,还有Servlet初始化时传入的参数。在这里,我们的Servlet名字是“FirstServlet”,调用的java类是“com.jy.sample.servlet.FirstServlet”,就是我们写的Servlet的package加上类名。我们写了一个最简单的Servlet,我们不需要传递初始化参数给Servlet,所以没有配置初始化参数,关于配置初始化参数,我们会在后边的例子里讲解。对于<servlet-mapping>,我们首先指定了Servlet的名字,然后设置url连接,在这里,我们设置的是“/FirstServlet”。这里的Servlet名字必须和上面的<servlet>标签中的<servlet-name>的值一致。当我们的页面中设定的连接和<url-pattern>中设定的值一致时,则会通过<servlet-name>找到对应Servlet类来运行。这里,当页面的连接(a标签或form设定的action)是“/FirstServlet”时,则会通过Servlet的名字“FirstServlet”来找到对应的Servlet类“com.jy.sample.servlet.FirstServlet”来运行。最后,我们看看FirstServlet的执行结果,如图1.5所示。图Servlet应用程序体系结构Servlet容器将Servlet动态地加载到服务器上。HTTPServlet使用HTTP请求和HTTP响应标题与客户端进行交互。因此Servlet容器支持请求和相应所用的HTTP协议。Servlet应用程序体系结构如图1.6所示。图1.6Servlet应用程序体系结构图1.6说明客户端对Servlet的请求首先会被HTTP服务器接收,HTTP服务器将客户的HTTP请求提交Servlet容器,Servlet容器调用相应的Servlet,Servlet作出的响应传递到Servlet容器,并进而由HTTP服务器将响应传输给客户端。Web服务器提供静态内容并将所有客户端对Servlet作出的请求传递到Servlet容器。我们已经学习过Tomcat,它是一个小型的轻量级应用服务器,在中小型系统和并发用户不是很多的情况下被广泛应用,和IIS、Apache一样,具有处理HTML的功能(但处理静态HTML的能力不如Apache强),同时,它还是一个Servlet和JSP容器,开发和调试JSP、Servlet的首选。对于图1.6,Tomcat就是HTTP服务器和Servlet容器两个部分。1.4.2Servlet层次结构Servlet是实现javax.servlet.Servlet接口的对象。大多数Servlet通过从GenericServlet或HttpServlet类进行扩展来实现。ServletAPI包含于两个包中,即javax.servlet和javax.servlet.http。下边我们分别来介绍。javax.servlet接口ServletConfig定义了在Servlet初始化的过程中由Servlet容器传递给Servlet的配置信息对象ServletContext定义Servlet使用的方法以获取其容器的信息ServletRequest定义一个对象封装客户向Servlet的请求信息ServletResponse定义一个对象辅助Servlet将请求的响应信息发送给客户端Servlet定义所有Servlet必须实现的方法类ServletInputStream定义名为readLine()的方法,从客户端读取二进制数据ServletOutputStream向客户端发送二进制数据GenericServlet抽象类,定义一个通用的、独立于底层协议的Servletjavax.servlet.http接口HttpSession用于标识客户端并存储有关客户端的信息HttpSessionAttributeListener这个侦听接口用于获取会话的属性列表的改变的通知HttpServletRequest扩展ServletRequest接口,为HTTPServlet提供HTTP请求信息HttpServletResponse扩展ServletResponse接口,提供HTTP特定的发送响应的功能类HttpServlet扩展了GenericServlet的抽象类,用于扩展创建HttpServletCookie创建一个Cookie,用于存储Servlet发送给客户端的信息在这里,我们需要详细了解下HttpServletRequest获得参数名和参数值的方法。getParameter(Stringkey)返回一个字符串,获得name和key一样的表单控件的数据,如果有重复的name,则返回第一个的值。getParameterValues(Stringkey)返回一个字符串数组,获得name和key一样的表单控件的数据,但相同name的控件会有多个,如同名的多个checkbox等。getParameterMap()返回一个包含所有参数的Map,为key-String[]模式,即,key是表单控件的name,同时,为了防止有重复name的控件存在,每个name对应的值是一个字符串数组。getParameterNames()返回一个枚举类型值,返回所有表单中所有表看控件的name。图1.21.5Servlet的生命周期这一节我们来讲讲Servlet的生命周期,Servlet的生命周期如图1.1所示。图1.1Servlet的生命周期Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。Servlet的生命周期包含了下面4个阶段:加载和实例化Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。初始化在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。这样servlet的实例就可以把与容器相关的配置数据保存起来供以后使用,在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常,一旦抛出该异常,servlet就不再执行,而随后对它的调用会导致容器对它重新载入并再次运行此方法。请求处理Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。对于HttpServlet类,该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。当请求到来时,service()方法决定请求的类型(GET、POST、HEAD、OPTIONS、DELETE、PUT、TRACE),并把请求分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026未来动物城面试题及答案
- 2026乡村出纳面试题及答案
- (2026年)医疗器械产品技术咨询服务合同范本
- 2025-2026学年河南省信阳市光山县数学四年级第二学期期中监测模拟试题(含解析)
- 2025-2026学年河北省涞源县晶华学校三年级数学下学期期中考试模拟试题(含解析)
- 2025-2026学年河北省保定曲阳三下数学期中统考模拟试题含答案
- 襄阳市卫生健康委精神卫生领域工作人员专项招聘笔试真题2025
- 岳阳县国有企业招聘笔试真题2025
- 赤峰市红山区公益性岗位人员招聘笔试真题2025
- 2026-2027学年福建省三明市高三下学期第六次检测物理试卷(含答案解析)
- 腹腔镜肾上腺切除课件
- 乡村教育复兴与文化传承
- 脑卒中后吞咽障碍患者进食护理团标解读
- DB36-T 1378-2024 湿地保护修复技术规程
- 绿色食品 油菜生产技术规程
- 某水电站大坝施工组织设计
- 液压泵与液压马达的拆装与选用-齿轮泵的拆装
- 浙江吹打 新华出版社出版
- 四路彩灯设计
- GB/T 7725-2022房间空气调节器
- 历年中考历史开放性试题汇编
评论
0/150
提交评论