注解开发取代web.xml
@WebServlet,注解添加到自己定义的Servlet中的类声明上即可。注解的属性 urlPatterns,属性值就是浏览器的访问地址。
IDEA配置代码模板
非注解版的
注解版的
HttpServletResponse类
概述
response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。
response对象的功能分为以下四种:
-
设置响应头信息;
-
发送状态码;
-
设置响应正文;
-
重定向;
注解创建Servlet
在包下新建new
、选择Create new Servlet
、文件名该为/
加首字母小写。
//@WebServlet(name = "HelloServlet",urlPatterns = "/helloServlet")
//name = "HelloServlet":servlet名称,相当于web.xml中的<servlet-name>
//urlPatterns = "/helloServlet":servlet的访问路径,相当于<url-pattern>
@WebServlet(urlPatterns = "/helloServlet")
public class HelloServlet extends HttpServlet {
}
响应正文
response是响应对象,向客户端输出响应正文(响应体)可以使用response的响应流,repsonse 一共提供了两个响应流对象:
字节流 :getOutputStream():常用于下载(传递二进制数据) 。
字符流 :getWriter():常用于回传字符串(常用) 。
-
PrintWriter out = response.getWriter()
:获取字符流。 -
ServletOutputStream out = response.getOutputStream()
:获取字节流。
当然,如果响应正文内容为字符,那么使用response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用response.getOutputStream()。
注意,在一个请求中,不能同时使用这两个流。也就是说,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用这两个流。不然会抛出IllegalStateException
异常。
**往客户端回传数据 **
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 要求 : 往客户端回传 字符串 数据。
PrintWriter writer = resp.getWriter();
writer.write("response's content!!!");
}
}
缓冲区
response.getWriter()是PrintWriter类型,所以它有缓冲区,缓冲区的默认大小为8KB。也就是说,在响应数据没有输出8KB之前,数据都是存放在缓冲区中,而不会立刻发送到客户端。当Servlet执行结束后,服务器才会去刷新流,使缓冲区中的数据发送到客户端。如果希望响应数据马上发送给客户端:
-
向流中写入大于8KB的数据;
-
调用response.flushBuffer()方法来手动刷新缓冲区;
响应的乱码解决
解决响应中文乱码方案一(不推荐使用):
// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
解决响应中文乱码方案二(推荐):
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");
设置响应头信息
可以使用response对象的setHeader()方法来设置响应头。使用该方法设置的响应头最终会发送给客户端浏览器。
response.setHeader(“content-type”, “text/html;charset=utf-8”)
:设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”)
;
response.setHeader("Refresh","5; URL=http://www.baidu.com")
:5秒后自动跳转到百度主页。
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
重定向使用场景:跨域访问 、希望修改浏览器地址栏的路径。
重定向是两次请求;增加访问压力。
重定向的URL可以是其他应用,不局限于当前应用。
重定向的响应头为302,并且必须要有Location响应头。
重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常。
请求重定向的第一种方案:
// 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");
请求重定向的第二种方案(推荐使用):
resp.sendRedirect("http://www.baidu.com");
//重定向的URL地址为:http://localhost:8080/hello/BServlet
resp.sendRedirect("/hello/BServlet");
评论区