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方法:
-
public Object getAttribute(String name);
获取ServletRequest对象中的对应name的参数值。在ServletRequest对象中,参数的设置有两种方式:
1>、一种是由Servelt容器根据不同的请求而添加的参数信息,比如Https请求,Servlet容器就会根据客户端的证书,生成javax.servlet.request.X509Certificate对象,并添加到ServletRequest实例中;
2>、还有一种是通过编程方式添加的参数,即通过ServletRequest.setAttribute()方法添加,这种方式必须在调用RequestDispatcher对象之前进行。 -
public Enumeration getAttributeNames();
返回ServletRequest对象中,所有属性的key对应的集合,返回类型Enumeration。 -
public void setAttribute(String name, Object o);
添加属性到request请求的方法,上面提到的编程式添加属性方法,一般与RequestDispatcher配合使用。如果添加的对象o=null的话,相当于执行了removeAttribute方法,即移除参数操作。还需要注意的是:name的命名方式,所有以java.*、javax.*、sun.*、com.sun.*、oracle.*、com.oracle.*字符串开头的都作为预留,不允许开发者使用。 -
public void removeAttribute(String name);
移除该请求中的一个参数。 -
public String getCharacterEncoding();
获取该request请求体的字符编码,如果没有设置则返回null。 -
public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;
设置该request请求体的字符编码,会覆盖原有的字符编码。需要在获取参数前进行设置。 -
public int getContentLength(); 和 public long getContentLengthLong();
两个方法作用基本一样,连官方文档的解释基本上都是一模一样的。区别:getContentLengthLong()方法是从servlet3.1开始引入的;还有就是请求体长度的限制,getContentLengthLong()方法取消了Integer#MAX_VALUE的限制(未验证)。 -
public String getContentType();
返回请求体的MIME类型。 -
public ServletInputStream getInputStream() throws IOException;
获取请求体的二进制流 ServletInputStream 对象。读取请求体内容的方法还有getReader()方法,但是两者不能同时使用。 -
public BufferedReader getReader() throws IOException;
获取请求体的字符串数据,用BufferedReader对象表示,转换成字符串数据的时候,使用当前设置的字符串进行转码。和getInputStream()方法类似,同样是两者不能同时使用。 -
public String getRemoteAddr();
获取客户端的IP地址。 -
public String getRemoteHost();
获得客户端的主机名。在获取主机名的过程中,会涉及到dns查询,所以对性能上会有所影响。 -
public int getRemotePort();
获取客户端的端口号。 -
public String getLocalName();
获取服务器的主机名。 -
public String getLocalAddr();
获取服务器的IP地址。 -
public int getLocalPort();
获取服务器的端口号。 -
public Locale getLocale();
获取请求的Locale信息,该信息根据请求头中的Accept-Language来判断,如果没有该请求头,则使用默认的Locale对象。 -
public Enumeration<Locale> getLocales();
和getLocale()方法类似,只不过该方法返回的是集合,而且集合中的Locale对象的优先级依次递减。 -
public boolean isSecure();
返回当前请求是否使用了安全协议,比如Https。 -
public RequestDispatcher getRequestDispatcher(String path);
返回RequestDispatcher对象,和ServletContext#getRequestDispatcher功能类似。区别在于:这个方法中可以使用相对路径。 -
public DispatcherType getDispatcherType();
获取DispatcherType 值,表示RequestDispatcher对象类型。 -
public ServletContext getServletContext();
获取当前请求对应的ServletContext 对象。 -
public AsyncContext startAsync() throws IllegalStateException;
启用了服务端异步处理请求逻辑的功能。调用该方法后,对客户端没有任何影响,但是服务端会将处理该请求的线程释放掉,这样让容器可以有机会将相关资源分配给其它的请求,可以减轻系统负担。当该请求的业务逻辑处理好了,然后再行对客户端的响应。 -
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException;
和startAsync()方法功能类似。 -
public boolean isAsyncStarted();
获取当前请求是否使用了服务端异步处理功能。 -
public boolean isAsyncSupported();
判断是否支持服务端异步处理的功能。 -
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方法:
-
public String getCharacterEncoding();
获取当前响应体的字符编码。如果没有设置,返回的是“ISO-8859-1”。 -
public void setCharacterEncoding(String charset);
设置当前响应体的字符编码,该方法设置的字符编码会覆盖掉setContentType()或setLocale()方法中的设置过。该方法需要在调用getWriter()方法或响应已经提交前,才能生效。在HTTP中,一般对应了响应头中的“Content-Type”。setContentType("text/html; charset=UTF-8");
等效于
setCharacterEncoding("UTF-8"); setContentType("text/html");
-
public String getContentType();
获取当前响应体的内容类型,如果没有设置就返回null。如果字符编码被设置了(即getCharacterEncoding()方法有返回值的话),该方法就会把字符编码一起返回,比如:“text/html; charset=UTF-8”。 -
public void setContentType(String type);
和setCharacterEncoding()方法类似,这个方法是用来设置内容类型的。 -
public void setContentLength(int len);
设置响应体的长度。在HTTP请求中,对应“Content-Length”。 -
public void setContentLengthLong(long length);
和setContentLength()方法功能一样。 -
public ServletOutputStream getOutputStream() throws IOException;
获取一个可以向客户端写二进制数据流的ServletOutputStream对象,二进制流不会进行编码。当调用flush()方法时,就会把缓存数据刷新到响应内容中。 -
public PrintWriter getWriter() throws IOException;
和getOutputStream()方法功能类似,只不过该方法是一字符串数据类型进行响应客户端,且字符串数据需要通过指定的编码格式进行编码。 -
public void setBufferSize(int size);
设置缓冲区大小。当缓存区满的时候,就相当于执行了一次flush()方法。 -
public int getBufferSize();
获取当前缓存区的大小。 -
public void flushBuffer() throws IOException;
强制执行了一次刷新操作,即当缓存没有满的时候,可以通过该方法执行一次向客户端写数据的操作。 -
public void resetBuffer();
清空缓存区中的内容,当时不考虑response的头信息和状态信息。如果response已经被提交,则会抛出IllegalStateException异常。 -
public boolean isCommitted();
判断当前response是否已经被提交了。 -
public void reset();
重启当前响应信息,和resetBuffer()区别在于:这个方法会把response的头信息和状态信息也清除掉。 -
public void setLocale(Locale loc);
设置响应头的本地化信息,其中也包括了字符编码的内容,如果setContentType()方法和setCharacterEncoding()方法没有进行设置,就会使用本地化信息中的字符编码的配置。 -
public Locale getLocale();
获取响应头的本地化实例对象Locale。
来源:CSDN
作者:姠惢荇者
链接:https://blog.csdn.net/hou_ge/article/details/104728392