收藏 分享(赏)

JSP内置对象request和response.doc

上传人:精品资料 文档编号:11194827 上传时间:2020-02-15 格式:DOC 页数:12 大小:152.50KB
下载 相关 举报
JSP内置对象request和response.doc_第1页
第1页 / 共12页
JSP内置对象request和response.doc_第2页
第2页 / 共12页
JSP内置对象request和response.doc_第3页
第3页 / 共12页
JSP内置对象request和response.doc_第4页
第4页 / 共12页
JSP内置对象request和response.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、请求响应流程图response1 response 概述response 是 Servlet.service 方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response 对象,并传入给 Servlet.service()方法。response 对象是用来对客户端进行响应的,这说明在 service()方法中使用 response 对象可以完成对客户端的响应工作。response 对象的功能分为以下四种: 设置响应头信息; 发送状态码; 设置响应正文; 重定向;2 response 响应正文res

2、ponse 是响应对象,向客户端输出响应正文(响应体)可以使用 response 的响应流,repsonse 一共提供了两个响应流对象: PrintWriter out = response.getWriter():获取字符流; ServletOutputStream out = response.getOutputStream():获取字节流;当然,如果响应正文内容为字符,那么使用 response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用 response.getOutputStream()。注意,在一个请求中,不能同时使用这两个流!也就是说,要么你使用reps

3、onse.getWriter(),要么使用 response.getOutputStream(),但不能同时使用这两个流。不然会抛出 IllegalStateException 异常。2.1 字符响应流 字符编码在使用 response.getWriter()时需要注意默认字符编码为 ISO-8859-1,如果希望设置字符流的字符编码为 utf-8,可以使用 response.setCharaceterEncoding(“utf-8”)来设置。这样可以保证输出给客户端的字符都是使用 UTF-8 编码的!但客户端浏览器并不知道响应数据是什么编码的!如果希望通知客户端使用 UTF-8 来解读响应数

4、据,那么还是使用 response.setContentType(“text/html;charset=utf-8“)方法比较好,因为这个方法不只会调用 response.setCharaceterEncoding(“utf-8”),还会设置 content-type 响应头,客户端浏览器会使用 content-type 头来解读响应数据。 缓冲区response.getWriter()是 PrintWriter 类型,所以它有缓冲区,缓冲区的默认大小为 8KB。也就是说,在响应数据没有输出 8KB 之前,数据都是存放在缓冲区中,而不会立刻发送到客户端。当 Servlet 执行结束后,服务器才

5、会去刷新流,使缓冲区中的数据发送到客户端。如果希望响应数据马上发送给客户端: 向流中写入大于 8KB 的数据; 调用 response.flushBuffer()方法来手动刷新缓冲区;3 设置响应头信息可以使用 response 对象的 setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器! response.setHeader(“content-type”, “text/html;charset=utf-8”):设置 content-type响应头,该头的作用是告诉浏览器响应内容为 html 类型,编码为 utf-8。而且同时会设置 response 的字符

6、流编码为 utf-8,即 response.setCharaceterEncoding(“utf-8”); response.setHeader(“Refresh“,“5; URL=http:/“):5 秒后自动跳转到传智主页。4 设置状态码及其他方法 response.setContentType(“text/html;charset=utf-8“):等同与调用response.setHeader(“content-type”, “text/html;charset=utf-8”); response.setCharacterEncoding(“utf-8”):设置字符响应流的字符编码为 u

7、tf-8; response.setStatus(200):设置状态码;Comment 崔1: 设置响应码为 302,表示重定向Comment 崔2: 设置新请求的 URL response.sendError(404, “您要查找的资源不存在”):当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。5 重定向5.1 什么是重定向当你访问 http:/时,你会发现浏览器地址栏中的 URL会变成http:/ 完成重定向响应码为 200表示响应成功,而响应码为 302表示重定向。所以完成重定向的第一步就是设置响应码为 302。因为重定向是通知浏览器再第二个请求,所以浏览器

8、需要知道第二个请求的 URL,所以完成重定向的第二步是设置 Location头,指定第二个请求的 URL地址。public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.setStatus(302);response.setHeader(“Location“, “http:/“);上面代码的作用是:当访问 AServlet 后,会通

9、知浏览器重定向到传智主页。客户端浏览器解析到响应码为 302 后,就知道服务器让它重定向,所以它会马上获取响应头Location,然发出第二个请求。5.3 便捷的重定向方式public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.sendRedirect(“http:/“);response.sendRedirect()方法会设置

10、响应头为 302,以设置 Location 响应头。如果要重定向的 URL 是在同一个服务器内,那么可以使用相对路径,例如:public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.sendRedirect(“/hello/BServlet“);重定向的 URL 地址为:http:/localhost:8080/hello/BSe

11、rvlet 。5.4 重定向小结 重定向是两次请求; 重定向的 URL 可以是其他应用,不局限于当前应用; 重定向的响应头为 302,并且必须要有 Location 响应头; 重定向就不要再使用 response.getWriter()或 response.getOutputStream()输出数据,不然可能会出现异常;request1 request 概述request 是 Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request 对象,并把请求数据封装到 re

12、quest 中,然后在调用 Servlet.service()方法时传递给service()方法,这说明在 service()方法中可以通过 request 对象来获取请求数据。request 的功能可以分为以下几种: 封装了请求头数据; 封装了请求正文数据,如果是 GET 请求,那么就没有正文; request 是一个域对象,可以把它当成 Map 来添加获取数据; request 提供了请求转发和请求包含功能。2 request 域方法request 是域对象!在 JavaWeb 中一共四个域对象,其中 ServletContext 就是域对象,它在整个应用中只创建一个 ServletCon

13、text 对象。request 其中一个,request 可以在一个请求中共享数据。一个请求会创建一个 request 对象,如果在一个请求中经历了多个 Servlet,那么多个Servlet 就可以使用 request 来共享数据。现在我们还不知道如何在一个请求中经历之个Servlet,后面在学习请求转发和请求包含后就知道了。下面是 request 的域方法: void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在 re

14、quest 中保存了一个域属性,域属性名称为 xxx,域属性的值为 XXX。请注意,如果多次调用该方法,并且使用相同的 name,那么会覆盖上一次的值,这一特性与 Map 相同; Object getAttribute(String name):用来获取 request 中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)request.getAttribute(“xxx”);,获取名为 xxx 的域属性; void removeAttribute(String name):用来移除 request 中的域属性,如果参数 name指定的域属性不存在,那

15、么本方法什么都不做; Enumeration getAttributeNames():获取所有域属性的名称;3 request 获取请求头数据request 与请求头相关的方法有: String getHeader(String name):获取指定名称的请求头; Enumeration getHeaderNames():获取所有请求头名称; int getIntHeader(String name):获取值为 int 类型的请求头。4 request 获取请求相关的其它方法request 中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求 URL

16、相关的方法。 int getContentLength():获取请求体的字节数,GET 请求没有请求体,没有请求体返回-1; String getContentType():获取请求类型,如果请求是 GET,那么这个方法返回null;如果是 POST 请求,那么默认为 application/x-www-form-urlencoded,表示请求体内容使用了 URL 编码; String getMethod():返回请求方法,例如:GET Locale getLocale():返回当前客户端浏览器的 Locale。 java.util.Locale 表示国家和言语,这个东西在国际化中很有用; S

17、tring getCharacterEncoding():获取请求编码,如果没有 setCharacterEncoding(),那么返回 null,表示使用 ISO-8859-1 编码; void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于 GET 而言,没有请求体!所以此方法只能对 POST 请求中的参数有效! String getContextPath():返回上下文路径,例如:/hello String getQueryString():返回请求 URL 中的参数,例如:name=zhangSan String getRe

18、questURI():返回请求 URI 路径,例如:/hello/oneServlet StringBuffer getRequestURL():返回请求 URL 路径,例如:http:/localhost/hello/oneServlet,即返回除了参数以外的路径信息; String getServletPath():返回 Servlet 路径,例如:/oneServlet String getRemoteAddr():返回当前客户端的 IP 地址; String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP 地址; String getScheme(

19、):返回请求协议,例如:http; String getServerName():返回主机名,例如: localhost int getServerPort():返回服务器端口号,例如:8080System.out.println(“request.getContentLength(): “ + request.getContentLength();System.out.println(“request.getContentType(): “ + request.getContentType();System.out.println(“request.getContextPath(): “ +

20、 request.getContextPath();System.out.println(“request.getMethod(): “ + request.getMethod();System.out.println(“request.getLocale(): “ + request.getLocale();System.out.println(“request.getQueryString(): “ + request.getQueryString();System.out.println(“request.getRequestURI(): “ + request.getRequestUR

21、I();System.out.println(“request.getRequestURL(): “ + request.getRequestURL();System.out.println(“request.getServletPath(): “ + request.getServletPath();System.out.println(“request.getRemoteAddr(): “ + request.getRemoteAddr();System.out.println(“request.getRemoteHost(): “ + request.getRemoteHost();Sy

22、stem.out.println(“request.getRemotePort(): “ + request.getRemotePort();System.out.println(“request.getScheme(): “ + request.getScheme();Comment 崔3: hello是应用名,ParamServlet是 Servlet绑定 URL路径,在问号后面的是请求参数,第一个参数是 p1,值为 v1,第二个参数为p2,值为 v2Comment 崔4: 请求方法是 postSystem.out.println(“request.getServerName(): “ +

23、 request.getServerName();System.out.println(“request.getServerPort(): “ + request.getServerPort();4.1 案例:request.getRemoteAddr():封 IP可以使用 request.getRemoteAddr()方法获取客户端的 IP地址,然后判断 IP是否为禁用IP。String ip = request.getRemoteAddr();System.out.println(ip);if(ip.equals(“127.0.0.1“) response. getWriter().pri

24、nt(“您的IP已被禁止!“); else response.getWriter().print(“Hello!“);5 request 获取请求参数最为常见的客户端传递参数方式有两种: 浏览器地址栏直接输入:一定是 GET请求; 超链接:一定是 GET请求; 表单:可以是 GET,也可以是 POST,这取决与的 method属性值;GET请求和 POST请求的区别: GET请求: 请求参数会在浏览器的地址栏中显示,所以不安全; 请求参数长度限制长度在 1K之内; GET请求没有请求体,无法通过 request.setCharacterEncoding()来设置参数的编码; POST请求: 请

25、求参数不会显示浏览器的地址栏,相对安全; 请求参数长度没有限制;超链接参数1:参数2:Comment 崔5: 点击超链接是 GET请求,所以会执行 doGet()方法Comment 崔6: 提交表单是 POST请求,所以会调用 doPost()方法Comment 崔7: 多个名为 name的参数Comment 崔8: 获取所有名为 name的参数值Comment 崔9: 打印数组,输出结果为:zhangSan, liSi下面是使用 request获取请求参数的 API: String getParameter(String name):通过指定名称获取参数值;public void doGet

26、(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException String v1 = request.getParameter(“p1“);String v2 = request.getParameter(“p2“);System.out.println(“p1=“ + v1);System.out.println(“p2=“ + v2);public void doPost(HttpServletRequest request, HttpServletRespons

27、e response)throws ServletException, IOException String v1 = request.getParameter(“p1“);String v2 = request.getParameter(“p2“);System.out.println(“p1=“ + v1);System.out.println(“p2=“ + v2); String getParameterValues(String name):当多个参数名称相同时,可以使用方法来获取;超链接public void doGet(HttpServletRequest request, Ht

28、tpServletResponse response)throws ServletException, IOException String names = request.getParameterValues(“name“);System.out.println(Arrays.toString(names); Enumeration getParameterNames():获取所有参数的名字;参数1:参数2:Comment 崔10: 获取所有参数名称,输出结果为:p1 和 p2Comment 崔11: 获取“调度器” ,其中参数为 BServlet绑定的 URL,即BServlet的值。Co

29、mment 崔12: 调用“调度器”的转发方法,该方法等同与告诉服务器,去调用 BServlet的 service()方法一样。public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException Enumeration names = request.getParameterNames();while(names.hasMoreElements() System.out.println(names.nextElement(); Map g

30、etParameterMap():获取所有参数封装到 Map中,其中 key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是 String,而不是 String。超链接Map paramMap = request.getParameterMap();for(String name : paramMap.keySet() String values = paramMap.get(name);System.out.println(name + “: “ + Arrays.toString(values);p2: v2, vv2p1: v1, vv16 请求转发和请求包含无论

31、是请求转发还是请求包含,都表示由多个 Servlet共同来处理一个请求。例如Servlet1来处理请求,然后 Servlet1又转发给 Servlet2来继续处理这个请求。6.1 请求转发在 AServlet中,把请求转发到 BServlet:public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException System.out.println(“ASer

32、vlet“);RequestDispatcher rd = request.getRequestDispatcher(“/BServlet“);rd.forward(request, response);public class BServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse Comment 崔13: 请求包含response)throws ServletException, IOException System.out.println(“BServle

33、t“);AservletBServlet6.2 请求包含在 AServlet中,把请求包含到 BServlet:public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException System.out.println(“AServlet“);RequestDispatcher rd = request.getRequestDispatcher(“/BServ

34、let“);rd.include(request, response);public class BServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException System.out.println(“BServlet“);AservletBServlet6.3 请求转发与请求包含比较 如果在 AServlet中请求转发到 BServlet,那么在 AServlet中就不允许再输

35、出响应体,即不能再使用 response.getWriter()和 response.getOutputStream()向客户端输出,这一工作应该由 BServlet来完成;如果是使用请求包含,那么没有这个限制; 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”); 请求包含大多是应用在 JSP页面中,完成多页面的合并; 请求请求大多是应用在 Servlet中,转发目标大多是 JSP页面;6.4 请求转发与重定向比较 请求转发是一个请求,而重定向是两个请求; 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求; 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用; 请求转发对 AServlet 和 BServlet 的请求方法是相同的,即要么都是 GET,要么都是 POST,因为请求转发是一个请求; 重定向的第二个请求一定是 GET;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报