目录
response
response也是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。
response对象的功能分为以下四种:
设置响应正文;
重定向;
设置响应头信息;
发送状态码;
设置响应正文
通过response对象得到输入流,往客户端浏览器写一些内容。response一共提供了两个响应流对象:
PrintWriter out = response.getWriter():获取字符流;
ServletOutputStream out = response.getOutputStream():获取字节流;
注:在一个请求中,不能同时使用这两个流!不然会抛出IllegalStateException异常。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Cservlet的doGet方法");
FileInputStream fis = new FileInputStream();
//得到响应输出流
ServletOutputStream outputStream = resp.getOutputStream();
int i = -1;
while((i = fis.read())!=-1){
outputStream.write(i);
}
outputStream.flush();
outputStream.close();
}
在使用response.getWriter()时需要注意默认字符编码为ISO-8859-1,如果希望设置字符流的字符编码为utf-8,可以使用response.setCharaceterEncoding(“utf-8”)来设置。这样可以保证输出给客户端的字符都是使用UTF-8编码的!
但客户端浏览器并不知道响应数据是什么编码的!如果希望通知客户端使用UTF-8来解读响应数据,那么还是使用response.setContentType("text/html;charset=utf-8")方法比较好,因为这个方法不只会调用response.setCharaceterEncoding(“utf-8”),还会设置content-type响应头,客户端浏览器会使用content-type头来解读响应数据。
设置响应头
可以使用response对象的setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器!
public void setHeader(String name, String value) throws IOException;
其中,name为响应头的名称,value为响应头的值。
例如:
response.setHeader(“content-type”, “text/html;charset=utf-8”):设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”);
response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自动跳转到百度主页。
设置状态码
在HttpServletResponse接口中,setStatus(int sc)方法用于设置HTTP响应的状态码。sc表示状态码。
在Java Servlet API中,HttpServletResponse接口定义了一系列状态码常量。
状态码 | 常量名称 | 描述 |
---|---|---|
200 | SC_OK | 请求已成功,请求所希望的响应头或数据体将随此响应返回。 |
204 | SC_NO_CONTENT | 请求已成功,但响应中不包含实体的主体部分。 |
302 | SC_FOUND | 请求的资源临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。 |
304 | SC_NOT_MODIFIED | 如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结束。 |
400 | SC_BAD_REQUEST | 服务器无法理解请求的格式,客户端不应当重复发送这个请求。 |
401 | SC_UNAUTHORIZED | 请求要求用户的身份认证。 |
403 | SC_FORBIDDEN | 服务器理解请求客户端的请求,但是拒绝执行此请求。 |
404 | SC_NOT_FOUND | 服务器无法根据客户端的请求找到资源(网页)。通过此状态码,服务器可以告诉客户端,该服务器上根本没有这个目标资源。 |
500 | SC_INTERNAL_SERVER_ERROR | 服务器内部错误,无法完成请求。 |
501 | SC_NOT_IMPLEMENTED | 服务器不支持请求的功能,无法完成请求。 |
502 | SC_BAD_GATEWAY | 作为网关或代理工作的服务器从上游服务器收到无效响应。 |
503 | SC_SERVICE_UNAVAILABLE | 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。 |
504 | SC_GATEWAY_TIMEOUT | 作为网关或代理工作的服务器未及时从上游服务器收到请求。 |
重定向
Servlet进行资源跳转,除了request对象的请求转发,还有response的重定向。在地址栏输入url的方式就属于重定向。
方法:
void sendRedirect(String var1) throws IOException;
重定向的特征:
重定向是两次请求;
重定向的URL可以是其他应用,不局限于当前应用;
重定向的响应头为302,并且必须要有Location响应头;
重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;
重定向与请求转发的区别
请求转发是一个请求,而重定向是两个请求;
请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
重定向的第二个请求一定是GET;
请求转发是在服务端内部执行的,而重定向是在客户端执行的.