Web服务器收到客户端的http请求,会针对每一次http请求,分别创建一个用于代表请求的request对象,和代表相应的respose对象。
respose
请求相应包括 响应状态行、响应头、响应数据。
setStaus();//发送响应行
setHeader();//发送响应头
getWrite().write();//写响应数据(字符流)
getOutPutStream().write();//写响应数据(字节流)
关于字符编码的问题
public class ServletDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//高度浏览器 用哪种码表来打开数据 一定要写这个 要是不对应的话会出现乱码的问题
response.setHeader("content-type", "text/html;charset=UTF-8");
//自己根据那个码表来查询 把查询好的数据发送给浏览器
response.getOutputStream().write("中国".getBytes("UTF-8"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
在开发中尽量使用字符流,不用字节流。
public class ServletDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//便捷的方法 写了这个 这个也包含了 response.setCharacterEncoding("UTF-8"); 不用设置本地的码表了就
//response.setContentType("text/html;charset=UTF-8");
//告诉 servlet response 去查询码表(当字符变字节的时候)的时候根据 UTF-8来查 这句一定写在response.getWriter() 之前
response.setCharacterEncoding("UTF-8");
//告诉浏览器 用哪种码表来打开数据 一定要写这个 要是不对应的话会出现乱码的问题
response.setHeader("content-type", "text/html;charset=UTF-8");
//自己根据那个码表来查询 把查询好的数据发送给浏览器
response.getWriter().write("中国");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
**Demo 用浏览器来下载图片 用操作字节来做 不要用字符来做 **
/**
* 用字节流来读 注意 字符流只能处理文本 字节流什么都可以处理。因为在字符转字节的需要查码表 很可能里面没有所对应的 导致缺失数据
* @param response
*/
private void test2(HttpServletResponse response) {
try {
//得到 图片的路径 以便一会用来截取它的名字
String path= this.getServletContext().getRealPath("/demo宋.jpg");
//得到 图片的名字
String pathName=path.substring(path.lastIndexOf("\\")+1);
//当图片的名字中包含中文的时候 下面的很必要
pathName=URLEncoder.encode(pathName,"UTF-8");
//设置头
response.setHeader("content-disposition", "attachment;filename="+pathName);
//读图片
InputStream inputStream=new FileInputStream(path);
OutputStream out=response.getOutputStream();
int len=0;
byte[] buffer =new byte[1024];
while((len=inputStream.read(buffer))>0)
{
out.write(buffer,0,len);
}
out.close();
inputStream.close();
} catch (Exception e) {
}
}