HttpServletResponse

xiaoxiao2021-02-28  168

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进制数值
转载请注明原文地址: https://www.6miu.com/read-24354.html

最新回复(0)