响应数据分为3部分:
1:响应行 HTTP/1.1 200 OK
void setStatus(int sc) 设置响应状态码
2响应头 Content-type :text/html
void setHearder(String name,String value) 设置响应键值对
3:响应体 <html><head><body></body></html>
PrintWriter getWriter() 获取字符输出流
ServletOutputStream getOUtputStream() :获取字节输出流
Response完成重定向
重定向(Redirect):一种资源跳转方式
实现方式:
resp.setStatus(302)
resp.setHeader("location","资源的虚拟路径")
或者
resp.sendRedirect("要跳转的虚拟路径");
重定向特点:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部,外部均可) 因为浏览器发了两次请求
两次请求,不能再多个资源使用request共享数据
package Response;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/res1")public class Response1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("res1......");//第一种方法// resp.setStatus(302);// resp.setHeader("location","res2");//快捷方法// resp.sendRedirect("Servlet-demo1/res2");String contextPath = req.getContextPath();resp.sendRedirect(contextPath+"/res2");//这样获取路径更完美}}
package Response;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/res2")public class Response2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("res2......");}}
路径问题
明确路径的使用
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟路径
比如:
<a href=""> 加虚拟路径
<from action=""> 加虚拟路径
reg.getRequestDispatcher("路径" ) 不加虚拟路径
resp.sendRedirect("路径") 加虚拟路径
Response响应字符数据
使用:通过Response对象获取字符输入流
PrintWriter writer=resp.getWriter();
写数据
writer.write("数据");
如需要写html代码,或者中文需要设置流的规则
resp.setContentType("text/html;charset=utf-8");
package Response;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;@WebServlet("/res3")public class Response3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");//设置流编码规则PrintWriter writer = resp.getWriter();writer.write("牛马");writer.write("aaa");writer.write("</br>");writer.write("11");}}
流不需要关闭,随着响应结束,Response对象销毁,由服务器关闭
字节流的使用
通过Response对象获取字符输出流
ServletOutputStream os=resp.getOutputStream();
写数据
OutputStream.write(字节数据);
package Response;import mons.io.IOUtils;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;@WebServlet("/res4")public class Response4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取文件,字节输入流FileInputStream fs = new FileInputStream("F:\\1.png");//获取Response,输出流ServletOutputStream os = resp.getOutputStream();//进行拷贝// byte[] bytes = new byte[1024];// int len=0;// while ((len=fs.read(bytes))!=-1){// os.write(bytes,0,len);// }// fs.close();//关闭流//这里我们直击导坐标,调用方法 ,流对拷IOUtils.copy(fs,os);}}
io工具包
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>