HttpServletResponse对象是用来操作HTTP请求中的响应部分(响应行、响应头、和响应正文)的,在客户端请求访问的时候,服务器在调用Service()方法之前会先创建request和reponse对象,前者封装了请求的消息,后者封装了服务器响应的消息,在执行玩srevice()方法后,服务器要在两个对象被销毁之前得到这两个对象中的信息,然后将其反馈给客户端,下面是HttpServletResponse对象中操作这些内容的常用方法
1、响应行
响应行中可以操作的内容只有一个状态码了(如200,404等),在这里可以使用setStatus(int s)方法来设置响应状态码
2、响应头
操作响应头的方法主要有两个:
①、sendRedirect(String location)请求重定向
②、setHeader(String name,String value)设置响应头的信息(是一个映射),比如可以设置以什么方式解码
下面是一个请求重定向(不是请求转发)的例子:
Servlet一:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test_Redirect extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("A:我找小明");
System.out.println("B:他不在这,我可以告诉你他在哪,你自己去找吧");
/*resp.setStatus(302);//设置状态码为302告诉客户端重新定向资源,方式一
resp.setHeader("location", "/Servlet/redirect1");*/
resp.sendRedirect("/Servlet/redirect1");//设置重定向地址,方式二
System.out.println("A:好的,我知道了");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
Servlet二:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test_Redirect1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是小明");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
两个Servlet的xml配置:
<servlet>
<servlet-name>redirect</servlet-name>
<servlet-class>ServletDemo2.Test_Redirect</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>redirect</servlet-name>
<url-pattern>/redirect</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>redirect1</servlet-name>
<servlet-class>ServletDemo2.Test_Redirect1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>redirect1</servlet-name>
<url-pattern>/redirect1</url-pattern>
</servlet-mapping>
输出结果为:
3、响应正文
响应正文包含着浏览器需要解析的内容,因此操作其主要有以下方法(以下方法均在其父类ServletResponse中):
①、getWriter() 字符输出流
②、getOutputStream() 字节输出流,返回一个ServletOutputStream对象, 该对象是用于将二进制数据发送到客户端的输出流
③、setCharacterEncoding(String charset) 告知服务器用什么方式编码解析
④、setContentType(String Type) 告知浏览器和服务器应该使用什么编码
下面是关于操作响应正文的具体例子
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test_HttpServletResponse extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*Tomcat服务器默认的编码为ISO-8859-1,不支持中文,应当告诉浏览器和服务器,使用UTF-8编码
方式一
resp.setCharacterEncoding("UTF-8");//告诉服务器使用什么编码解析文本
resp.setHeader("content-type", "text/html;charset=UTF-8");//设置响应消息头,告诉浏览器使用什么编码解析
*/
//方式二
resp.setContentType("text/html;charset=UTF-8");//告知服务器使用什么解析文本,告知浏览器(客户端)使用什么编码
PrintWriter out = resp.getWriter();//得到字符输出流
out.write("你好,世界!");//向客户端浏览器响应文本
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
以下为下载一张图片的例子
package ServletDemo2;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 下载一张图片
* @author wushijia
*
*/
public class Download extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、得到文件的绝对路径,并且通过该路径得到一个字节输入流
String path = this.getServletContext().getRealPath("/WEB-INF/classes/TomCat.png");//得到下载文件的绝对路径
FileInputStream fis = new FileInputStream(path);
//2、创建字节输出流
ServletOutputStream sos = resp.getOutputStream();
//3、得到下载的文件名
String filename = path.substring(path.lastIndexOf("\\")+1);//得到的文件名为TomCat.png
//4、设置文件编码
filename = URLEncoder.encode(filename, "UTF-8");//编码为UTF-8
//5、告知客户端(浏览器)要下载文件
resp.setHeader("content-disposition", "attachment;filename="+filename);
resp.setHeader("content-type", "image/png");//文件类型
//6、输出
byte[] b = new byte[1024];
int len = 0;
while((len=fis.read(b)) != -1){
sos.write(b, 0, len);
}
sos.close();
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在以上的例子中,第4步的作用是将不安全的文件名改为UTF-8编码,即将文件名中的字母用他们本身替换,将"."、","、"_"、"-"、"*"用他们本身替换,将空格替换为"+",除了这些以外的字符,都是不安全字符,将它们替换为%xy,即16进制格式,其中xy是两个16进制数值