Response对象
Response功能
- 设置响应行
- 格式:HTTP/1.1 200 ok
- 设置状态码:setStatus(int sc)
- 设置响应头:setHeader(String name, String value)
- 设置响应体:
- 获取输出流
1.1 字符输出流:PrintWriter getWriter()
1.2字节输出流:ServletOutputStream getOutputStream() - 使用输出流,将数据输出到客户端浏览器:ServletOutputStream.write()
- 获取输出流
代码示例
package servlet.response;
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.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/demo")
public class ResponseTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码
resp.setCharacterEncoding("utf-8");
//设置状态码
resp.setStatus(300);
//设置响应头
resp.setHeader("content-type","text/html;charset=utf-8");
/*
* //获取输出流
PrintWriter printWriter=resp.getWriter();
//使用输出流,将数据输出到客户端浏览器
printWriter.write("<h1>hello 你好</h1>");
* */
//获取字节输出流
ServletOutputStream servletOutputStream = resp.getOutputStream();
//输出数据,字符数据要转换为字节
servletOutputStream.write("字节输出".getBytes("utf-8"));
}
}
forward 和 redirect 区别
- 重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据 - 转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
重定向代码示例
demo资源
package servlet.response;
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.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/demo")
public class ResponseTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo...");
//动态获取虚拟目录
String path=req.getContextPath();
resp.sendRedirect(path+"/demo2");
//resp.sendRedirect("http://www.baidu.com");
}
}
demo2资源
package servlet.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(urlPatterns = "/demo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo2......");
}
}
ServletContext对象
- 获取方式:
- 通过request对象获取
- request.getServletContext();
- 通过HttpServlet获取
- this.getServletContext();
- 通过request对象获取
ServletContext功能
- 获取MIME类型:
- MIME类型:在互联网通信过程中定义的一种文件数据类型
- 格式: 大类型/小类型 text/html image/jpeg
- 域对象:共享数据
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
ServletContext对象范围:所有的用户请求共享
代码示例
demo1
package servlet.response;
import javax.servlet.ServletContext;
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.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/demo1")
public class ResponseTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servletContext = req.getServletContext();
//获取MIME类型
String img = "a.jpg";//image/jpeg
String mimeType = servletContext.getMimeType(img);
System.out.println(mimeType);
//设置共享数据
servletContext.setAttribute("msg", "hello");
}
}
demo2
package servlet.response;
import javax.servlet.ServletContext;
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(urlPatterns = "/demo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取servletContext对象
ServletContext servletContext=req.getServletContext();
//demo2请求获取共享数据
Object object=servletContext.getAttribute("msg");
System.out.println(object);
}
}
- 获取文件的真实(服务器)路径
方法:String getRealPath(String path)
代码示例
package servlet.response;
import javax.servlet.ServletContext;
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.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/demo1")
public class ResponseTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servletContext = req.getServletContext();
//获取文件真实路径,一般文件放在web,web-inf,src三个目录下
//web目录
String path=servletContext.getRealPath("/web.txt");
System.out.println(path);
//web-inf目录
path=servletContext.getRealPath("/WEB-INF/web_inf.txt");
System.out.println(path);
//src目录
path=servletContext.getRealPath("/WEB-INF/classes/src.txt");
System.out.println(path);
}
}