Servlet学习笔记 -ServletRequest、ServletResponse

╄→гoц情女王★ 提交于 2020-03-09 06:57:41

1、ServletRequest

  在Servlet中,ServletRequest是一个非常重要的接口。这个类是由Servlet容器进行实例化,然后作为参数传递给了service()方法。在HttpServlet中,对应的是HttpServletRequest接口,HttpServletRequest 接口继承与ServletRequest接口。

  在Servlet 3.0 API中,ServletRequest接口或类的层级结构如下:
在这里插入图片描述
  当然,ServletRequest接口或类的层级结构中不仅仅包括Servlet 3.0 API中的这几个接口或类,同时在Tomcat容器和spring中都有很对相应的实现,比如:org.apache.catalina.core.ApplicationRequest和org.springframework.web.multipart.MultipartHttpServletRequest等。

ServletRequest作用:

   Servlet容器对于接收到的每一个请求,都会创建一个ServletRequest对象,并把这个对象作为参数传递给Servlet的sevice( )方法。ServletRequest对象封装了关于这次请求的相关信息。继承该接口的接口,可以携带一些和协议相关的特定信息,比如javax.servlet.http.HttpServletRequest接口,就携带了一些HTTP协议的一些信息。

ServletRequest方法:

  1. public Object getAttribute(String name);
    获取ServletRequest对象中的对应name的参数值。在ServletRequest对象中,参数的设置有两种方式:
       1>、一种是由Servelt容器根据不同的请求而添加的参数信息,比如Https请求,Servlet容器就会根据客户端的证书,生成javax.servlet.request.X509Certificate对象,并添加到ServletRequest实例中;
       2>、还有一种是通过编程方式添加的参数,即通过ServletRequest.setAttribute()方法添加,这种方式必须在调用RequestDispatcher对象之前进行。

  2. public Enumeration getAttributeNames();
    返回ServletRequest对象中,所有属性的key对应的集合,返回类型Enumeration。

  3. public void setAttribute(String name, Object o);
    添加属性到request请求的方法,上面提到的编程式添加属性方法,一般与RequestDispatcher配合使用。如果添加的对象o=null的话,相当于执行了removeAttribute方法,即移除参数操作。还需要注意的是:name的命名方式,所有以java.*、javax.*、sun.*、com.sun.*、oracle.*、com.oracle.*字符串开头的都作为预留,不允许开发者使用。

  4. public void removeAttribute(String name);
    移除该请求中的一个参数。

  5. public String getCharacterEncoding();
    获取该request请求体的字符编码,如果没有设置则返回null。

  6. public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;
    设置该request请求体的字符编码,会覆盖原有的字符编码。需要在获取参数前进行设置。

  7. public int getContentLength(); 和 public long getContentLengthLong();
    两个方法作用基本一样,连官方文档的解释基本上都是一模一样的。区别:getContentLengthLong()方法是从servlet3.1开始引入的;还有就是请求体长度的限制,getContentLengthLong()方法取消了Integer#MAX_VALUE的限制(未验证)。

  8. public String getContentType();
    返回请求体的MIME类型。

  9. public ServletInputStream getInputStream() throws IOException;
    获取请求体的二进制流 ServletInputStream 对象。读取请求体内容的方法还有getReader()方法,但是两者不能同时使用。

  10. public BufferedReader getReader() throws IOException;
    获取请求体的字符串数据,用BufferedReader对象表示,转换成字符串数据的时候,使用当前设置的字符串进行转码。和getInputStream()方法类似,同样是两者不能同时使用。

  11. public String getRemoteAddr();
    获取客户端的IP地址。

  12. public String getRemoteHost();
    获得客户端的主机名。在获取主机名的过程中,会涉及到dns查询,所以对性能上会有所影响。

  13. public int getRemotePort();
    获取客户端的端口号。

  14. public String getLocalName();
    获取服务器的主机名。

  15. public String getLocalAddr();
    获取服务器的IP地址。

  16. public int getLocalPort();
    获取服务器的端口号。

  17. public Locale getLocale();
    获取请求的Locale信息,该信息根据请求头中的Accept-Language来判断,如果没有该请求头,则使用默认的Locale对象。

  18. public Enumeration<Locale> getLocales();
    和getLocale()方法类似,只不过该方法返回的是集合,而且集合中的Locale对象的优先级依次递减。

  19. public boolean isSecure();
    返回当前请求是否使用了安全协议,比如Https。

  20. public RequestDispatcher getRequestDispatcher(String path);
    返回RequestDispatcher对象,和ServletContext#getRequestDispatcher功能类似。区别在于:这个方法中可以使用相对路径。

  21. public DispatcherType getDispatcherType();
    获取DispatcherType 值,表示RequestDispatcher对象类型。

  22. public ServletContext getServletContext();
    获取当前请求对应的ServletContext 对象。

  23. public AsyncContext startAsync() throws IllegalStateException;
    启用了服务端异步处理请求逻辑的功能。调用该方法后,对客户端没有任何影响,但是服务端会将处理该请求的线程释放掉,这样让容器可以有机会将相关资源分配给其它的请求,可以减轻系统负担。当该请求的业务逻辑处理好了,然后再行对客户端的响应。

  24. public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException;
    和startAsync()方法功能类似。

  25. public boolean isAsyncStarted();
    获取当前请求是否使用了服务端异步处理功能。

  26. public boolean isAsyncSupported();
    判断是否支持服务端异步处理的功能。

  27. public AsyncContext getAsyncContext();
    获取当前请求对应的AsyncContext对象。

2、ServletResponse

  ServletResponse对象一般都是和ServletRequest对象成对出现的。ServletRequest处理客户端请求,ServletResponse对象封装客户端响应。ServletResponse的实例对象也会在Servlet容器调用service()方法的时候,作为参数进行传递。ServletResponse隐藏了向浏览器发送响应的复杂过程。在HttpServlet中,对应的是HttpServletResponse接口,HttpServletResponse 接口继承与ServletResponse接口。

  在Servlet 3.0 API中,ServletResponse接口或类的层级结构如下:
在这里插入图片描述
  和ServletRequest接口类似,ServletResponse接口层级结构中也是不仅仅包括Servlet 3.0 API中的这几个接口或类,同时在Tomcat容器和spring中都有很对相应的实现,比如:org.apache.catalina.core.ApplicationResponse和org.springframework.web.util.ContentCachingResponseWrapper等。

ServletResponse作用:

   Servlet容器对于接收到的每一个请求,都会在创建一个ServletRequest对象的同时,创建一个ServletResponse对象,并把这两个对象作为参数传递给Servlet的sevice( )方法。其中,ServletRequest对象封装了关于这次请求的相关信息,而ServletResponse对象中则封装了一些响应客户端的相关信息,比如编码信息、响应的数据信息、数据字符编码信息等。

ServletResponse方法:

  1. public String getCharacterEncoding();
    获取当前响应体的字符编码。如果没有设置,返回的是“ISO-8859-1”。

  2. public void setCharacterEncoding(String charset);
    设置当前响应体的字符编码,该方法设置的字符编码会覆盖掉setContentType()或setLocale()方法中的设置过。该方法需要在调用getWriter()方法或响应已经提交前,才能生效。在HTTP中,一般对应了响应头中的“Content-Type”。

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

    等效于

    setCharacterEncoding("UTF-8");
    setContentType("text/html");
    
  3. public String getContentType();
    获取当前响应体的内容类型,如果没有设置就返回null。如果字符编码被设置了(即getCharacterEncoding()方法有返回值的话),该方法就会把字符编码一起返回,比如:“text/html; charset=UTF-8”。

  4. public void setContentType(String type);
    和setCharacterEncoding()方法类似,这个方法是用来设置内容类型的。

  5. public void setContentLength(int len);
    设置响应体的长度。在HTTP请求中,对应“Content-Length”。

  6. public void setContentLengthLong(long length);
    和setContentLength()方法功能一样。

  7. public ServletOutputStream getOutputStream() throws IOException;
    获取一个可以向客户端写二进制数据流的ServletOutputStream对象,二进制流不会进行编码。当调用flush()方法时,就会把缓存数据刷新到响应内容中。

  8. public PrintWriter getWriter() throws IOException;
    和getOutputStream()方法功能类似,只不过该方法是一字符串数据类型进行响应客户端,且字符串数据需要通过指定的编码格式进行编码。

  9. public void setBufferSize(int size);
    设置缓冲区大小。当缓存区满的时候,就相当于执行了一次flush()方法。

  10. public int getBufferSize();
    获取当前缓存区的大小。

  11. public void flushBuffer() throws IOException;
    强制执行了一次刷新操作,即当缓存没有满的时候,可以通过该方法执行一次向客户端写数据的操作。

  12. public void resetBuffer();
    清空缓存区中的内容,当时不考虑response的头信息和状态信息。如果response已经被提交,则会抛出IllegalStateException异常。

  13. public boolean isCommitted();
    判断当前response是否已经被提交了。

  14. public void reset();
    重启当前响应信息,和resetBuffer()区别在于:这个方法会把response的头信息和状态信息也清除掉。

  15. public void setLocale(Locale loc);
    设置响应头的本地化信息,其中也包括了字符编码的内容,如果setContentType()方法和setCharacterEncoding()方法没有进行设置,就会使用本地化信息中的字符编码的配置。

  16. public Locale getLocale();
    获取响应头的本地化实例对象Locale。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!