版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目四Servlet技术4.1Servlet基础
随着Web应用业务需求的增多,动态Web页面的开发变得越来越重要。很多公司都提供了开发动态Web页面的相关技术,其中比较常见的有ASP(ActiveServerPages,活动服务器页面)、PHP(PageHypertextPreprocessor,页面超文本预处理器)、JSP和Servlet等。在基于Java的动态Web页面开发方面,Sun公司提供了Servlet和JSP两种技术。4.1.1Servlet简介4.1Servlet基础4.1.2Servlet概述Servlet的工作流程1.Servlet是什么Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写。与Java程序不同的是,Servlet封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持。4.1Servlet基础4.1.2Servlet概述功能强大:Servlet采用Java语言编写,可以调用JavaAPI中的对象及方法。还可以对HTTP请求进行相应的处理(如处理提交数据、会话跟踪、读取和设置HTTP头信息等)。
1
2
可移植:Servlet是跨平台的。所谓跨平台,是指程序的运行不依赖于特定的操作系统。Servlet可以运行在多种系统(如常用的Windows、Linux和UNIX等)中运行。
3
性能优良:Servlet对象在Servlet容器启动时加载,或在首次请求时初始化。当Servlet对象第一次被请求时,Servlet容器将Servlet对象实例化,实例化后的Servlet对象驻留于内存中。
4
安全性高:Servlet使用了Java的安全框架,同时Servlet容器还可以为Servlet提供额外的安全保障,因此Servlet的安全性是非常高的。
5
可扩展:Java语言是面向对象的编程语言,Servlet由Java语言编写,所以它也具有面向对象的优点。2.Servlet的特点4.1Servlet基础4.1.3Servlet接口表Servlet接口的方法方法功能描述voidinit(ServletConfigconfig)Servlet实例化后,Servlet容器调用该方法完成初始化工作(仅调用一次)ServletConfiggetServletConfig()用于获取Servlet对象的配置信息,返回ServletConfig对象StringgetServletInfo()返回一个字符串,其中包含关于Servlet的信息(例如作者、版本和版权等信息)voidservice(ServletRequestrequest,ServletResponseresponse)负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调用此方法。voiddestroy()负责释放Servlet对象占用的资源。当服务器关闭或者Servlet对象被移除时,容器会调用此方法销毁Servlet对象表HttpServlet的类常用方法方法功能描述protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)用于处理GET类型的HTTP请求protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)用于处理POST类型的HTTP请求protectedvoiddoPut(HttpServletRequestreq,HttpServletResponseresp)用于处理PUT类型的HTTP请求4.2Servlet开发入门4.2.1实现Servlet程序1.新建Web项目step01打开IDEA,选择主页的“CreateNewProject”选项,如图所示。step02进入新建项目的界面,如图所示。选择主页的“CreateNewProject”选项新建项目的界面4.2Servlet开发入门step03在新建项目的界面中,选择侧边栏中的“Java”选项,勾选“WebApplication(4.0)”复选框。然后单击“Next”按钮进入填写项目信息的界面。step04在填写项目信息的界面中,“Projectname”输入框用于指定Web项目的名称,”Projectlocation”输入框用于指定Web项目的根目录。例如,采用默认的目录,将“servletDemo01”作为Web项目的名称。如图所示填写完成之后,单击“Finish”按钮,进入开发界面,如图所示。填写项目信息的界面开发界面4.2Servlet开发入门4.2.1实现Servlet程序2.添加Servlet包step01新建好Web项目后,接下来需要在项目中添加Tomcat的servlet-api.jar,选择开发左上角的“File”,然后选择“ProjectStructure”选项,如图所示,进入“ProjectStructure”界面。step02在“ProjectStructure”界面中,“Libraries”→“+”→“Java”,如图所示,进入“SelectLibraryFiles”界面。选择“ProjectStructure”选项选择“Java”step03在“SelectLibraryFiles”界面中,选择项目所在的目录“servletDemo01”后单击“OK”按钮,如上图所示,进入“ChooseCategoriesofSelectedFiles”界面。选择“servletDemo01”后单击“OK”按钮4.2Servlet开发入门step04在“ChooseCategoriesofSelectedFiles”界面中,选择“Classes”选项后单击“OK”按钮,如图所示,进入“ChooseModules”界面,在“ChooseModules”界面中直接单击”OK”按钮,此时项目servletDemo01就被加载到IDEA中了。step05单击标记的“+”按钮,查找apache-tomcat-8.5.98文件夹中的lib文件夹下的servlet-api.jar,选择后单击“OK”按钮将其添加到servletDemo01项目中,如图所示。选择项目类型界面选择servlet-api.jar选项后单击“OK”按钮4.2Servlet开发入门step06添加成功后,在servletDemo01项目中可以查看servlet-api.jar,如图所示。查看servlet-api.jar3.创建Servlet类step01下面开始创建Servlet类,右键单击“servletDemo01”项目下的“src”目录,在弹出的快捷菜单中选择“New”→“Servlet”选项,如右上图所示。选择“Servlet”选项step02弹出“NewServlet”对话框,如图所示。“NewServlet”对话框4.2Servlet开发入门importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;@WebServlet(urlPatterns="/DemoServlet01")publicclassDemoServlet01extendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}}案例创建的Servlet类的代码(资源位置:项目4\源文件\DemoServlet01.java)4.2Servlet开发入门importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;@WebServlet(urlPatterns="/DemoServlet01")publicclassDemoServlet01extendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();out.print("HelloServlet");}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doPost(request,response);}}本段代码为在doPost()和doGet()方法中添加代码后的Servlet类。4.2Servlet开发入门4.在IDEA中启动Servletstep01在IDEA中配置Tomcat,单击“AddConfiguration”按钮如图所示。step02在打开的“Run/DebugConfigurations”对话框单击左上角的“+”按钮,在“AddNewConfiguration”选项卡中,选择“TomcatServer”→“Local”,如图所示。单击AddConfiguration按钮选择“Local”4.2Servlet开发入门step04在图4.16所示的对话框中,“Name”输入框中的内容表示Tomcat名称,“HTTPport”输入框中的内容代表启动端口号。单击“Deployment”,然后单击“+”按钮,选择“Artifact”选项,如图所示。step05添加刚刚创建的项目servletDoemo01,单击“Apply”按钮完成Tomcat的配置,如图所示。选择“Artifact”选项单击“Apply”按钮4.2Servlet开发入门step06单击启动按钮,启动项目,如图所示。step07项目启动成功后,使用浏览器访问地址“http://localhost:8080/DemoServlet01”,浏览器显示的页面如图所示。启动项目浏览器显示的页面4.2.2Servlet的配置1.使用Web.xml配置Servlet在Web.xml文件中,通过<servlet>标签对Servlet进行配置,在<servlet>标签中可以包含若干个子标签。如表所示。4.2Servlet开发入门如果要把Servlet映射到URL,需要使用<servlet-mapping>标签进行映射。在该标签中使用<servlet-name>子标签指定要映射的Servlet的名称,名称要和在<servlet>标签中<servlet-name>子标签指定的相同;使用<url-pattern>子标签映射URL,地址前必须加“/”,否则无法访问,具体代码如下。<servlet><servlet-name>HelloServlet</servlet-name><servlet-class>Web.controller.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/servlet/HelloServlet</url-pattern></servlet-mapping>标签名类型描述<servlet-name>String指定该Servlet的名称,一般与Servlet类名相同,要求唯一<servlet-class>String指定该Servlet类的位置,包括包名与类名<description>String指定该Servlet的描述信息<display-name>String指定该Servlet的显示名表<servlet>标签中的子标签4.2Servlet开发入门2.使用@WebServlet注解配置Servlet4.2.2Servlet的配置属性声明功能描述Stringname指定Servlet的名称,等效于<servlet-name>标签。如果没有显式指定,则该Servlet的名称为类的全限定名String[]value该属性等效于urlPatterns属性,两者不能同时使用String[]urlPatterns指定一组Servlet的URL匹配模式,等效于<url-pattern>标签intloadOnStartup指定Servlet的加载顺序,等效于<load-on-startup>标签WebInitParam[]initParams指定一组Servlet初始化参数,等效于<init-param>标签BooleanasyncSupported声明Servlet是否支持异步操作模式,等效于<async-supported>标签Stringdescription指定Servlet的描述信息,等效于<description>标签StringdisplayName指定Servlet的显示名,通常用于IDE或管理工具中,等效于<display-name>标签表@WebServlet注解的常用属性4.2Servlet开发入门下面使用@WebServlet注解标注HelloServlet类。@WebServlet(name="HelloServlet",urlPatterns="/HelloServlet") publicclassHelloServletextendsHttpServlet{//处理GET请求的方法publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}//处理POST请求的方法protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}}4.2Servlet开发入门4.2.3Servlet的生命周期当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器会首先解析请求,检查内存中是否已经存在该Servlet对象。如果存在,则直接使用该Servlet对象;如果不存在,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化。运行阶段Servlet生命周期中较为重要的阶段。在这个阶段,Servlet容器会为客户端HTTP请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。当服务器关闭或Web应用被移出容器时,Servlet随着Web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期内,destroy()方法也只被调用一次。010203初始化阶段运行阶段销毁阶段4.2Servlet开发入门下面通过一个案例演示Servlet生命周期中相关方法的执行,具体代码如下。importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;@WebServlet(urlPatterns="/DemoServlet02")publicclassDemoServlet02extendsGenericServlet{publicvoidinit(ServletConfigconfig)throwsServletException{System.out.println("initmethodiscalled");}publicvoidservice(ServletRequestrequest,ServletResponseresponse)throwsServletException{System.out.println("HelloWorld");}publicvoiddestroy(){System.out.println("destroymethodiscalled");}}案例Servlet生命周期中相关方法的执行(资源位置:项目4\源文件\DemoServlet02.java)4.2Servlet开发入门在IDEA中启动项目DemoServlet01,使用浏览器访问地址“http://localhost:8080/DemoServlet02”,IDEA控制台的输出结果如图所示。访问地址一次对IDEA控制台的输出结果访问地址多次时IDEA控制台的输出结果4.2Servlet开发入门如果想将DemoServlet02移除,可以在IDEA中停止DemoServlet项目。Servlet容器会调用DemoServlet02的destroy()方法,在IDEA控制台中输出“destroymethodiscalled”,如图所示。停止项目后IDEA控制台的输出结果4.3ServletConfig和ServletContext4.3.1ServletConfig接口方法说明功能描述StringgetInitParameter(Stringname)根据初始化参数名返回对应的初始化参数值EnumerationgetInitParameterNames()返回一个Enumeration对象,其中包含所有的初始化参数名ServletConfig
getServletConfig()返回一个代表当前Web应用的ServletConfig对象StringgetServletName()返回Servlet的名称表ServletConfig接口定义的获取配置信息的方法importjavax.servlet.*;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;案例调用ServletConfig的getInitParameter()方法(资源位置:项目4\源文件\DemoServlet03.java)4.3ServletConfig和ServletContext@WebServlet(name="DemoServlet03",urlPatterns="/DemoServlet03",initParams={@WebInitParam(name="age",value="23"),})publicclassDemoServlet03extendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();ServletConfigconfig=this.getServletConfig();Stringparam=config.getInitParameter("age");out.println("age="+param);}protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doGet(request,response);}}页面会显示调用getInitParameter()方法获取的配置信息,如图所示。停止项目后IDEA控制台的输出结果4.3ServletConfig和ServletContext1.配置Web应用的初始化参数4.3.2ServletContext接口在Web.xml文件中,可以配置Servlet的初始化参数,也可以配置整个Web应用的初始化信息。Web应用初始化参数的配置方式如下所示。<context-param><param-name>参数名</param-name><param-value>参数值</param-value></context-param><context-param><param-name>参数名</param-name><param-value>参数值</param-value></context-param>4.3ServletConfig和ServletContext案例使用ServletContext接口获取Web应用(资源位置:项目4\源文件\Web.xml)下面通过一个案例演示如何使用ServletContext接口获取Web应用的初始化参数。在DemoServlet项目的Web.xml文件中配置Web应用程序的初始化参数,具体代码如下。<?xmlversion="1.0"encoding="UTF-8"?><Web-appxmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/Web-app_4_0.xsd"version="4.0"><context-param><param-name>姓名</param-name><param-value>张三</param-value></context-param><context-param><param-name>联系方式</param-name><param-value>92416@</param-value></context-param></Web-app>4.3ServletConfig和ServletContext案例使用ServletContext接口获取Web应用程序的初始化信息(资源位置:项目4\源文件\DemoServlet04.java)importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Enumeration;@WebServlet(name="DemoServlet04",urlPatterns="/DemoServlet04",initParams=publicclassDemoServlet04extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();ServletContextcontext=this.getServletContext();Enumeration<String>paramNames=context.getInitParameterNames();out.println("所有的paramName和paramValue如下:<br/>");while(paramNames.hasMoreElements()){Stringname=paramNames.nextElement();Stringvalue=context.getInitParameter(name);out.println(name+":"+value);out.println("<br/>");}}}使用ServletContext接口获取的Web应用程序的初始化信息4.3ServletConfig和ServletContext2.实现多个Servlet对象共享数据4.3.2ServletContext接口方法说明功能描述EnumerationgetAttributeNames()返回一个Enumeration对象,该对象包含所有存放在ServletContext中的域属性名ObjectgetAttribute(Stringname)根据参数指定的域属性名返回对应的域属性值voidremoveAttribute(Stringname)从ServletContext中删除匹配的域属性voidsetAttribute(Stringname,Objectobj)设置ServletContext的域属性,其中name是域属性名,obj是域属性值案例ServletContext中setAttribute()方法的使用(资源位置:项目4\源文件\DemoServlet05.java)下面通过一个案例来演示表4.6中部分方法的使用。在DemoServlet项目的src目录中创建DemoServlet05类。在该类中调用ServletContext接口中的setAttribute()方法设置属性值,具体代码如下。importjavax.servlet.ServletContext;importjavax.servlet.ServletException;ServletContext接口中与域属性相关的方法4.3ServletConfig和ServletContextimportjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet(name="DemoServlet05",urlPatterns="/DemoServlet05")publicclassDemoServlet05extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ServletContextcontext=this.getServletContext();//通过setAttribute()方法设置属性值context.setAttribute("data","调用setAttribute()方法,添加data值");}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doGet(request,response);}}4.3ServletConfig和ServletContext案例ServletContext中getAttribute()方法的使用(资源位置:项目4\源文件\DemoServlet06.java)importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;@WebServlet(name="DemoServlet06",urlPatterns="/DemoServlet06")publicclassDemoServlet06extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();ServletContextcontext=this.getServletContext();//通过getAttribute()方法获取属性值Stringdata=(String)context.getAttribute("data");out.println(data);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{this.doGet(request,response);}}ServletContext的属性值4.3ServletConfig和ServletContext3.读取资源文件4.3.2ServletContext接口方法说明功能描述SetgetResourcePaths(Stringpath)返回一个Set集合,集合中包含资源目录中子目录和文件的路径名称。参数path必须以“/”开始,指定匹配资源的部分路径StringgetRealPath(Stringpath)返回资源文件在服务器文件系统中的真实路径(文件的绝对路径)。参数path代表资源文件的虚拟路径,它应该以“/”开始,“/”表示当前Web应用的根目录,如果Servlet容器不能将虚拟路径转换为真实路径,则返回nullURLgetResource(Stringpath)返回映射到某个资源文件的URL对象。参数path必须以“/”开始,“/”表示当前Web应用的根目录InputStreamgetResourceAsStream(Stringpath)返回映射到某个资源文件的InputStream对象。参数path应遵循的规则和getResource()方法中参数path应遵循的完全一致ServletContext接口中与资源文件相关的方法4.3ServletConfig和ServletContext创建一个资源文件Name=ZSAddress=HEBEI案例使用ServletContext对象读取资源文件(资源位置:项目4\源文件\DemoServlet07.java)importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.InputStream;importjava.io.PrintWriter;importjava.util.Properties;案例使用ServletContext对象读取资源文件(资源位置:项目4\源文件\resource.properties)在项目中右击src目录,在弹出的快捷菜单中选择“New”→“File”选项,新建一个名称为perties的资源文件。该资源文件的具体内容如下:编写读取perties资源文件的Servlet4.3ServletConfig和ServletContext@WebServlet(name="DemoServlet07",urlPatterns="/DemoServlet07")publicclassDemoServlet07extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");ServletContextcontext=this.getServletContext();PrintWriterout=response.getWriter();InputStreamin=context.getResourceAsStream("/Web-INF/classes/perties");Propertiespros=newProperties();pros.load(in);out.println("Name="+pros.getProperty("Name")+"<br/>");out.println("Address="+pros.getProperty("Address")+"<br/>");}}在IDEA中启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/DemoServlet07”,并按“Enter”键来访问而面。页面会显示资源文件的内容,如图所示。资源文件的内容4.4HttpServletResponse对象4.4.1发送状态码的相关方法setStatus(intstatus)方法用于设置HTTP响应的状态码,并生成响应状态行。用于发送表示错误信息的状态码。例如,404状态码表示服务器找不到客户端请求的资源。sendError(intcode,Stringmessage)方法除了设置状态码,还会向客户端返回错误信息。010203setStatus(intstatus)方法sendError(intsc)方法sendError(intcode,Stringmessage)方法4.4HttpServletResponse对象4.4.2设置响应头的相关方法方法功能描述voidaddHeader(Stringname,Stringvalue)这两个方法都是用来设置HTTP的响应头的其中,参数name用于指定响应头字段的名称,参数value用于指定响应头的值。不同的是,addHeader()方法可以增加同名的响应头,而setHeader()方法则会覆盖同名的头voidsetHeader(Stringname,Stringvalue)voidaddIntHeader(Stringname,intvalue)这两个方法专门用于设置包含整数值的响应头。避免了调用addHeader()与setHeader()方法时,需要将int类型的值转换为String类型的值的麻烦voidsetIntHeader(Stringname,intvalue)voidsetContentLength(intlen)该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP来说,该方法可以设置Content-Length响应头字段的值voidsetContentType(Stringtype)该方法用于设置Servlet输出内容的MIME类型,对于HTTP来说,该方法可以设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是JPEG格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法还可以设置字符编码,如text/html;charset=UTF-8表HttpServletResponse接口中设置响应头的相关方法4.4HttpServletResponse对象4.4.2设置响应头的相关方法方法功能描述voidsetLocale(Localeloc)该方法用于区域设置(如语言、货币格式、日期格式)voidsetCharacterEncoding(Stringcharset)该方法用于设置输出内容使用的字符编码,对HTTP协议来说,就是设置Content-Type头字段中的字符编码部分。续表4.4HttpServletResponse对象1.getOutputStream()方法4.4.3发送响应消息体的相关方法getOutputStream()方法所获取的字节输出流对象为ServletOutputStream类型。下面通过一个案例演示getOutputStream()方法的使用。在DemoServlet项目的src目录中创建DemoServlet08类,该类的具体代码如下。importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.OutputStream;@WebServlet(name="DemoServlet08",urlPatterns="/DemoServlet08")publicclassDemoServlet08extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringdata="MyDemoServlet08";OutputStreamout=response.getOutputStream();//获取字节输出流对象out.write(data.getBytes());//输出信息}}案例调用getOutputStream()输出信息(资源位置:项目4\源文件\DemoServlet08.java)调用getOutputStream()方法输出的信息4.4HttpServletResponse对象2.getWriter()方法getWriter()方法所获取的字符输出流对象为PrintWriter类型。下面通过一个案例演示getWriter()方法的使用。在DemoServlet项目的src目录中创建DemoServlet09类,该类的具体代码如下。importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;@WebServlet(name="DemoServlet09",urlPatterns="/DemoServlet09")publicclassDemoServlet09extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringdata="MyDemoServlet09";//获取字符输出流对象PrintWriterprint=response.getWriter();print.write(data);//输出信息}}案例调用getWriter()输出信息(资源位置:项目4\源文件\DemoServlet09.java)调用GetWriter()方法输出的信息4.5HttpServletRequest对象4.5.1获取请求行信息的相关方法方法功能描述StringgetMethod()该方法用于获取HTTP请求行中的请求方式(如GET、POST等)StringgetRequestURI()该方法用于获取请求行中资源名称部分,即位于资源路径的主机和端口号之后、参数部分之前的数据StringgetQueryString()该方法用于获取请求行中的参数部分,也就是资源路径中“?”以后的所有内容StringgetProtocol()该方法用于获取请求行中的协议名和版本,例如HTTP/1.0或HTTP/1.1StringgetContextPath()该方法用于获取请求URL中属于Web应用程序的路径,这个路径以“/”开头,表示相对于整个Web站点的根目录,路径结尾不含“/”。如果请求URL属于Web站点的根目录,那么返回结果为空字符串("")StringgetServletPath()该方法用于获取Servlet的名称或Servlet所映射的路径StringgetRemoteAddr()该方法用于获取请求客户端的IP地址,其格式类似于“”表HttpServletRequest接口中获取请求行信息的相关方法4.5HttpServletRequest对象方法功能描述StringgetRemoteHost()该方法用于获取请求客户端的完整主机名,其格式类似于“”。需要注意的是,如果无法解析出客户端的完整主机名,该方法将会返回客户端的IP地址intgetRemotePort()该方法用于获取请求客户端网络连接的端口号StringgetLocalAddr()该方法用于获取Web服务器上接收当前请求网络连接的IP地址StringgetLocalName()该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名intgetLocalPort()该方法用于获取Web服务器上接收当前网络连接的端口号StringgetServerName()该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段中的主机名部分intgetServerPort()该方法用于获取当前请求所连接的服务器端口号,即HTTP请求消息中Host头字段中的端口号部分StringgetScheme()该方法用于获取请求的协议名(例如HTTP、HTTPS或FTP)StringBuffergetRequestURL()该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于开发人员对结果进行修改续表4.5HttpServletRequest对象下面通过一个案例演示这些方法的使用。在DemoServlet项目的src目录中创建DemoServlet10类,该类的具体代码如下。importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;@WebServlet(name="DemoServlet10",urlPatterns="/DemoServlet10")publicclassDemoServlet10extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");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/>");案例调用HttpServletRequest接口中的方法获取请求行信息(资源位置:项目4\源文件\DemoServlet10.java)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/>");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/>");}}4.5HttpServletRequest对象在IDEA中启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/DemoServlet10”,并按“Enter”键来访问页面。页面会显示调用HttpServletRequest接口中的方法获取的请求行消息如图所示。调用HttpServletRequest接口中的方法获取的请求行消息4.5HttpServletRequest对象4.5.2获取请求头的相关方法方法声明功能描述StringgetHeader(Stringname)该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值EnumerationgetHeaders(Stringname)该方法返回一个Enumeration对象,该对象由请求消息中出现的、具有指定名称的所有头字段值组成。在多数情况下,具有指定名称的头字段在请求消息中只出现一次,在少数情况下会出现多次EnumerationgetHeaderNames()该方法用于获取一个包含所有请求头字段的Enumeration对象intgetIntHeader(Stringname)该方法用于获取指定名称的头字段,并且将其值的类型转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为−1;如果获取到的头字段的值的类型不能转为int类型,将抛出NumberFormatException异常longgetDateHeader(Stringname)该方法用于获取指定头字段的值,并将其按GMT格式转换成一个代表日期/时间的长整数,这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间StringgetContentType()该方法用于获取Content-Type头字段的值,值的类型为String类型intgetContentLength()该方法用于获取Content-Length头字段的值,值的类型为int类型StringgetCharacterEncoding()该方法用于返回请求消息的实体内容的字符编码,通常是从Content-Type头字段中进行提取,值的类型为String类型表HttpServletRequest接口中获取请求头的相关方法4.5HttpServletRequest对象下面通过一个案例演示其中部分方法的使用。在DemoServlet项目的src目录中创建DemoServlet11类,该类的具体代码如下。importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Enumeration;@WebServlet(name="DemoServlet11",urlPatterns="/DemoServlet11")publicclassDemoServlet11extendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();EnumerationheaderNames=request.getHeaderNames();//使用循环遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段while(headerNames.hasMoreElements()){StringheaderName=(String)headerNames.nextElement();out.print(headerName+":"+request.getHeader(headerName)+"<br/>");}}}案例调用HttpServletRequest接口中的方法获取请求头信息(资源位置:项目4\源文件\DemoServlet11.java)4.5HttpServletRequest对象在IDEA中启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/DemoServlet11”,并按“Enter”键访问页面。页面会显示调用HttpServletRequest接口中的方法获取的请求头信息,如图所示。调用HttpServletRequest接口中的方法获取请求头信息4.5HttpServletRequest对象4.5.3请求转发Servlet之间可以相互转发,利用转发可以很容易地把一项任务按模块进行划分。例如,使用一个Servlet实现用户的登录,然后转发到另外一个Servlet实现用户资料的修改。请求转发要通过RequestDispatcher接口的实例对象实现。HttpServletRequest接口提供了getRequestDispatcher()方法用于获取RequestDispatcher对象,getRequestDispatcher()方法的具体语法格式如下。RequestDispatchergetRequestDispatcher(Stringpath)获取到RequestDispatcher对象后,如果当前Web资源无法处理请求,RequestDispatcher接口提供了forward()方法,将当前请求传递给其他Web资源,以便对该请求进行处理,并将响应结果返回客户端。forward()方法的具体语法格式如下。void_forward(ServletRequestrequest,ServletResponseresponse)下面通过一个案例演示上述两个方法的使用。在DemoServlet项目的src目录中创建DemoServlet12类,该类的具体代码如下。4.5HttpServletRequest对象案例
getRequestDispatcher()方法和forward()方法的使用(资源位置:项目4\源文件\DemoServlet12.java)importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet(name="DemoServlet12",urlPatterns="/DemoServlet12")publicclassDemoServlet12exten
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论