Servlet-----HttpServletResponse类(响应字符数据、响应字节数据以及重定向)的介绍、代码实现
Servlet-----HttpServletResponse类(响应字符数据、响应字节数据以及重定向)的介绍、代码实现
1.HttpServletResponse类的简介
HttpServletResponse类是实现响应的一个类,他将将要响应的数据封装到response对象里面,通过特定的方法响应。响应数据的响应行,响应头,响应体分别由setStatus()、setHeader ()、getWriter() 和getOutputStream()几个方法实现。下面着重介绍 getWriter()(响应字符数据) 和getOutputStream()(响应字节数据)方法。前面我们说到Servlet请求的转发,他是在服务器里面跳转资源的方式。这里介绍的重定向也有类似的功能,但是实现的原理有所不同。
2.响应字符数据
通过response对象,将你想要响应到客户端的字符型数据发送到浏览器里面。只用两步就可以实现:
1、先通过response对象获取字符输出流:PrintWriter writer = resp.getWriter();
2、将你想要写的数据通过write()方法响应到客户端:writer.write()。
public class HttpServletResponse001 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("hello servlet!!!");
}
}
需要注意的几点:
1.response不仅可以返回纯文本,还可以HTML的各个标签。在返回标签时要注意先把响应响应头的ContentType属性改成text/html格式,不然浏览器会默认把相应的内容当成纯文本解析。
public class HttpServletResponse001 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
writer.write("hello servlet!!!");
writer.write("<br/>name:<input type = 'text'/>");
}
}
2.如果响应的是中文的内容,需要把响应头字体类型改成UTF-8。因为服务器默认的字体类型是ISO-8859-1,如果不修改会导致浏览器解析乱码。
public class HttpServletResponse001 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setContentType("text/html");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("我的servlet程序!!!");
writer.write("<br/>姓名:<input type = 'text'/>");
}
}
3.修改响应头等信息需要在通过response对象获取字符输出流就完成,在后面才修改没有效果。
public class HttpServletResponse001 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setContentType("text/html");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
// resp.setContentType("text/html;charset=utf-8");
writer.write("aaaaa这是在获取输入流对象之前就修改响应头的。");
writer.write("<br/>姓名:<input type = 'text'/>");
}
}
4.响应结束后,相应的字符流不需要关闭。他不需要向像Java基础里面字节输入流那种最后需要手动关闭流节省资源。因为在响应结束后,response对象自动销毁,服务器会对其关闭。
3.响应字节数据
通过response对象,将你想要响应到客户端的字符型数据发送到浏览器里面。大致需要3步完成:
1、读取文件(图片,音频,视频等二进制输入输出数据)
2、获取字节输出流
3、通过write()方法响应给客户端
public class HttpServletResponse002 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.读物文件
FileInputStream inputStream = new FileInputStream("C:\\Users\\cx\\Desktop\\1.png");
//2.获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
//3.打印文件
byte []b = new byte[2048];
int len = 0;
while ((len = inputStream.read(b))!=0){
outputStream.write(b,0,len);
}
inputStream.close();
}
}
4.重定向
1.重定向与请求的转发的区别
- 重定向特点;
(1)浏览器地址栏会发生改变,会变成servlet程序1中指定的地址
(2)是两次请求
(3)多个servlet程序不共享request对象内的数据
(4)不可以访问WEB-INF下的资源
(5)可以访问工程以外的其他连接(例如百度、谷歌等网页资源) - 请求转发的特点(参考我另一篇博客)
(1)浏览器地址栏没有发生变化。
(2)多个servlet程序是同一个请求
(3)多个servlet程序共享一个request对象
(4)可以转发到WEB-INF目录下
2.重定向与请求转发的图示区别
求情的转发:
重定向:
3.重定向程序的实现
第一种:
@WebServlet("/httpServletResponse003")
public class HttpServletResponse003 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("servlet001!!!");
//设置响应状态码(302)
resp.setStatus(302);
//设置响应头,告诉新地址在哪
resp.setHeader("location","http://localhost:8888/servlet_war_exploded/httpServletResponse004");
}
}
第二种:
@WebServlet("/httpServletResponse005")
public class HttpServletResponse005 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("http://localhost:8888/servlet_war_exploded/httpServletResponse004");
}
}
两种方法只要访问了第一个servlet程序再回车,浏览器会自动跳到localhost:8888/servlet_war_exploded/httpServletResponse004而且浏览器地址栏会发生变化。与请求不同,虽然是两个页面,但是是同一个地址(即浏览器地址栏不会发生变化),这与上述所说的第一个特点相对应。
更多推荐
所有评论(0)