Java Web程序设计项目实战(微课版) 课件 项目六 Servlet技术_第1页
Java Web程序设计项目实战(微课版) 课件 项目六 Servlet技术_第2页
Java Web程序设计项目实战(微课版) 课件 项目六 Servlet技术_第3页
Java Web程序设计项目实战(微课版) 课件 项目六 Servlet技术_第4页
Java Web程序设计项目实战(微课版) 课件 项目六 Servlet技术_第5页
已阅读5页,还剩180页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目六Servlet技术

项目要

求本项目以Tomcat为例介绍javaweb技术如何基于Servlet工作,并进一步利用Servlet规范的三大高级特性(Filter、Listener、文件上传与下载)实现request、response对象的拦截修改,完成context、session、request事件的监听处理,并结合Commons-FileUpload组件实现文件上传与下载功能。

项目分

析要完成项目任务,至少需要具备两个基本条件:一是掌握Servlet及其工作原理,二是掌握Servlet规范的三大高级特性,该项目分3个任务,分别是实现并配置Servlet程序、应用HttpServletRequest和HttpServletResponse对象实现用户登录、应用Commons-FileUpload和Filter实现文件上传与下载。

项目目

标【知识目标】掌握Servlet的基本概念、特点和接口;掌握Servlet的配置和生命周期;掌握ServletConfig和ServletContext接口的使用;掌握HttpServletRequest对象,和HttpServletResponse对象;掌握Filter的映射与过滤器链、Listener的使用;掌握文件上传和下载流程。

项目目

标【能力目标】能熟练使用eclipse工具开发Servlet、Filter、Listener程序;能够熟练使用Filter对Request、response对象拦截,实现特定功能;能够熟练使用Commons-FileUpload组件实现文件的上传与下载;会使用Listener监听ServletContext、HttpSession、ServletRequest对象的相关事件。【素质目标】培养学生的团队合作意识,自主学习能力。

知识导

图任务一实现并配置Servlet程序--任务演示在本次学习任务中,我们将创建一个Servlet程序,并对其进行配置,从而使Servlet程序正确地运行在服务器中并处理请求信息,最终动态生成一个网页,在该网页显示“自主创新,中国软件从追赶到超越”,如图6-1所示。任务一实现并配置Servlet程序–知识准备了解Servlet特点理解Servlet生命周期熟悉Servlet接口认识Servlet掌握HttpServlet类配置Servlet1.认识ServletServlet是运行在Web服务器端的Java应用程序,用于处理客户端的Servlet请求,具有动态生成网页、实现与其它服务器资源的通信(如数据库)等功能。Servlet程序必须运行在Servlet容器中(如Tomcat、Jetty、Resin等),Servlet容器负责按照规则加载、运行Servlet程序。用户访问Servlet的流程如图6-2所示。客户端Servlet容器ServletHTTP请求HTTP请求调用servlet返回处理结果2.了解Servlet特点Servlet不仅具有Java语言的有点,还对web相关应用进行了封装。因此,在功能、性能、安全性等方面都十分优秀。Servlet的技术特点表现在以下五个方面:(1)功能强大:Servlet不仅可以调用JavaAPI中的对象及方法,还可以调用Servlet封装的ServletAPI编程接口。因此,Servlet在业务功能方面十分强大。(2)可移植:Servlet使用Java语言编写,而Java语言是跨平台的,因此Servlet可以运行到多个系统平台中。2.了解Servlet特点(3)性能高:Servlet只在第一次被请求时进行实例化,然后便常驻内存,以后的请求都由该实例进行处理,即每一个请求对应一个线程,而不是进程。(4)安全性高:Servlet不仅使用了Java的安全框架,还有Servlet容器提供的安全功能,因此,安全性非常高。(5)可扩展:由于Java语言是面向对象的编程语言,所以Servlet可以通过封装、继承等特性扩展实际的业务需要。3.理解Servlet生命周期Servlet是Java语言编写的应用程序,而Java语言中,所有对象都有生命周期。Servlet的生命周期总体分为3个阶段,按照先后顺序排列,分别是初始化阶段(只有1次)、运行阶段(重复执行)、销毁阶段(只有1次)。(1)初始化阶段当客户端向Servlet容器发出HTTP请求,指明要访问某个Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化,如建立数据库连接、获取配置信息等。注意,在Servlet的整个生命周期内,它的init()方法只被调用一次。3.理解Servlet生命周期此外,Servlet对象一旦创建就会驻留在内存中,等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。(2)运行阶段在运行阶段,Servlet容器会将客户端的HTTP请求封装成ServletRequest对象,并创建一个ServletResponse对象,该ServletResponse对象用于表示Servlet处理生成的响应结果。然后,Servlet容器会将创建的ServletRequest对象和ServletResponse对象作为参数,传递给Servlet程序的service()方法。由此,service()方法就可以从传递过来的ServletRequest对象参数中获取客户端的请求信息并进行处理,并通过传递过来的ServletResponse对象生成返回给客户端的响应结果。3.理解Servlet生命周期注意,在Servlet的生命周期内,它的service()方法会被反复调用执行,即每一次对于Servlet的访问请求,Servlet容器都会创建新的ServletRequest对象和ServletResponse对象作为参数,并调用执行一次Servlet的service()方法。(3)销毁阶段当Servlet所在的web应用程序被移除或者是服务器被关闭时,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。注意,在Servlet的整个生命周期中,destroy()方法也只被调用一次。4.熟悉Servlet接口SUN公司为开发人员提供了Servlet开发相关的一系列接口和类,其中最重要的是Javax.servlet.Servlet接口,所有Servlet类都必须实现这个接口,才能接收和响应用户的请求。在Servlet接口中定义了5个抽象方法,用于初始化、处理、销毁servlet,具体如表6-1所示。4.熟悉Servlet接口4.熟悉Servlet接口注意,表6-1中的init()、service()、destroy()方法都由Servlet容器来调用,而且Servlet容器会在Servlet生命周期的不同阶段分别调用上述3个方法,因此,我们可以通过上述3个方法表现Servlet的生命周期。5.掌握HttpServlet类SUN公司专门为Servlet接口提供了两个默认的接口实现类:GenericServlet和HttpServlet。GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,它并没有实现HTTP请求处理。而HttpServlet是GenericServlet的子类,它继承了GenericServlet的所有方法,并且为HTTP请求中的POST、GET等类型提供了具体的操作方法。因此,开发人员编写的Servlet类一般都继承自HttpServlet类,即在实际开发中使用的具体的Servlet对象就是HttpServlet对象。使用HttpServlet类的实例对象处理客户端的HTTP请求时,根据HTTP请求类型的不同涉及到了如表6-2所示的两个常用方法。5.掌握HttpServlet类6.配置Servlet对Servlet进行适当的配置,它才能正确运行并处理请求信息。Servlet的配置可以通过配置文件web.xml和使用@WebServlet注解两种方式实现。注意,如果多个Servlet都在web.xml文件中配置会非常繁琐,因此建议使用Servlet3.0之后提供的@WebServlet注解,简化Servlet配置,本章将重点讲解@WebServlet注解。项目部署时,容器会根据@WebServlet注解的属性配置将相应的类部署为Servlet,@WebServlet注解的常用属性如表6-3所示。6.配置Servlet6.配置Servlet注意,任何一个继承了HttpServlet类的子类都可以使用@WebServlet注解进行标注。如【例6-1-1】所示,TestServlet类继承了HttpServlet类,我们在该类的上方使用@WebServlet注解将其标注为一个Servlet,name属性指定了该Servlet的名字为TestServlet,urlPatterns属性指定了访问该Servlet的URL地址。注意,如果需要在@WebServlet注解中设置多个属性,属性之间用逗号隔开,如该例中的name属性和urlPatterns属性之间使用逗号间隔开了。6.配置Servlet【例6-1-1】配置Servlet@WebServlet(name="TestServlet",urlPatterns="/TestServlet")

publicclassTestServletextendsHttpServlet{

//处理GET方法请求的方法

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException{}

//处理POST方法请求的方法

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponse response)throwsServletException,IOException{}}。任务一实现并配置Servlet程序–任务实施任务要求:(1)使用eclipse创建一个Servlet程序。(2)使用@WebServlet注解对该Servlet程序进行配置。(3)请求访问该Servlet程序,动态生成一个网页,在该网页显示“自主创新,中国软件从追赶到超越”。任务一实现并配置Servlet程序–任务实施第一步:新建DynamicWebProject项目,项目名为chapter06任务一实现并配置Servlet程序–任务实施②点击“next”按钮,再单击下一步,并选择ApacheTomcatv8.0”,如图6-4所示。任务一实现并配置Servlet程序–任务实施第二步:新建Servlet程序①在chapter06项目中,打开JavaResource文件夹,然后右键点击“src”文件夹,选择“New”-“Servlet”,如图6-5所示。任务一实现并配置Servlet程序–任务实施②打开“CreateServlet”窗口,在窗口中输入Classname的值为“TestServlet”,如图6-6所示。③在图6-6中,点击“Finish”按钮,便会自动创建类名为“TestServlet”的Servlet类,它继承了HttpServlet类,并自动生成了名字为doGet()和doPost()的方法,分别用于处理GET请求和POST请求,如【例6-1-2】所示。任务一实现并配置Servlet程序–任务实施【例6-1-2】TestServlet类importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet*/@WebServlet("/TestServlet")publicclassTestServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;

/***@seeHttpServlet#HttpServlet()*/publicTestServlet(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。任务一实现并配置Servlet程序–任务实施第三步:配置Servlet程序在【例6-1-2】中,第10行代码@WebServlet("/TestServlet")将TestServlet类标注为Servlet程序,我们将该行代码改为:@WebServlet(name="TestServlet",urlPatterns="/TestServlet")其中,name属性设置了Servlet程序名为"TestServlet",urlPatterns属性设置了匹配Servlet的URL(即访问该Servlet的URL为/TestServlet),如【例6-1-3】所示。任务一实现并配置Servlet程序–任务实施【例6-1-3】修改@WebServlet("/TestServlet")后的TestServlet类importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet*/@WebServlet(name="TestServlet",urlPatterns="/TestServlet")publicclassTestServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任务一实现并配置Servlet程序–任务实施第四步:修改doGet()方法,实现网页内容的动态生成。在【例6-1-3】中,修改doGet()方法中的第27行代码如下:

response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();out.print("自主创新,中国软件从追赶到超越");修改结果,如【例6-1-4】所示。任务一实现并配置Servlet程序–任务实施【例6-1-4】修改doGet()方法后的TestServlet类importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet*/@WebServlet(name="TestServlet",urlPatterns="/TestServlet")publicclassTestServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub response.setContentType("text/html;charset=utf-8"); PrintWriterout=response.getWriter(); out.print("自主创新,中国软件从追赶到超越"); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任务一实现并配置Servlet程序–任务实施第五步:启动Tomcat服务器①在eclipse的主界面中,点击“Run”-“Run”,如图6-7所示。任务一实现并配置Servlet程序–任务实施②在弹出的如图6-8所示的“RunOnServer”窗口,点击“Finish”按钮,启动Tomcat服务器。Tomcat服务器启动成功之后,效果如图6-9所示。任务一实现并配置Servlet程序–任务实施第六步:访问Servlet在eclipse的主界面点击如图6-10所示的“OpenWebBrowser”按钮,进而打开如图6-11所示的浏览器窗口,在浏览器窗口输入Servlet的访问地址localhost:8080/chapter06/TestServlet,执行效果如图6-12所示。访问地址localhost:8080/chapter06/TestServlet中的localhost:8080/chapter06是web项目的访问地址,而/TestServlet则是注解@WebServlet(name="TestServlet",urlPatterns="/TestServlet")中的urlPatterns属性设置的访问该Servlet的URL地址信息。任务一实现并配置Servlet程序–任务实施任务一实现并配置Servlet程序–任务拓展1理解ServletConfig接口在上例中,我们只是配置了Servlet的名字及访问的URL地址,用于请求访问该Servlet,但Servlet在运行期间,经常要用到一些配置信息,如文件使用的编码等信息,这些信息我们都可以通过相应的属性,事先配置在@WebServlet注解中,但是如何在运行期间来获取并使用这些配置信息呢?我们可以通过ServletConfig实现。当Servlet容器(如Tomcat)初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,并通过调用init(ServletConfigconfig)方法将ServletConfig对象传递给Servlet实例。因此,在该Servlet的运行期间,它可以通过调用ServletConfig接口定义的相关方法来获取相应的配置信息。ServletConfig获取配置信息的方法如表6-4所示。任务一实现并配置Servlet程序–任务拓展注意,上表中的getInitParameter()方法是获取配置信息的常用方法,请务必掌握。此外,getServletContext()方法会获取ServletContext对象,关于ServletContext对象我们在后续有具体讲解。接下来,我们通过【例6-1-5】理解如何在运行期间使用getInitParameter()方法是获取配置信息。任务一实现并配置Servlet程序–任务拓展【例6-1-5】在运行期间使用getInitParameter()方法是获取配置信息importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.Servlet;importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet2*/@WebServlet(name="TestServlet2",urlPatterns="/TestServlet2", initParams={@WebInitParam(name="encoding",value="UTF-8")})publicclassTestServlet2extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/任务一实现并配置Servlet程序–任务拓展publicTestServlet2(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletConfigconfig=this.getServletConfig();//实例化ServletConfig对象,对象名为config Stringencode_Param=config.getInitParameter("encoding");//使用getInitParameter方法获取名字为encoding的参数对应的参数值

//输出得到的编码信息

PrintWriterout=response.getWriter(); out.print("encoding="+encode_Param);

} /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub doGet(request,response); }}任务一实现并配置Servlet程序–任务拓展在【例6-1-5】的第16行代码,我们在@WebServlet注解中使用WebInitParam属性设置参数名为encoding的参数的参数值为“UTF-8”,即设置文件的编码为“UTF-8”。然后,我们在第31行使用getServletConfig()方法获取ServletConfig对象,其对象名为config。接下来,在第32行我们通过对象名为config的ServletConfig对象调用getInitParameter()方法获取名字为encoding的参数的参数值,即获取文件编码。最后,我们输出获取到的文件编码信息,效果如图6-13所示。任务一实现并配置Servlet程序–任务拓展2理解ServletContext接口在一个Servlet容器(如Tomcat服务器)中,可能会同时运行多个网站(即多个web应用),如何来区分这些web应用呢?我们可以使用ServletContext实现。Servlet容器会为每一个web应用创建一个唯一的ServletContext对象,用于表示当前Web应用。ServletContext对象不仅封装了当前Web应用的所有信息,还能够实现多个Servlet之间数据的共享。(1)获取web应用的初始化信息在web.xml文件中可以配置整个网站(web应用)的初始化信息,如图6-25所示,在web.xml文件中配置了参数organizer用于表示网站所有机构,其参数值为ChongqingVocationalCityCollege。此外,还设置了参数address用于表示地址,其参数值为Chongqing。任务一实现并配置Servlet程序–任务拓展我们可以通过ServletContext接口的getInitParameterNames()和getInitParameter(Stringname)方法,分别获取上述参数名和参数值,代码如【例6-1-6】所示。任务一实现并配置Servlet程序–任务拓展【例6-1-6】通过ServletContext接口获取web应用的初始化信息importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Enumeration;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet3*/@WebServlet(name="TestServlet3",urlPatterns="/TestServlet3")publicclassTestServlet3extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet3(){super();//TODOAuto-generatedconstructorstub}

任务一实现并配置Servlet程序–任务拓展 /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletContextcontext=this.getServletContext();//获取ServletContext对象,对象名为context Enumeration<String>paramNames=context.getInitParameterNames(); //通过对象名为context的ServletContext对象调用getInitParameterNames()方法获取所有的初始化参数名,

//并将其保存到枚举对象paramNames Stringname=paramNames.nextElement();//nextElement()方法可以依次获取paramNames中的参数名字,每执行一次获取到一个参数名,

//并将当前参数名保存到name变量中

Stringvalue=context.getInitParameter(name); //通过对象名为context的ServletContext对象调用getInitParameter()方法获取name中的参数名所对应的的参数值

//输出获取到的参数名及其参数值

PrintWriterout=response.getWriter(); out.print(name+":"+value); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。任务一实现并配置Servlet程序–任务拓展其中,第29行调用getServletContext()方法获取ServletContext对象,对象名为context。第30行中对象名为context的ServletContext对象调用getInitParameterNames()方法获取所有的初始化参数名,并将其保存到枚举对象paramNames。第32行的nextElement()方法可以依次获取paramNames中的参数,每执行一次获取到一个参数,此处,我们得到的是address参数,参数名address被保存到到变量name中。第34行通过对象名为context的ServletContext对象调用getInitParameter()方法获取变量name中的参数名address所对应的参数值Chongqing,并保存到变量value中。执行效果如图6-15所示。任务一实现并配置Servlet程序–任务拓展(2)多个Servlet共享数据由于web应用有且只有一个ServletContext对象,而ServletContext对象的域属性又可以被所有Servlet访问,因此,可以通过ServletContext对象的域属性实现多个Servlet共享数据。ServletContext域属性的常用操作方法如表6-5所示。任务一实现并配置Servlet程序–任务拓展如【例6-1-7】所示,我们在名字为TestServlet4的Servlet程序的第31行,通过setAttribute()方法设置了ServletContext域属性data,其值为“Thisisatestdata”。接下来,我们在另一个名字为TestServlet5的Servlet程序中使用getAttibute()方法获取ServletContext对象的名字为data的域属性的值,如【例6-1-8】中的第31行代码所示,执行结果如图6-16所示,结果表明通过ServletContext对象的域属性可以实现多个Servlet共享数据。任务一实现并配置Servlet程序–任务拓展【例6-1-7】通过setAttribute()方法设置ServletContext域属性dataimportjava.io.IOException;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet4*/@WebServlet(name="TestServlet4",urlPatterns="/TestServlet4")publicclassTestServlet4extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet4(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */任务一实现并配置Servlet程序–任务拓展 protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletContextcontext=this.getServletContext();//获取ServletContext对象,对象名为contex context.setAttribute("data","Thisisatestdata");//通过名为context的ServletContext对象调用setAttribute()方法创建名字为data的域属性,

//其值为Thisisatestdata } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任务一实现并配置Servlet程序–任务拓展 【例6-1-8】使用getAttibute()方法获取ServletContext对象的data域属性值importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet5*/@WebServlet(name="TestServlet5",urlPatterns="/TestServlet5")publicclassTestServlet5extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;

/***@seeHttpServlet#HttpServlet()*/publicTestServlet5(){super();//TODOAuto-generatedconstructorstub}任务一实现并配置Servlet程序–任务拓展 /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub ServletContextcontext=this.getServletContext();//获取ServletContext对象,对象名为contex Stringdata=(String)context.getAttribute("data");//getAttibute()方法获取ServletContext对象的名字为data的域属性的值

//并将其保存到变量data中

//输出获取到的属性值

PrintWriterout=response.getWriter(); out.print(data); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}任务二应用HttpServletRequest和HttpServletResponse对象实现用户登录--任务演示2022年6月1日,光明网刊发《<网络安全法>五周年:网络安全为人民网络安全靠人民》,文中提到“作为我国网络安全领域的基础性法律,《网络安全法》是我国网络空间法治建设的重要里程碑”。对于动态网站来说,用户的账号、密码验证登录是验证用户身份,保障网络安全的基本措施。本次任务我们将使用HttpServletRequest和HttpServletResponse对象实现用户的验证登录,如图6-17、6-18所示。任务二应用HttpServletRequest和HttpServletResponse对象实现用户登录--任务演示任务二应用HttpServletRequest和HttpServletResponse对象实现用户登录—知识准备掌握HttpServletResponse对象掌握HttpServletRequest对象实现请求重定向1掌握HttpServletRequest对象HttpServletRequest接口继承自ServletRequest接口,用于封装客户端的HTTP请求信息,例如客户端将用户名、密码传送过来,请求访问某个Servlet进行验证登录,其请求信息(用户名、密码等)就会被封装成HttpServletRequest对象。不同的请求信息被封装到HttpServletRequest对象中,又如何获取呢?我们可以通过HttpServletRequest对象的不同种类的方法进行获取。(1)获取请求行信息的相关方法当客户端发送HTTP请求信息访问调用某个Servlet程序时,请求信息的请求行中包含了请求方法、请求资源名、请求路径等信息。为获取这些请求行信息,我们可以使用如表6-6所示的相关获取请求行信息的方法。1掌握HttpServletRequest对象1掌握HttpServletRequest对象为了便于理解各种获取请求行相关信息的方法,TestServlet6演示了如何使用上述方法,如【例6-2-1】所示,运行结果如图6-19所示。【例6-2-1】请求行信息获取相关方法的应用示例importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet6*/@WebServlet(name="TestServlet6",urlPatterns="/TestServlet6")publicclassTestServlet6extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/

1掌握HttpServletRequest对象publicTestServlet6(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub PrintWriterout=response.getWriter(); //获取请求行的相关信息

out.println("getMethod:"+request.getMethod()+"<br/>"); out.println("getRequestURI:"+request.getRequestURI()+"<br/>"); out.println("getQueryString:"+request.getQueryString()+"<br/>"); out.println("getProtocol:"+request.getProtocol()+"<br/>"); out.println("getContextPath:"+request.getContextPath()+"<br/>"); out.println("getPathInfo:"+request.getPathInfo()+"<br/>"); out.println("getPathTranslated:"+request.getPathTranslated()+"<br/>"); out.println("getServletPath:"+request.getServletPath()+"<br/>"); out.println("getRemoteAddr:"+request.getRemoteAddr()+"<br/>"); out.println("getRemoteHost:"+request.getRemoteHost()+"<br/>"); out.println("getRemotePort:"+request.getRemotePort()+"<br/>"); out.println("getLocalAddr:"+request.getLocalAddr()+"<br/>"); out.println("getLocalName:"+request.getLocalName()+"<br/>");

1掌握HttpServletRequest对象 out.println("getLocalPort:"+request.getLocalPort()+"<br/>"); out.println("getServerName:"+request.getServerName()+"<br/>"); out.println("getServerPort:"+request.getServerPort()+"<br/>"); out.println("getScheme:"+request.getScheme()+"<br/>"); out.println("getRequestURL:"+request.getRequestURL()+"<br/>"); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。1掌握HttpServletRequest对象(2)获取请求头的相关方法当客户端请求访问某个Servlet时,我们会通过请求头向服务器传送附加信息,如客户端可以接收的数据类型、语言等。那么我们如何从HttpServletRequest对象中获取这些请求头信息呢?可以通过如表6-7所示的获取HTTP请求头信息的相关方法实现。1掌握HttpServletRequest对象为了更好地掌握这些方法,我们在TestServlet7中以getHeader()方法为例,演示了如何使用getHeader()方法获取客户端浏览器所支持语言的请求头信息,如【例6-2-2】所示,运行结果如图6-20所示。1掌握HttpServletRequest对象【例6-2-2】使用getHeader()方法获取客户端浏览器支持语言的请求头信息importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***ServletimplementationclassTestServlet7*/@WebServlet(name="TestServlet7",urlPatterns="/TestServlet7")publicclassTestServlet7extendsHttpServlet{ privatestaticfinallongserialVersionUID=1L;/***@seeHttpServlet#HttpServlet()*/publicTestServlet7(){super();//TODOAuto-generatedconstructorstub} /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponseresponse) */1掌握HttpServletRequest对象 protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub Stringaccept_Language=request.getHeader("accept-language");//通过对象名为request的HttpServletRequest对象调用getHeader方法,

//获取字段accept-language的值,即客户端浏览器所支持的语言

PrintWriterout=response.getWriter(); out.print(accept_Language); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponseresponse) */ protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //TODOAuto-generatedmethodstub }}。1掌握HttpServletRequest对象(3)获取请求参数在动态网站的实际运行过程中,经常会收到用户提交的各种表单数据,如登录时用户提交的用户名、密码等。HttpServletRequest对象提供了一系列用于获取表单中的请求参数的方法,如表6-8所示。1掌握HttpServletRequest对象1掌握HttpServletRequest对象在实际应用中,getParameter()和getParameterValues()是最基本的获取请求参数的方法,其中,getParameter()方法用于获取某个指定名称的参数值(例如提交的用户名、密码等),而getParameterValues()方法用于获取多个同名的参数,例如提交的用户爱好信息,因为用户可能有多个爱好,在实际的页面上我们会用多个同名的复选框供用户选择,所以像这种多个同名参数的获取就必须使用getParameterValues()方法。如图6-21所示的用户注册页面,其对应的网页源代码如【例6-2-3】所示,在【例6-2-3】中,我们可以看到用户名、密码的参数名(即文本框、密码框的name属性)是唯一的,而爱好的参数名(即复选框的name属性)有4个一样的(即多个同名参数),因此用户名、密码请求参数的获取使用getParameter()方法,而爱好请求参数的获取就需要使用getParameterValues()方法。注意,在【例6-2-3】的第9行的action属性中明确指明了该表单的相关注册信息将会提交给TestServlet8进行处理,TestServlet8的代码如【例6-2-4】所示。1掌握HttpServletRequest对象1掌握HttpServletRequest对象【例6-2-3】用户注册页面源代码<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>用户注册页面</title></head>

<body><formaction="/chapter06/TestServlet8"method="POST">

用户名:<inputtype="text"name="username"><br/>

码:<inputtype="password"name="password"><br/>

爱好:

<inputtype="checkbox"name="hobby"value="basketball">篮球

<inputtype="checkbox"name="hobby"value="football">足球

<inputtype="checkbox"name="hobby"value="volleyball">排球

<inputtype="checkbox"name="hobby"value="badminton">羽毛球<br/> <inputtype="submit"value="提交"> </form></

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论