1.浏览器访问Servlet的过程
Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()方法(doPost,doGet)之前,都会创建两个对象,分别是HttpServletRequest和HttpServletResponse对象。其中,HttpServletRequest用于封装HTTP请求消息,简称request对象。HttpServletResponse用于封装HTTP响应消息,简称response对象。
2.Http响应消息
Http响应消息分为状态行、响应消息头、消息体三部分。在HttpServletResponse接口定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。
2.1 发送状态码相关的方法
1.setStatus(int status)方法
该 方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。
常见的状态码:
200:正常
404:找不到页面
500:服务器出错
2.sendError(int src)方法
两个重载的sendError(int src)方法
public void sendError(int code) throws IOException
public void sendError(int code,String message) throws IOException
2.2 发送响应消息头相关的方法
void setContentType(String type):
该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8
void setCharacterEncoding(String charset)
该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。setCharacterEncoding()方法比setContentType()和setLocale()方法的优先权高,它的设置结果将覆盖setContentType()和setLocale()方法所设置的字符码表
voidsetContentLength(int len)
该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值
HTTP响应头字段的方法见教材4-1
2.3 发送响应消息体相关的方法
在Http响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法。
1.字节流 getOutputStream()方法
–该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。
String data="itcast";
OutputStream out=response.getOutputStream();// 获取输出流对象
out.write(data.getBytes()); // 输出字符串信息getBytes()将字符串转换为字节
2.字符流getWriter()方法
–该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。
注意:字节流与字符流相互排斥
3.HttpServletResponse应用
3.1 中文输出乱码问题
由于计算机中的数据都是以二进制形式存储的,当传输文本时,如果编码和解码使用的码表不一致,就会导致乱码问题.
字符与字节之间的转换是通过查码表来完成的,将字符转为字节的过程称为编码,将字节转换成字符的过程称为解码,如果编码与解码使用的码表不一致,就会导致乱码。
例 5-3
String data=“中国”;
PrintWriter out = response.getWriter();
out.println(data);
原因分析:编码:ISO 8859-1 ,但解码浏览器采用utf-8
解决问题
指定浏览器的编码:
response.setHeader(“Content-Type”,”text/html;charset=utf-8”)
3.2 网页定时刷新并跳转
每隔3秒刷新页面
response.setHeader(“Refresh”, “3”);
PrintWriter out = response.getWriter();
out.println(new Date());
2秒后跳转页面
response.setHeader(“Refresh”, “2;URL=http://www.itcast.com”);
3.3 禁止浏览器缓存页面
在编程时,通常会出现这样的情况,明明修改过代码,但是显示出来还是原来的页面,这是为什么呢?这时,我们应该思考是否是缓存的问题。缓存可以加快网页加载的速度,但是也会影响网页的部分功能。如果想要避免缓存页面,则需要在HTTP响应消息中,设置几个头字段
response.setDateHeader(“Expires”,0);
response.setHeader(“Cache-Control”,“no-cache”);
response.setHeader(“Pragma”,“no-cache”);
3.4 请求重定向
有时针对客户端的请求,一个Servlet类可能无法完成全部工作。这时可以使用请求重定向(sendRedirect()方法)来完成。sendRedirect()方法的工作原理。
4-7 login.html
<!--把表单内容提交到chapter05工程下的LoginServlet-->
<form action="/LoginServlet"method="post">
用户名: <input type="text" name="username"/><br>
密 码:<input type="password" name="password" /><br>
<input type="submit" value="登录" />
</form>
例 4-8 welcome.html
<html>
<head>
<title>Insert title here</title>
</head>
<body>
欢迎你,登录成功!
</body>
</html>
LoginServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 用HttpServletRequest对象的getParameter()方法获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 假设用户名和密码分别为:itcast和123
if (("itcast").equals(username)&&("123").equals(password)) {
// 如果用户名和密码正确,重定向到 welcome.html
response.sendRedirect("/chapter05/welcome.html");
} else {
// 如果用户名和密码错误,重定向到login.html
response.sendRedirect("/chapter05/login.html");
}
}