Response内置对象和Cookie机制
Response内置对象
该内置对象主要用来处理用户的请求,如果要处理对用户的响应,需要使用到另外一个内置对象
该内置对象的类型是javax.servlet.http.HttpServletResponse,对象名就是response,这个内置对象是在调用service方法的时候容器会传递过来
我们直接在方法中使用即可
public void addCookie(Cookie cookie)
向客户端添加一个cookie信息到客户端浏览器,还可以为cookie设置生命时间
public void sendRedirect(java.lang.String location)
该方法可以实现客户端跳转,客户端跳转的方式有很多种,特征是:
1.浏览器地址栏信息改变
2.重新向服务器端发送了一个新的请求
public void setStatus(int sc)
可以设置响应的状态码
public java.io.PrintWriter getWriter()
取得一个向客户端输出的打印流对象,可以使用该对象实现信息的输出
public void setContentType(java.lang.String type)
可以设置响应的MIME类型和字符编码
向客户端输出信息:
package com.xie;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class EmpServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用response内置对象取得输出流对象
PrintWriter out = resp.getWriter();
//向客户端输出信息
out.print("这是服务端返回的数据");
out.close();
}
}
此时访问成功,也取得了输出的信息,但是出现了中文乱码现象,原因是输出的字符串的编码和浏览器的解析编码不一样导致的,此时可以设置为"UTF-8"
设置响应的字符编码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应的编码
resp.setContentType("text/html;charset=utf-8");
//使用response内置对象取得输出流对象
PrintWriter out = resp.getWriter();
//向客户端输出信息
out.print("这是服务端返回的数据");
out.close();
}
MIME 是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动指定应用程序来打开,常见的MIME有:
超文本标记语言文本:text/html
普通文本:.txt text/plain
RTF文本:.rtf application/rtf
GIF图形:.gif image/gif
JPEG图形:.jpeg,.jpg image/jpeg
GZIP文件:.gz application/x-gzip
TAR文件:.tar application/x-tar
观察服务端默认的cookie信息
一般情况默认第一次访问服务器的时候会默认添加有个cookie信息到浏览器,这个cookie信息就是客户端和服务端互相辨认的一个唯一标识,在客户第一次访问服务器的时候,服务器会创建一个标记,这个标记早容器(服务器端)中保存一份,之后再将这个标识做一个副本保存到浏览器端,第二次客户再次访问的时候会带上cookie信息,之后服务器取得就可以验证了
这个cookie是服务器自动创建并且保存到浏览器的,我们也可以创建自己的cookie保存到浏览器
创建自己的cookie
package com.xie;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class EmpServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie信息
Cookie c1 = new Cookie("c1", "1234");
Cookie c2 = new Cookie("c2", "abcd");
//把cookie保存到浏览器
resp.addCookie(c1);
resp.addCookie(c2);
}
}
此时cookie以及添加到了浏览器中,我们证明浏览器再次访问服务器端的时候会带上cookie信息
如果添加的cookie的名称相同则后面的cookie覆盖前面的cookie
在服务器端取得cookie信息
package com.xie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class EmpServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//取得cookie信息
Cookie [] cs = req.getCookies();
for (Cookie cookie : cs) {
System.out.println(cookie.getName()+"="+cookie.getValue());
}
}
}
cookie可以保存到浏览器端,但是保存的时间是多长呢?默认是浏览器关闭就没了。也可以自己设置
设置cookie存活时间
package com.xie;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class EmpServlet extends HttpServlet{
public void addCookie(HttpServletRequest req, HttpServletResponse resp) {
//创建cookie对象
Cookie c1 = new Cookie("c1", "aaaaaaaaaa");
//设置存活时间,以秒为单位
c1.setMaxAge(60*60*24);
Cookie c2 = new Cookie("c1", "bbbbbbbbbb");
//添加到浏览器Duang
resp.addCookie(c1);
resp.addCookie(c2);
}
}