HttpServletResponse

     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进制数值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值