(第三章)请求与响应

第三章请求与响应

目录

第三章请求与响应

1、Web容器做了什么

2、关于HttpServletRequest

3、关于HttpServletResponse


1、Web容器做了什么

Web容器做的事情就是,创建Servlet实例,并完成Servlet名称注册及URL模式的对应。在请求到来时,Web容器会转发正确的Servlet来处理请求。

当浏览器请求HTTP服务器时,是使用HTTP来传送请求与相关信息(标头、请求参数、Cookie等)。HTTP是基于TCP/IP之上的协议,信息基本上都是通过文字信息来传送。

当请求来到HTTP服务器,而HTTP服务器转交请求给容器时,容器会创建一个代表档次请求的HttpServletRequest对象,并将请求相关信息设置给该对象。同时,容器会创建一个HttpServletResponse对象,作为稍后要对客户端进行响应的Java对象。

接着,容器会根据读取的@WebServlet标注或web.xml的设置,找出处理该请求的Servlet,调用它的service()方法,将创建的HttpServletRequest对象、HttpServletResponse对象传入作为参数,service()方法中根据HTTP请求的方式,调用对象的doXXX()方法。

扫描二维码关注公众号,回复: 9356510 查看本文章

接着在doXXX()方法中,可以使用HttpServletRequest对象、HttpServletResponse对象。最后容器将相关操作转换为HTTP响应,再由HTTP服务器对浏览器进行响应。之后容器将HttpServletRequset对象、HttpSerletResponse对象销毁回收,该次请求响应结束。

2、关于HttpServletRequest

(1)处理请求参数与标头

请求来到服务器时,Web容器会创建HttpServletRequest实例来包装请求中的相关信息,HttpServletRequest定义了取得一些请求信息的方法。

  • getParameter():指定请求参数名称来取得对应的值。
  • getParameterValues():如果窗体上有可复选的元件,如复选框(Checkbox)、列表(List)等,则同一个请求参数名称会有多个值(此时的HTTP查询字符串其实就是像param=10&param=20&param=30),此时可以用getParameterValues()方法取得一个String数组,数组元素代表所有被选取选项的值。
  • getParameterNames():返回一个Enumeration对象,其中包括所有的请求参数名称。
  • getParameterMap():将请求参数以Map对象返回,Map中的键(Key)是请求参数名称,值(Value)的部分是请求参数值,以字符串数组类型String[]返回。

对于HTTP标头(Header)信息,可以使用以下方法来取得:

  • getHeather():使用方式与getParameter()类似,指定标头名称后可返回字符串值,代表浏览器所送出的标头信息。
  • getHeaders():使用方式与getParamterValues()类似,指定标头名称后可返回Enumeration,元素为字符串。
  • geHeaderNames():使用方式与getParameterNames()类似,取得所有标头名称,以Enumeration返回,内含所有标头字符串名称。

(2)请求参数编码处理

请求参数的编码处理,基本上必须分POST与GET的情况来说明。

(1)POST请求参数编码处理

可以使用HttpServletRequest的setCharacterEncoding()方法指定取得POST请求参数时使用的编码。

(2)GET请求参数编码处理

若使用Tomcat并采用GET,或没有设置setCharacterEncoding(),且已取得一个请求参数字符串,另外一个处理编码的方式,则是通过String的getBytes()指定编码来取得该字符串的字节数组,然后重新构造为正确编码的字符串。

(3)getReader()、getInputStream()读取Body内容

HttpServletRequest上定义有getReader()方法,可以让你取得一个BufferedReader通过该对象,可以读取请求的Body数据。

(4)使用RequestDispather调派请求

在Web应用程序中,经常需要多个Servlet来完成请求。例如,将另一个Servlet的请求处理流程包含(Include)进来,或将请求转发(Forward)给别的Servlet处理。如果有这类的需求,可以使用HttpServletRequest的getRequestDispather()取得RequestDispather接口的实现对象实例,调用时指定转发或包含的相对URL网址。

(1)使用include()方法

RequestDispather的include()方法,可以将另一个Servlet的操作流程包括至目前Servlet操作流程。

(2)请求范围属性

在include()或forward()时包括请求参数的做法,仅适用于传递字符串值给另一个Servlet,在调派请求的过程中,如果有必须共享的“对象”,可以设置给请求对象成为属性,称为请求范围属性(Request Scope Attribute),图3.9所示。HttpServletRequest上与请求范围属性有关的几个方法如下。

  • setAttribute():指定名称与对象属性。
  • getAttribute():指定名称取得属性。
  • getAttributeNames():取得所有属性名称。
  • removeAttribute():指定名称移除属性。

(3)使用forward()方法

RequestDispather有个forward()方法,调用时同样传入请求与响应对象,这表示你要讲请求处理转发给别的Servlet,“对客户端的响应同时也转发给另一个Servlet”。

3、关于HttpServletResponse

(1)设置响应标头、缓冲区

可以使用HttpServletResponse对象上的setHeader()、addHeader()来设置响应标头,setHeader()设置标头名称与值,addHeader()则可以在同一个标头名称上附加值。

(2)使用getWriter()输出字符

如果要对浏览器输出HTML,可以通过HttpServletResponse的getWriter()取得PrintWriter对象,然后指定字符串输出。要注意的是,在没有设置任何内容类型或编码之前,HttpServletResponse使用的字符编码默认是ISO-8859-1。也就是说,如果直接输出中文,在浏览器上就会看到乱码。有几个方式可以影响HttpServletResponse输出的编码处理。

(1)设置Locale

浏览器如果有发送Accept-Language标头,则可以使用HttpServletResponse的getLocale()来取得一个Locale对象,代表客户端可接受的语系。可以使用HttpServletResponse的setLocal()来设置地区(Locale)信息,地区信息就包括了语系与编码信息。语系信息通常通过响应标头Content-Language来设置,而setLocale()也会设置HTTP响应的Content-Language标头。例如:

(2)使用setCharacterEncoding()或setContentType()

也可以调用HttpServletResponse的setCharacterEncoding()设置字符编码:response.serCharacterEncoding("UTF-8");或者是在使用HttpServletResponse的setContentType()时,指定charset,charset的值会自动用来调用serCharacterEncoding()。例如,以下不仅设置内容类型为text/html,也会自动调用serCharacterEncoding(),设置字符编码为UTF-8.

response.setContentType("text/html,charset=UTF-8");

如果使用了serCharacterEncoding()或setContentType()时指定了charset,则setLocale()就会别忽略。

(3)使用getOutputStream()输出二进制字符

在大部分的情况下,会从HttpServletResponse取得PrintWrite()实例,使用println()对浏览器进行字符输出。然而有时候,需要直接对浏览器进行字节输出,这时可以使用HttpServletResponse的getOutputStream()方法取得ServletOutputStream实例,它是OutputStream的子类。

(4)使用sendRedirect()、sendError()

RequestDispather的forward()方法,会将请求转发至指定的URL,这个动作是在Web容器中进行的,浏览器并不会知道请求被转发,地址栏也不会有所变化。

可以使用HttpServletResponse的sendRedirect()要求浏览器重新请求另一个URL,有称为重定向(Recdirect),使用时可指定绝对URL或相对URL。这个方法会在响应中设置HTTP状态码以及Location标头,浏览器收到这个标头,会重新使用GET方法请求指定的URL,因此地址栏上会发现URL的变更。

发布了17 篇原创文章 · 获赞 0 · 访问量 222

猜你喜欢

转载自blog.csdn.net/SUN19980421/article/details/104175299