Javaweb学习笔记8(Response对象)
Posted huamanggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javaweb学习笔记8(Response对象)相关的知识,希望对你有一定的参考价值。
Response对象
功能:设置响应消息
- 设置响应行
- 格式:HTTP/1.1 200 ok
- 设置状态码:
setStatus(int sc)
- 设置响应头:
setHeader(String name, String value)
- 状态码的设置和响应头的设置,可以集合到
sendRedirect(String 路径)
方法里面一把嗦 - 设置响应体:
- 获取输出流
- 字符输出流:PrintWriter
getWriter()
- 字节输出流:ServletOutputStream
getOutputStream()
- 字符输出流:PrintWriter
- 使用输出流,将数据输出到客户端浏览器
- 获取输出流
重定向
笨方法
- 创建两个类demo1和demo2,我们要实现访问demo1会重定向到demo2
- 在demo1中:设置状态码302,设置重定向到demo2
demo1
@WebServlet("/demo1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 访问demo1后会跳转到demo2
*/
System.out.println("demo1");
//设置状态码302
resp.setStatus(302);
//设置响应头location
resp.setHeader("location","/demo2");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
demo2
@WebServlet("/demo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo2");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
访问一下demo1,发现重定向到了demo2
看输出结果,成功实现
< color=red>更好的方法
sendRedirect(String 路径)
由于设置状态码resp.setStatus(302);
和设置响应头resp.setHeader("location","/demo2");
只有路径是需要自己设置,其他的都是固定的,所以我们有一个专门用来重定向的方法,只需要填写路径就可以了
@WebServlet("/demo1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 访问demo1后会跳转到demo2
*/
System.out.println("demo1");
// 一把嗦
resp.sendRedirect("/demo2");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
成功重定向
重定向与转发
之前学过转发,功能好像和重定向很类似,这里列出他们的特点
重定向的特点:redirect
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
转发的特点:forward
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
输入输出流
输出字符数据
步骤:
- 获取字符输出流
- 输出数据
获取字符输出流:PrintWriter getWriter()
输出数据:xxx.write()
@WebServlet("/demo3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取字符输入流
PrintWriter pw = resp.getWriter();
// 输出字符
pw.write("hello world");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
输出字节数据
步骤:
- 获取字节输出流
- 输出数据
获取字节输出流:ServletOutputStream getOutputStream()
输出数据xxx.write()
@WebServlet("/demo4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设定字符编码
resp.setContentType("text/html;charset=utf-8");
// 获取字节输入流
ServletOutputStream sos = resp.getOutputStream();
// 输出字符
sos.write("hello world".getBytes());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
中文乱码
解决方法:
简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
原因:编解码使用的字符集不一致
以上是关于Javaweb学习笔记8(Response对象)的主要内容,如果未能解决你的问题,请参考以下文章
20160322 javaweb 学习笔记--response 重定向