




已阅读5页,还剩123页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/11/23,1,服务器端开发技术Servlet,2019/11/23,2,服务器端开发技术Servlet,第一节.Servlet概述第二节.Servlet的开发环境及程序结构第三节.Servlet基础第四节.会话跟踪第五节.JDBC访问数据库,2019/11/23,3,第一节Servlet概述,1.Servlet的作用Servlet技术是使用Java技术开发Web应用的基础,后面讲述的JSP也是在它的基础上发展起来的。Servlet技术支持创建动态的Web页面,即页面内容根据用户输入或其他变量数据而改变的Web页面(动态页面),这就极大地增强了应用开发的能力。Servlet是一个基于Java语言实现的服务器端组件,它可以被用来扩充Web服务器的功能。Servlet可以简单地看作一个Java类。最终该Java类运行在一个服务器端的Servlet容器内,通过容器提供会话管理和对象生命周期管理。,2019/11/23,4,2.Servlet的优点Servlet效率更高、更容易编程、功能更强、更安全和具有良好的可移植性,因而成为主流的动态网站技术。Servlet最大的优势在于它的高性能,Servlet采用了和CGI不同的运行方式。其次,在默认情况下,Servlet以单实例多线程的方式工作。Servlet继承了Java的所有优势,包括易升级以及平台无关性,在进行程序编写的时候可以调用Java所提供的大量的API。,2019/11/23,5,3.Servlet的基本工作原理一个Servlet在服务器端由称为Servelt容器(也有称为servlet引擎)的程序来解释执行,可以把Servlet理解成Server上的applet,Servlet在被调用后会被动态地载入到容器由容器解释执行,这样通过Servlet包含的功能就扩展了Web服务器的功能。,2019/11/23,6,Web服务器和Servlet容器可以是两个独立的松耦合的应用程序(图表5-2),也可以是紧密集成的一个应用程序(图表5-3)。从图表5-2和图表5-3显示了一个典型的基于Servlet和JSP(一种Servlet的变体)的Web应用程序,包括若干Servlet或者JSP文件,也可能包含许多HTML文件和图片等其他资源文件。客户端对于Servet的访问先到达WebServer,如果访问的是HTML文件和图片这样的静态资源文件,WebServer会直接处理并给出响应,而如果访问的是Servlet,那么通过Servlet容器去执行Servet并给出响应。浏览器或者其他应用程序一般通过HTTP协议访问WebServer。,2019/11/23,7,2019/11/23,8,第五章.服务器端开发技术Servlet,第一节.Servlet概述第二节.Servlet的开发环境及程序结构第三节.Servlet基础第四节.会话跟踪第五节.JDBC访问数据库,2019/11/23,9,第二节Servlet的开发环境及程序结构,1.开发环境安装及测试(1)开发环境概述进行Servlet开发所需要的基本环境是JSDK(JavaServletDevelopmentKit)、一个支持Servlet的Web服务器、集成开发工具。,2019/11/23,10,在本书中采用了JBuilder进行编辑、编译和调试Servlet。JSDK包含了编译Servlet应用程序所需要的Java类库以及相关的文档。常用的支持Servet的容器有Resin、ApacheTomcat、IBMWebsphere、BEAWebLogicServer等等。本教材面向的是学校的教学,在选择开发软件环境的时候必须考虑学校和学生的实际条件。因为Resin对资源要求不高,配置比较容易,学校实验室和学生本人都有条件使用Resin。因此,在本书关于Servle和JSP的开发中,都将采用Resin作为Web服务器。其下载Resin的网址如下:,2019/11/23,11,(2)Resin的安装安装Resin的步骤如下:安装JDK在安装Resin之前要先安装JDK(建议版本在1.4以上)。拷贝Resin目录安装完JDK之后如果要安装Resin,只需要把Resin文件夹(下载后的Resin压缩文件展开后的文件夹)拷贝到机器的特定目录下就可以了,不需要其他配置操作。启动RESIN拷贝完毕后,要启动RESIN直接执行httpd.exe即可。测试启动后,即可测试是否工作正常,方法是在浏览器里面输入http:/机器名:8080即可(如果是本机也可以输入http:/localhost:8080)。,2019/11/23,12,Resin安装完毕后的目录结构大致如下图:,2019/11/23,13,从上图可以看出,Resin安装在d:resin-2.1.16文件夹下,版本号是2.1.16。其中在子文件夹bin下的httpd.exe是可执行程序,子文件夹conf目录下存放配置文件。建议把所开发的应用程序存放在路径为Webapps文件夹下。另外注意,在lib子文件夹下有很多jar文件,其中jsdk23.jar是执行servlet时需要到的包,这个文件里面包含与开发Servlet有关的包和很多类,我们在Jbulider或者其他开发工具中要指定使用这个包。,2019/11/23,14,(3)Resin环境测试安装好Resin后,我们可以启动Resin服务器,方式是执行httpd.exe即可,启动后屏幕显示结果如下图,仔细确认屏幕,如果其上没有出错提示,那么表示Resin已经启动。启动后屏幕显示结果如下:,2019/11/23,15,为验证Resin是否工作正常,我们需要打开浏览器测试一下,在地址栏输入http:/localhost:8080,如果屏幕出现类似下面内容,表示Resin工作正常。,2019/11/23,16,2.配置Web应用一般一个Web应用发布时都会有一个自己发布区,这个发布区往往对应一个物理的目录,所有发布的html文件、图片文件、样式表、Servlet类、JSP文件和其他一些描述性文件等都要放到这个目录及其子目录下。(1)Resin的配置文件Resin的配置文件是resin.conf,位于安装目录的conf目录下(比如D:resin-2.1.16conf)。resin.conf是一个XML格式的配置文件,这个配置文件由很多标记组成。标记对标记对,2019/11/23,17,标记对标记是用来配置Resin所使用的资源,一般用来声明管理资源,如数据库驱动程序等。,2019/11/23,18,标记对在标记对中的配置和resin的JavaWeb服务器有关。找到,在标记对里的id属性和app-dir子标记非常重要。id属性表示该应用的Web路径。如,表示该应用在Web上访问的时候应该用http:/机器名/shopping/来访问。app-dir属性表示该应用的实际路径。如:d:resindoctest表示该应用在d:resindoctest目录下。,2019/11/23,19,(2)配置自己的Web应用假设我们有一个welcome.html的网页、一个counter.jsp的JSP文件和一个类名为RequestInfoExample.class的Servlet,现在要发布它们到一个支持Java的Web服务器上,访问的URL分别为:http:/localhost:8080/myweb/welcome.htmlhttp:/localhost:8080/myweb/counter.jsp,2019/11/23,20,修改Resin的配置文件为了做到这点,需要修改Resin的配置文件resin.conf,在该配置文件中的中需要增加一个和其他并列的标记,指定id=/myweb,同时在的子标记中指定D:resin-2.1.16myweb,其他标记和值暂时忽略不变。该配置文件内容如下:D:resin-2.1.16myweb修改配置文件后,一定记住要重新启动Resin,以便使新的修改被重新加载从而生效。,2019/11/23,21,HTML网页的发布及测试使用记事本或者网页编辑工具编辑如下html代码并保存到前面配置的D:resin-2.1.16myweb目录下,文件名为welcome.html。welcome.html内容如下:Welcome,haveaniceday.打开浏览器,在地址栏输入http:/localhost:8080/myweb/welcome.html,就可以看到网页的执行结果。,2019/11/23,22,JSP的发布及测试同样,使用记事本或者网页编辑工具编辑如下JSP代码并保存到前面配置的D:resin-2.1.16myweb目录下,文件名为counter.jsp。counter.jsp,其内容如下:Counter欢迎,访问次数:打开浏览器,在地址栏输入http:/localhost:8080/myweb/counter.jsp,就可以看到JSP的执行结果。多刷新几次或者关闭浏览器重新访问看看结果会如何。,2019/11/23,23,3.第一个Servlet(1)编写及编译ServletJavaServletAPI是一个标准的Java扩展程序包,和Servlet相关的有javax.servlet和javax.servlet.http两个Java包。对于想开发基于客户自定义协议的开发者,应该使用javax.servlet包中的类与接口;对于仅利用HTTP协议与客户端进行交互的开发者,则只需要使用javax.servlet.http包中的类与接口进行开发即可。,2019/11/23,24,Servlet的结构下面一个例子RequestInfoExample.java打印前端请求参数,代码如下:importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;publicclassRequestInfoExampleextendsHttpServletpublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletExceptionresponse.setContentType(text/html);PrintWriterout=response.getWriter();out.println();out.println();out.println();out.println(RequestInformationExample);out.println();out.println();out.println(RequestInformationExample);out.println(Method:+request.getMethod();out.println(RequestURI:+request.getRequestURI();out.println(Protocol:+request.getProtocol();out.println(PathInfo:+request.getPathInfo();out.println(RemoteAddress:+request.getRemoteAddr();out.println();out.println();publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletExceptiondoGet(request,response);,2019/11/23,25,有关该servlet程序结构说明一般基于HTTP协议的servlet要引入javax.servlet和javax.servlet.http包RequestInfoExample从类HttpServlet派生,HttpServlet为基于HTTP协议的Servlet提供了基本的支持;HttpServletRequest对象包含了客户端请求的信息,可以通过该参数取得客户端的一些信息(例如IP地址、浏览器类型等)以及HTTP请求类型(例如GET、HEAD、POST、PUT等);HttpServletResponse对象用于完成Servlet与客户端的交互,通过调用HttpServletResponse.getWriter方法取得向客户端进行输出的输出流(PrintWriter的对象),向客户端发送HTML页面。编写了doGet方法,对于HTMLPOST请求,调用Servlet的doPost()方法。,2019/11/23,26,编译Servlet(RequestInfoExample.java)利用Jbuilder对Servlet代码进行编译,在编译的时候一定记住要在Jbuilder中设置JSDK的路径,否则会找不到Servlet编译需要的类。编译后会生成RequestInfoExample.class类文件,该文件要发布到Resin服务器的myweb应用中,以便客户端调用。,2019/11/23,27,(2)配置Resin以调用ServletServlet编译后要发布到Resin服务器的指定目录下,然后通过URL去调用,就象调用HTML文件和JSP文件一样。Servlet的发布稍微麻烦一些,主要有两个工作:把类编译后的类文件拷贝到特定目录如果要作为myweb应用的一部分发布,那么需要拷贝RequestInfoExample.class到D:resin-2.1.16mywebWEB-INFclasses目录下。如果没有该目录,手工创建即可。指定要发布的Servlet需要在Resin配置文件resin.conf里指定要发布的Servlet,包括要让客户端调用的Servlet,调用的映射地址,并且重新启动Resin。一般Resin的配置文件发生改动,或者发布的Servlet类有变化时都需要重新启动Resin。,2019/11/23,28,为了调用RequestInfoExampleServlet,resin配置文件还针对myweb应用增加下面黑体字的内容:D:resin-2.1.16myweb,2019/11/23,29,这段代码中的servlet这一段声明了你要调用的Servlet的Java类是RequestInfoExample(servlet-class=RequestInfoExample,不带.class扩展名);同时指定它的逻辑名字是RequestInfoName(servlet-name=RequestInfoName),逻辑名字和类名不同(当然也可以相同);servlet-mapping声明逻辑名字为RequestInfoName的Servet访问时候可以通过地址/RequestInfo访问,地址/RequestInfo和Servelt的类名可以相同也可以不同。在上述配置下,可以使用如下URL去访问该Servlet:http:/localhost:8080/myweb/RequestInfo(访问方式1),2019/11/23,30,可以看出配置文件中的url-pattern=/RequestInfo和共同决定了Servlet的调用URL(/myweb/RequestInfo)。使用配置可以让URL中访问Servlet时候的路径和Servlet类的名字无关,这样即使Servlet的类的名字修改了,对外访问的URL也可以不变,这样带来了很大的灵活性。当然,访问的时候,也可以直接通过类名或者逻辑名字访问Servlet,访问URL如下:(访问方式2)http:/localhost:8080/myweb/servlet/RequestInfoExample(访问方式3)http:/localhost:8080/myweb/servlet/RequestInfoName,2019/11/23,31,第五章.服务器端开发技术Servlet,第一节.Servlet概述第二节.Servlet的开发环境及程序结构第三节.Servlet基础第四节.会话跟踪第五节.JDBC访问数据库,2019/11/23,32,第三节Servlet基础,5.3.1Servlet的生命周期一个Javaservlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。所有的JavaServlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。Servlet引擎是Web服务器按照ServletAPI定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并提供一个运行Servlet的容器。理解并掌握Servlet的生命周期极为重要,只有理解了Servlet的生命周期里涉及的方法、方法的作用和方法的调用时机,才能掌握Servlet编程。javax.servlet.Servlet接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法(下图)。,2019/11/23,33,1、Servlet的解析、载入和初始化Web容器(含Servlet引擎)在启动时或者在一个Servlet被请求时载入一个Servlet并对Servlet进行初始化,在这一过程中,Servlet可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。,2019/11/23,34,2、Servlet处理请求Servlet被初始化之后,它可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,而Servlet的响应被描述成一个ServletResponse对象。当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。,2019/11/23,35,3、Servlet的卸载当Servlet引擎决定卸载一个Servlet时(如引擎被关闭等),这个引擎必须允许Servlet释放正在使用的资源并存储有关资料。引擎会调用Servlet的destroy()方法。Servlet引擎可以自由的在任何时候使用或清除一个Servlet。卸载一个Servlet之前,Servlet引擎会等待所有的service()方法完成或超时结束。一个Servlet被卸载时,引擎将不会给Servlet发送任何请求。引擎必须释放Servlet并完成无用存储单元的收集。,2019/11/23,36,5.3.2Servlet相关接口和类Servlet相关的接口和类共有3个:Servlet接口,GenericServlet类和HttpServlet类。Servlet接口定义了所有的Servlet的基本功能,作为一个接口,其他的Servlet(GenericServlet和HttpServlet)必须实现其中的方法。GenericServlet抽象类实现了Servlet接口,定义了一个通用的,与协议无关的Servlet。HttpServlet定义了一个抽象类,它继承了GenericServlet抽象类,支持基于HTTP协议的Servlet,一般自写的Servlet都是为了处理HTTP请求的,所以应当继承HttpServlet类。,2019/11/23,37,1、Servlet接口Servlet接口定义了所有的Servlet的基本功能,以及生命周期等方法。其方法见下面的内容:,2019/11/23,38,publicvoidinit(ServletConfigconfig)throwsServletException;Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。在调用service方法之前,init方法必须成功退出。publicvoidservice(ServletRequestrequest,ServletResponseresponse)throwsServletException,IOException;Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前,Servlet引擎能够封锁未决的请求。在一个Servlet对象被卸载后,直到一个新的Servelt被初始化,Servlet引擎不能调用这个方法。,2019/11/23,39,publicvoiddestroy();当一个Servlet被从服务中去除时,Servlet引擎调用这个方法。在这个对象的service方法所有线程未全部退出或者没被引擎认为发生超时操作时,destroy方法不能被用。publicServletConfiggetServletConfig();返回一个ServletConfig对象,作为一个Servlet的开发者,你应该通过init方法存储ServletConfig对象以便这个方法能返回这个对象。GenericServlet在执行这个接口时,已经这样做了。publicStringgetServletInfo();允许Servlet向主机的Servlet运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如HTML,XML等)。,2019/11/23,40,2、GenericServlet类GenericServlet类是最基本的类之一。程序员要编写Servlet应用程序,一般要继承GenericServlet类或它的子类HttpServlet类。它提供了一个简单的方案来执行有关Servlet生命周期的方法以及在初始化时对ServletConfig对象和ServletContext对象进行说明。该类包含的方法如下:,2019/11/23,41,init等生命周期方法的作用和前面介绍的Servlet接口类似,注意以下两个方法在和Servlet容器交互时会使用。publicServletConfiggetServletConfig()返回一个通过这个类的init方法产生ServletConfig对象的说明。publicServletContextgetServletContext()它将会调用ServletConfig对象的同名的方法。,2019/11/23,42,3、HttpServlet类HttpServlet是从GenericServlet继承而来,因此它具有GenericServlet类似的方法和对象,HttpServlet是使用Servlet编程直接用到的类,它支持HTTP的post和get等方法。具体方法如下:,2019/11/23,43,init()方法的使用在Servlet的生命期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。service()方法使用service()方法是Servlet的核心。每当一个客户请求一个HttpServlet对象,该对象的service()方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已经实现了service()方法,该方法会根据请求调用与HTTP请求的方法相应的doXXX功能。destroy()方法destroy()方法仅执行一次,即在服务器停止且卸装Servlet时执行该方法。典型的,将Servlet作为服务器进程的一部分来关闭。缺省的destroy()方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果Servlet在运行时会累计统计数据,则可以编写一个destroy()方法,该方法用于在未装入Servlet时将统计数字保存在文件中。另一个示例是关闭数据库连接。,2019/11/23,44,GetServletConfig()方法GetServletConfig()方法返回一个ServletConfig对象,该对象用来返回初始化参数和ServletContext。ServletContext接口提供有关servlet的环境信息。GetServletInfo()方法GetServletInfo()方法是一个可选的方法,它提供有关servlet的信息,如作者、版本、版权。,2019/11/23,45,4、使用HttpServlet类进行Servlet开发创建一个HTTPServlet,通常涉及下列四个步骤:扩展HttpServlet抽象类。重载适当的方法。如覆盖(或称为重写)service()方法或者doGet()和doPost()方法。获取信息如果有HTTP请求信息的话,获取该信息。用请求对象(HttpServletRequest的对象,见后面HttpServletRequest的说明)来检索HTML表单所提交的数据或URL上的查询字符串。“请求”对象含有特定的方法以检索客户机提供的信息。生成HTTP响应。用响应对象(HttpServletResponse的对象,见后面的HttpServletResponse的说明)生成响应,并将它返回到发出请求的客户机上。,2019/11/23,46,一个servlet样例(ServletSample.java)如下:importjava.io.*;importjava.util.*;importjavax.servlet.*;importjavax.servlet.http.*;/第一步:扩展HttpServlet抽象类。publicclassServletSampleextendsHttpServlet/第二步:重写service方法publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionSystem.out.println(in);/调试用,判断是否进入该函数StringmyName=;/第三步:获取HTTP请求信息myName=request.getParameter(myName);if(myName=)|(myName=null)myName=guest;/第四步:生成HTTP响应。PrintWriterout=response.getWriter();response.setContentType(text/html;charset=GBK);out.println(测试例子);out.println();out.println(这是一个Servlet测试例子);out.println(+myName+你好,这是一个仅给出HTML响应的Servlet例子.);out.println(+请输入http:/localhost:8080/myweb/servlet/ServletSample?myName=John);out.println();System.out.println(htmlok);/调试用,判断是否前面语句正常结束out.flush();,2019/11/23,47,上述ServletSample类继承了HttpServlet抽象类,同时它覆盖了父类的service()方法。在重写的service()方法中,获取HTTP请求中的一个任选的参数(myName)。然后设置设定响应的内容的类型,并从响应对象(response)获取PrintWriter对象(out),然后使用PrintWriter的print()和println()方法给请求的客户端程序响应一个HTML格式的内容。将Servlet的类ServletSample发按照前面介绍的技术来发布到myweb应用中,需要调用Servlet或Web应用程序,可以使用下列任一种方法:由URL调用、在标记中调用。,2019/11/23,48,URL调用Servlet()在发布Servlet的Resin服务器上打开浏览器,输入如下URLhttp:/localhost:8080/myweb/servlet/ServletSample?myName=John如果在其他机器上,上述URL的localhost可以换成发布Servlet的Resin服务器的主机名。在标记中指定Servlet可以在标记中调用Servlet。HTML格式使用户能在Web页面(即从浏览器)上输入数据,并向Servlet提交数据。例如:ZhangJunAdministrator,2019/11/23,49,5.3.3请求响应类及接口当一个servlet接收来自客户端的调用请求(通过service,doXXX方法),它接收两个对象:一个是ServletRequest和ServletResponse。ServletRequest类概括从客户端到服务器之间的联系。ServletResponse类概括从servlet返回客户端的联系,用于Servlet向客户发送响应。HttpServletRequest接口继承了ServletRequest接口,他可以让servlet获取更多的HTTP协议特性数据。HttpServletResponse接口继承了ServletResponse接口,它为Servlet返回HTTP回应给客户端提供了支持。,2019/11/23,50,四个接口里定义的方法,2019/11/23,51,1、ServletRequestpublicStringgetParameter(Stringname)以String对象返回指定的参数的值,如果这个参数不存在返回空值。publicStringgetParameterValues(Stringname);通过String对象的数组返回指定参数的值,如果这个参数不存在,该方法返回一个空值。publicEnumerationgetParameterNames()返回所有参数名的String对象列表,如果没有输入参数,该方法返回一个空值。publicvoidsetAttribute(Stringname,Objectobject)在请求中添加一个属性,这个属性可以被其他可以访问这个请求对象的对象使用。publicObjectgetAttribute(Stringname)返回请求中指定属性的值,如果这个属性不存在,就返回一个空值。publicEnumerationgetAttributeNames()返回包含在这个请求中的所有属性名的列表。,2019/11/23,52,2、HttpServletRequest该接口继承了ServletRequest接口,在ServletRequest接口的方法基础上,需要进一步掌握以下2个方法:publicCookiegetCookies()返回一个数组,该数组包含这个请求中当前的所有Cookie。如果这个请求中没有Cookie,返回一个空数组。publicHttpSessiongetSession()publicHttpSessiongetSession(booleancreate)返回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数,那么在没有session与这个请求关联的情况下,将会新建一个session。getCookies和getSession方法分别用于支持Cookie和Session,在后面将详细介绍它们的使用。,2019/11/23,53,3、ServletResponsepublicPrintWritergetWriterthrowsIOException这个方法返回一个PringWriter对象用来记录格式化的响应实体。publicvoidsetContentType(Stringtype)这个方法用来设定响应的content类型。publicStringgetCharacterEncoding()返回MIME实体的字符编码。在HTTP协议中,这个信息被通过Accept-Charset传送到Servlet引擎。publicServletOutputStreamgetOutputStream()throwsIOException返回一个记录二进制的响应数据的输出流。publicvoidsetContentLength(intlength)设置响应的内容的长度,这个方法会覆盖以前对内容长度的设定。为了保证成功地设定响应头的内容长度,在响应被提交到输出流之前必须调用这个方法。,2019/11/23,54,4、HttpServletResponseHttpServletResponse描述一个返回到客户端的HTTP回应。通过该接口可以利用HTTP协议规定的头信息。publicvoidaddCookie(Cookiecookie)在响应中增加一个指定的Cookie。可多次调用该方法以定义多个Cookie。为了设置适当的头域,该方法应该在响应被提交之前调用。publicvoidsendRedirect(Stringlocation)throwsIOException;使用给定的路径,给客户端发出一个临时转向的响应。给定的路径必须是绝对URL。,2019/11/23,55,5、Servlet综合示例要求达到的功能:用户在界面上输入的姓名(文本框)和选择要购买的商品(多选按钮)后点击提交按钮,提交给后台Servlet处理Servlet对用户的点击的商品的价格给出响应,响应的内容为显示该用户的名字,同时显示用户购买的商品以及商品总价假设页面上显示的商品包括MP3,DV,Radio,Pen,这4种商品的价钱在Servlet里面用变量维护。,2019/11/23,56,HTML页面:要完成这样的功能,考虑使用一个HTML页面(commodity.html)完成商品选择和提交。HTML文件里面包含一个Form,Form里面包含一个文本框,同时包括多选按钮来显示已有4种商品供用户选择。页面外观参考如下:,2019/11/23,57,Servlet:另外,一个Servlet(CommodityServlet)接收Form提交的请求并进行处理,在该Servlet中获取用户输入的姓名,同时获取选择的商品,通过商品名查找该商品的价格,然后给用户响应,响应内容及格式参考下图。,2019/11/23,58,commodity.html:名字商品如下:MP3DV收音机钢笔注意commodity.html提交的两个参数为name和goods,其中goods可能会同时提交多个值。,2019/11/23,59,CommodityServlet.java:importjava.io.*;importjava.util.*;importjavax.servlet.*;importjavax.servlet.http.*;/第一步:扩展HttpServlet抽象类。publicclassCommodityServletextendsHttpServlet/第二步:重写service方法publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionStringuserName=;StringinputCommodity=null;/用户提交的商品数组doubletotalPrice=0;Stringcommidty=null;/现有的商品数组doubleprice=null;/现有的商品对应的价格commidty=newString4;price=newdouble4;commidty0=MP3;price0=245;commidty1=DV;price1=1225;commidty2=Radio;price2=48;commidty3=Pen;price3=120;PrintWriterout=response.getWriter();/第三步:获取HTTP请求信息userName=request.getParameter(name);inputCommodity=request.getParameterValues(goods);if(userName=)|(userName=null)userName=guest;/第四步:生成HTTP响应。response.setContentType(text/html;charset=GBK);out.println(商品汇总);out.println();out.println(姓名:+userName);if(inputCommodity=null)/如果没有选择商品就提示并结束方法执行out.println(请回去选择商品.);return;out.println(购买的商品如下:);,2019/11/23,60,for(inti=0;i+inputCommodityi);for(intj=0;j总价为+totalPrice);out.println();out.flush();,2019/11/23,61,6、汉字乱码处理经常在访问一些JSP或者Servlet的程序时,在浏览器一端会发现如下问题:汉字都成了?;浏览器中看到的Servlet页面中的汉字都成了乱码;JAVA应用程序界面中的汉字都成了方块;Jsp/Servlet页面无法显示GBK汉字;Jsp/Servlet不能接收form提交的汉字;JSP/Servlet数据库读写无法获得正确的内容。,2019/11/23,62,要明白这些问题的原因,需要了解一些编码知识。英文字符一般是以一个字节来表示的,最常用的编码方法是ASCII。但一个字节最多只能表示128个字符(最高位没有使用),而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节最多可以表示64K个字符。我们经常碰到的编码方式有GB2312、GBK、BIG5、UNICODE等。Java编程语言默认的编码方式是UNICODE,而我们通常使用的数据库及文件都是基于GB2312编码的。为此,在Java编程过程中,向网页输出中文字符串的时候(如用out.println(string),string是含中文的字符串),必须作UNICODE到GBK的转换。通过合理设置请求和响应的字符集可以解决乱码问题。,2019/11/23,63,下面通过一个例子来掌握中文的处理。importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassChineseProcessextendsHttpServletpublicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionStringmyName=null;PrintWriterout=response.getWriter();/从HTTP请求的头信息中获取客户端的语言设置StringclientLanguage=request.getHeader(Accept-Language);System.out.println(clientLanguage=+clientLanguage);/简体中文浏览器if(clientLanguage.equals(zh-cn)request.setCharacterEncoding(GBK);response.setContentType(text/html;charset=GBK);/繁体中文浏览器elseif(clientLanguage.equals(zh-tw)request.setCharacterEncoding(BIG5);response.setContentType(text/html;charset=BIG5);,2019/11/23,64,elseif(clientLanguage.equals(jp)request.setCharacterEncoding(SJIS);response.setContentType(text/html;charset=SJIS);/缺省认为是英文浏览器elserequest.setCharacterEncoding(ISO-8859-1);response.setContentType(text/html;charset=ISO-8859-1);myName=request.getParameter(name);if(myName.equals()|(myName=null)myName=成吉思汗;System.out.println(nmyName=+myName);out.println(中文例子);out.println();out.println(简单的中文(例子);out.println(收到请求name为+myName);,2019/11/23,65,在Servlet里读取请求和给出响应的时候,一般要先从HTTP请求的头信息中获取客户端的语言设置(request.getHeader(“Accept-Language”),然后根据客户端不同语言设置去设置请求对象request的字符编码(request.setCharacterEncoding(“GBK”))以及响应对象response的的内容类型中的字符集(response.setContentType(“text/html;charset=GBK”))。然后在浏览器输入URL为http:/localhost:8080/myweb/servlet/ChineseProcess?name=张三,可以看到浏览器返回结果没有乱码。,2019/11/23,66,第五章.服务器端开发技术Servlet,第一节.Servlet概述
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年专科医院感染性疾病区消毒与日常保洁服务全面合同
- 2025年度城市文化广场特色文创产品展览合作协议
- 2025年度艺术品拍卖会资金安全保障合同
- 2025年度互联网数据中心安全风险评估及加固实施合同
- 2025年先进设备共享及绿色排放标准达成合作协议
- 2025年数字印刷设备技术引进与知识产权授权合同
- 2025年度文化创意产业园区运营承包合作协议
- 2025年LED显示屏行业应用技术研发与授权合同
- 2025年绿色环保真石漆墙面翻新工程承包合同
- 2025年离婚后子女教育及医疗费用分担补充协议
- 一线员工执行力培训内容
- 幼教拍摄培训
- 船舶公司内务管理制度
- 体检院内感染管理制度
- 护理职业素养课件
- 2025年云南中考数学试卷真题解读及复习备考指导
- 数字身份认证伦理-洞察及研究
- 七年级道德与法治第九课增强安全意识
- 乡村振兴培训试题及答案
- 冻伤急救护理
- 跨境电商代运营合同协议
评论
0/150
提交评论