Java Web开发技术 课件 3.5 ServletRequest和ServletResponse_第1页
Java Web开发技术 课件 3.5 ServletRequest和ServletResponse_第2页
Java Web开发技术 课件 3.5 ServletRequest和ServletResponse_第3页
Java Web开发技术 课件 3.5 ServletRequest和ServletResponse_第4页
Java Web开发技术 课件 3.5 ServletRequest和ServletResponse_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

JavaWeb开发技术3.5ServletRequest和ServletResponse1

本讲围绕ServletRequest和ServletResponse接口展开,讲解如何通过HttpServletRequest获取HTTP请求的请求行、请求头、表单数据,利用其属性传递数据及实现请求转发;同时介绍HttpServletResponse设置响应状态码、头字段、消息体及请求重定向的方法,通过案例演示接口核心功能的实际应用。主要内容3.5.1ServletRequest接口ServletRequest接口用于访问Servlet容器接收到的HTTP请求的信息。HttpServletRequest接口继承自ServletRequest接口。HttpServletRequest专门用于封装HTTP请求消息,该接口在ServletRequest接口的基础上增加了许多HTTP特定的方法,以提供更多的HTTP请求和响应相关的信息。ServletRequest接口3.5.1ServletRequest接口从HttpServletRequest获取请求行信息方法说明描述StringgetMethod()该方法用于获取HTTP请求方式(如GET、POST等)。StringgetRequestURI()该方法用于获取请求行中的资源名称部分,即位于URL的主机和端口之后,参数部分之前的部分。StringgetQueryString()该方法用于获取请求行中的参数部分,也就是URL中“?”以后的所有内容StringgetProtocol()该方法用于获取请求行中的协议和版本StringgetContextPath()返回当前Servlet所在的应用的名字(上下文)。对于默认(ROOT)上下文中的Servlet,此方法返回空字符串""。StringgetServletPath()该方法用于获取Servlet所映射的路径。StringgetRemoteAddr()该方法用于获取客户端的IP地址。StringgetRemoteHost()该方法用于获取请求客户端的完整主机名,其格式类似于。需要注意的是,如果无法解析出客户机的完整主机名,那么该方法将会返回客户端的P地址intgetRemotePort()该方法用于获取请求客户端网络连接的端口号StringgetLocalAddr()该方法用于获取Web服务器上接收当前请求网络连接的IP地址StringgetLocalName()该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名intgetLocalPort()该方法用于获取Web服务器上接收当前网络连接的端口号StringgetServerName()该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分intgetServerPort()该方法用于获取当前请求所连接的服务器端口号,即HTTP请求消息中Host头字段所对应的端口号部分StringgetScheme该方法用于获取请求的协议名,如:http、ftp和等StringBuffergetRequestURL()该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返同的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改HTTP请求的请求行中包含请求方法、请求资源名、请求路径等信息,HttpServletRequest接口定义了一系列获取请求行信息的方法,如表3-8。表3-8HttpServletRequest获取请求行信息的方法3.5.1ServletRequest接口从HttpServletRequest获取请求行信息@WebServlet(name="ServletRequestLine",value="/ServletRequestLine")publicclassServletRequestLineextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();out.println("请求方式:"+request.getMethod()+"<br/>");out.println("资源名称部分:"+request.getRequestURI()+"<br/>");out.println("参数部分:"+request.getQueryString()+"<br/>");out.println("协议和版本:"+request.getProtocol()+"<br/>");out.println("应用的名字:"+request.getContextPath()+"<br/>");out.println("所映射的路径:"+request.getServletPath()+"<br/>");out.println("客户端的IP地址:"+request.getRemoteAddr()+"<br/>");out.println("客户端的完整主机名:"+request.getRemoteHost()+"<br/>");out.println("客户端网络连接的端口号:"+request.getRemotePort()+"<br/>");out.println("接收当前请求网络连接的IP地址:"+request.getLocalAddr()+"<br/>");out.println("接收当前网络连接IP所对应的主机名:"+request.getLocalName()+"<br/>");out.println("接收当前网络连接的端口号:"+request.getLocalPort()+"<br/>");out.println("获取当前请求所指向的主机名:"+request.getServerName()+"<br/>");out.println("获取当前请求所连接的服务器端口号:"+request.getServerPort()+"<br/>");out.println("获取请求的协议名:"+request.getScheme()+"<br/>");out.println("获取客户端发出请求时的完整URL:"+request.getRequestURL()+"<br/>");}}了解HttpServletRequest接口用于获取请求行信息的方法以后,下面通过一个案例演示如何通过HttpServletRequest接口获取请求行信息。在ch03目录中新建ServletRequest目录,并在其中编写ServletRequestLine类,这个Servlet类中调用了HttpServletRequest接口中的获取请求行信息的方法,ServletRequestLine类代码如下。3.5.1ServletRequest接口从HttpServletRequest获取请求行信息在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ServletRequestLine,显示效果如图3-8所示。图3-8ServletRequestLine的运行结果3.5.1ServletRequest接口从HttpServletRequest获取请求头信息方法说明描述StringgetHeader(Stringname)该方法用于获取一个指定头字段的值。如果请求消息中包含多个指定名称的头字段,则该方法返回其中第一个头字段的值。EnumerationgetHeaders(Stringname)该方法返回指定头字段的所有值的枚举集合,在多数情况下,一个头字段名在请求消息中只出现一次,但有时可能会出现多次。EnumerationgetHeaderNames()该方法返回请求头中所有头字段的枚举集合。StringgetContentType()该方法用于获取Content-Type头字段的值intgetContentLength()该方法用于获取Content-Length头字段的值StringgetCharacterEncoding()该方法用于返回请求消息的字符集编码

。当浏览器发送请求时,需要通过请求头向服务器传递一些附加信息,例如客户端可以接收的数据类型、压缩方式、语言等。为了获取请求头中的信息,HttpServletRequest接口定义了一系列用于获取HTTP请求头字段的方法,如表3-9所示。表3-9HttpServletRequest获取请求头信息的方法3.5.1ServletRequest接口从HttpServletRequest获取请求头信息@WebServlet(name="ServletRequestHeader",value="/ServletRequestHeader")publicclassServletRequestHeaderextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriter();Enumeration<String>headers=request.getHeaderNames();while(headers.hasMoreElements()){Stringvalue=request.getHeader(headers.nextElement());out.write(headers.nextElement()+":"+value+"<br/>");}}}为了更好地理解这些方法,下面通过案例演示这些方法的使用。在ServletRequest目录中创建一个名为ServletRequestHeader类,在这个类中调用getHeaderNames()获取请求头信息,代码如下。3.5.1ServletRequest接口从HttpServletRequest获取请求头信息在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ServletRequestHeader,显示效果如图3-9所示。图3-9ServletRequestHeader的运行结果3.5.1ServletRequest接口从HttpServletRequest获取form表单的数据方法说明描述StringgetParameter(Stringname)返回指定参数名的参数值。String[]getParameterValues(Stringname)以字符串数组的形式返回指定参数名的所有参数值(HTTP请求中可以有多个相同参数名的参数)。EnumerationgetParameterNames()以枚举集合的形式返回请求中所有参数名。MapgetParameterMap()用于将请求中的所有参数名和参数值装入一个Map对象中返回。在实际开发中,我们经常需要获取用户提交的表单数据,例如用户名和密码等。为了方便获取表单中的请求参数,ServletRequest定义了一系列获取请求参数的方法,如表3-10所示。表3-10HttpServletRequest获取请求参数的方法为了更好地理解这些方法,下面通过案例演示getParameter()方法和getParameterValues()方法的使用。3.5.1ServletRequest接口

<td>手机号码</td>

<td><inputtype="tel"name="mobilephone"/></td>

</tr>

<tr>

<td>兴趣爱好</td>

<td>

<inputtype="checkbox"name="interest"value="唱歌">唱歌;

<inputtype="checkbox"name="interest"value="跑步">跑步;

<inputtype="checkbox"name="interest"value="游泳">游泳;

<inputtype="checkbox"name="interest"value="骑车">骑车;

</td>

</tr>

<tr>

<tdcolspan="2"><inputtype="submit"value="提交"/></td>

</tr>

</table></form></body></html>从HttpServletRequest获取form表单的数据(1)在webapp目录下,新建ch03目录,并在其中创建form.html,代码如下。<!DOCTYPEhtml><html><head>

<metacharset="UTF-8">

<title>Inserttitlehere</title></head><body><formaction="/myJavaWeb_war/ServletRequestParams"method="post">

<tableborder="1"width="50%">

<tr>

<td>姓名</td>

<td><inputtype="text"name="username"/></td>

</tr>

<tr>

<td>输入密码</td>

<td><inputtype="password"name="password"/></td>

</tr>

<tr>

<td>性别</td>

<td><inputtype="radio"name="sex"value="男"checked/>男

<inputtype="radio"name="sex"value="女"/>女</td>

</tr>

<tr>

3.5.1ServletRequest接口016Stringmobilephone=request.getParameter("mobilephone");017System.out.println("手机号码:"+mobilephone);018String[]interests=request.getParameterValues("interest");019System.out.print("兴趣爱好:");020for(inti=0;i<interests.length;i++){021System.out.print(interests[i]+",");022}023}024publicvoiddoPost(HttpServletRequestrequest,025HttpServletResponseresponse)throwsServletException,IOException{026doGet(request,response);027}028}从HttpServletRequest获取form表单的数据在ServletRequest目录中创建一个名为ServletRequestParams类,在这个类中调用getParameter()和getParameterValues()两个方法获取指定参数名的参数值,代码如下。001@WebServlet(name="ServletRequestParams",value="/ServletRequestParams")002publicclassServletRequestParamsextendsHttpServlet{003004publicvoiddoGet(HttpServletRequestrequest,005HttpServletResponseresponse)throwsServletException,IOException{006request.setCharacterEncoding("utf-8");007Stringname=request.getParameter("username");008System.out.println("用户名:"+name);009Stringpassword=request.getParameter("password");010System.out.println("密

码:"+password);011String[]sexes=request.getParameterValues("sex");012System.out.print("性别:");013for(inti=0;i<sexes.length;i++){014System.out.print(sexes[i]+",");015}注意:第7行代码中是HttpServletRequest接口提供了一个setCharacterEncoding(),该方法用于设置

Request对象的编码方式,如果将其设置为"utf-8"可以解决请求参数中文乱码问题。

第8、10、17行代码通过getParameter()方法分别获取了姓名、密码和手机号码,

第12行和第19行调用getParameterValues()方法获取了sexes(性别)和interests(兴趣爱好)两个参数数组的内容。3.5.1ServletRequest接口从HttpServletRequest获取form表单的数据单击此处输入你的正文,请尽量言简意赅的阐述观点,以便观者可以准确理解您所传达的信息关键字单击此处输入你的正文,请尽量言简意赅的阐述观点,以便观者可以准确理解您所传达的信息关键字图3-10form.html的运行结果(2)在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ch03/form.html,然后在显示的表单中填入相应的内容,显示效果如图3-10所示。图3-11控制台输出的用户相关信息(3)单击图3-13图中提交按钮,在IDEA的控制台输出相关信息,如下图3-11所示。3.5.1ServletRequest接口该方法用于从ServletRequest对象中返回指定名称的属性对象,其语法定义如下:(2)getAttribute()方法该方法用于返回一个包含ServletRequest对象中的所有属性名的Enumeration对象,可以通过对Enumeration对象的遍历实现对ServletRequest对象中的所有属性的遍历。getAttributeNames()方法的完整语法定义如下:(4)getAttributeNames方法用于将一个对象与一个名称关联后存储进ServletRequest对象中,其语法定义如下:(1)setAttribute()方法该方法用于从ServletRequest对象中删除指定名称的属性,其语法定义如下:(3)removeAttribute方法01030204通过Request对象传递数据publicvoidsetAttribute(Stringname,.Objecto);需要注意的是,如果ServletRequest对象中已经存在同样名称的属性,setAttribute()方法将会先删除原有的属性,然后再把新的属性添加进去。如果传递给setAttribute()方法的属性值对象为null,这时的效果等同于removeAttribute()方法,相当于删除指定名称的属性,。publicStringgetAttribute(Stringname);publicvoidremoveAttribute(Stringname);Public.EnumerationgetAttributeNames();Request对象不仅可以获取一系列数据,还可以通过属性传递数据。在ServletRequest接口中,定义了一系列操作属性的方法,具体如下。3.5.1ServletRequest接口RequestDispatcher接口(1)getRequestDispatcher()方法getRequestDispatcher(Stringpath)getRequestDispatcher()方法是一个用于获取请求转发器的方法。通过该方法可以将请求转发到另一个servlet、JSP页面或者静态资源。具体格式如下:可以通过调用方法来获取一个请求转发器对象,其中path参数指定了要转发到的目标资源的路径。这个路径可以是相对路径或者绝对路径。例如,如果想将请求转发到一个名为"TargetServlet"的Servlet页面,可以使用getRequestDispatcher(/TargetServlet),然后使用返回的转发器对象调用forward(request,response)方法来实际执行请求转发过程。需要注意的是,getRequestDispatcher()方法返回的是一个RequestDispatcher对象,可以使用该对象来进一步操作和控制请求转发。(2)forward()方法推进一个请求到服务器的某个资源(如:servlet,JSP文件,或HTML文件)。该方法允许一个servlet对一个请求作初步处理,而另一个资源将产生响应。具体格式为:publicvoidforward(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOExceptionforward()方法应该在响应被提交到客户端之前被唤起(在响应主体输出被刷新之前)。如果响应已经被提交,该方法抛出IllegalStateException。在forward之前,响应未被提交的输出会被自动清理掉。3.5.1ServletRequest接口案例演示001@WebServlet(name="ServletRequestForward",value="/ServletRequestForward")002publicclassServletRequestForwardextendsHttpServlet{003protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{004response.setContentType("text/html;charset=utf-8");005request.setAttribute("UserName","student");006request.setAttribute("Password","123456");007request.getRequestDispatcher("/ServletTarget").forward(request,response);008}009}(1)在ServletRequest目录中创建类名为ServletRequestForward类,在这个类中使用setAttribute()方法将数据存储到Request对象中,并分别调用getRequestDispatcher()和forward()方法实现将请求转发到一个新的Servlet页面,代码如下。注:第5-6行使用setAttribute()方法将“UserName”和“Password”两个数据存储到Request对象,

第7行使用getRequestDispatcher()和forward()方法实现将请求转发到名为ServletTarget的servlet页面。3.5.1ServletRequest接口案例演示@WebServlet(name="ServletTarget",value="/ServletTarget")publicclassServletTargetextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();StringUserName=(String)request.getAttribute("UserName");StringPassword=(String)request.getAttribute("Password");out.println("UserName:"+UserName);out.println("<br/>");out.println("Password:"+Password);}}(2)在ServletRequest目录中创建类名为ServletTarget类,在这个类中使用getAttribute()方法获取Request对象中存储的数据并输出。代码如下:在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ServletRequestForward,显示效果如图3-12所示。图3-12ServletRequestForward的运行结果3.5.2ServletResponse接口ServletResponse接口提供了一系列方法来设置和获取HTTP响应的信息。HttpServletResponse接口继承自ServletResponse接口,用于封装HTTP响应消息,HTTP响应消息分为响应行,响应头,响应体三部分,所以HttpServletResponse中定义了向客户端发送响应状态码、响应消息头、响应消息体等方法。ServletResponse接口3.5.2ServletResponse接口发送状态码的方法方法说明描述voidsetStatus(intstatus)设置响应消息的状态码,并生成响应状态行voidsendError(intsc)发送表示错误信息的状态码voidsendError(intsc,Stringmessage)设置表示错误的状态码外还向客户端发送一条错误信息,其中包含message的内容当Servlet向客户端发送响应信息是,需要把状态码设置在响应信息,不同的状态码代表客户端请求服务器的不同结果。HttpServletResponse定义了发送状态码的各种方法,具体内容如表3-11所示。状态码的含义见表3-12所示。表3-12状态码状态码说明200成功302重定向304请求资源未改变,使用缓存400请求错误,常见于请求参数错误404请求资源未找到405请求方式不支持500服务器错误表3-11HttpServletResponse发送状态码的方法3.5.2ServletResponse接口设置响应消息头字段的方法Servlet发送的响应信息中包含响应头字段,而HTTP中的响应头字段的种类很多,HttpServletResponse接口也对应HTTP中的响应头字段的种类定义了一系列的设置HTTP响应头字段的方法,具体内容见表3-13。方法说明描述addDateHeader(Stringname,longdate)该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间addHeader(Stringname,Stringvalue)该方法是设置有多个值的响应头,参数name表示响应头名称,参数value表示响应头的值addIntHeader(Stringname,intvalue)该方法是设置有多个值且值的类型为int类型的响应头setHeader(Stringname,Stringvalue)该方法是设置只有一个值的响应头,参数name表示响应头名称,参数value表示响应头的值setDateHeader(Stringname,longvalue)该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间setIntHeader(Stringname,intvalue)该方法是设置只有一个值且值的类型为int类型的响应头,例如Content-Length响应头,该响应头是代表响应内容有多少字节数表3-13HttpServletResponse设置HTTP响应头字段的方法3.5.2ServletResponse接口于返回Servlet引擎创建的字节输出流对象为ServletOutputStream类型,Servlet程序可以按字节数组二进制形式输出响应正文。01getOutputStream方法用于返回Servlet引擎创建的字符输出流对象为PrintWriter类型,Servlet程序可以按字符文本形式输出响应正文。02getWriter方法发送响应消息体相关的方法在HTTP响应的信息中,大量的数据都是通过响应消息体传递的,为此,HttpServletResponse在发送响应消息体时,定义了2个与输出流相关的方法。getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。3.5.2ServletResponse接口案例演示@WebServlet(name="ServletOutputStream",value="/ServletOutputStream")publicclassServletOutputStreamextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringmessage="YUNNANOPENUNIVERSITY";OutputStreamout=response.getOutputStream();out.write(message.getBytes());}}(1)在ch03目录中新建ServletResponse目录,并在其中编写ServletOutputStream类,这个Servlet类中调用了HttpServletResponse接口中getOutputStream的方法,ServletOutputStream类代码如下。(2)在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ServletOutputStream,显示效果如图3-13所示。图3-13ServletOutputStream的运行结果3.5.2ServletResponse接口案例演示@WebServlet(name="ServletWriter",value="/ServletWriter")publicclassServletWriterextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterprint=response.getWriter();print.write("YUNNANOPENUNIVERSITY");}}(3)在ch03目录中编写ServletWriter类,这个Servlet类中调用了HttpServletResponse接口中getWriter();的方法,ServletWriter类代码如下。(4)在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ServletWriter,显示效果与图3-13是一样的。图3-13ServletOutputStream的运行结果3.5.2ServletResponse接口在Web开发中,页面重定向是指Web服务器接收到客户端的请求后,可能由于一些原因,不能访问当前请求URL所指向的Web资源,将请求重定向到另一个URL,让客户端重新发送请求。这个过程可以用于多种场景,比如用户登录后跳转到欢迎页面、表单提交后跳转到成功页面等。为了实现请求重定向,HttpServletResponse接口定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL,sendRedirect()方法的完整语法如下所示。publicvoidsendRedirect(java.lang.Stringlocation)throwsjava.io.IOException在上述方法代码中,参数location可以使用相对URL,Web服务器会自动将相对URL翻译成绝对URL,再生成Location头字段。3.5.2ServletResponse接口访问的url资源不一样:forward方法只能转发到同一个Web应用程序中的资源,而sendRedirect方法可以重定向到任何URL.01目的url请求的原理不一样:forward是浏览器先向目的Servlet发送一次Request请求,然后在服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回Response到浏览器端。sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。02请求响应次数不一样forward是浏览器和服务器一次请求响应;sendRedirect是浏览器和服务器两次请求响应。03forward和sendRedirect的区别3.5.2ServletResponse接口案例演示<formaction="/myJavaWeb_war/ServletSendRedirect"method="POST">

用户名:<inputtype="text"name="UserName"><b

温馨提示

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

评论

0/150

提交评论