HttpServletResponse

来源:互联网 发布:金庸群侠传 武功数据 编辑:程序博客网 时间:2024/05/29 02:49
     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进制数值
原创粉丝点击