HttpResponse对象
request对象:
获取客户端数据
response对象:
向客户端输出数据
常用方法 描述
addHeader(String name, String value) 添加指定的键值到响应头信息中
containsHeader(String name) 判断响应的头部是否被设置
encodeURL(String url) 编码指定的 URL
sendError(int sc) 使用指定状态码发送一个错误到客户端
setHeader(String name, String value) 设置指定响应头的值
setStatus(int sc) 给当前响应设置状态
setContentType(String ContentType) 设置响应的 MIME 类型
getWriter() 获取输出字符流
getOutputStream() 获取输出的字节流
刷新和页面自动跳转
resp.setHeader("refresh","2")
1. 常用方法
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("s01.....");
resp.addHeader("aaa", "bbb");
boolean containsHeader = resp.containsHeader("Date");
System.out.println(containsHeader);
System.out.println(resp.containsHeader("aaa"));
resp.setHeader("aaa", "ccc");
resp.setStatus(200);
resp.setContentType("text/html;charset=utf-8");
resp.getOutputStream().write("Hello World
".getBytes());
}
}
2. 自动跳转
public class Servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh","3;http://www.jd.com");
response.setHeader("refresh", "3;url=index.html");
}
解决响应乱码
后台服务器默认是ISO-8859-1 前后台字符集不一样出现乱码
1. 字符流输出出现乱码(response.getWriter().write("你好啊
");)
设置服务器默认编码字符集 没有设置时显示??? 设置成UTF-8显示浣犲ソ鍟�
解决办法: a.设置成GBK (只能针对前台是GBK字符集)
b.同时指定前台和后台的字符集
(response.setContentType("text/html;charset=utf-8"))
2. 字节流输出出现乱码(response.getOutputStream().write("你好
".getBytes());) 前台编码GBK 显示浣犲ソ鍟� .getBytes() 默认当前eclipse环境使用的编码
解决办法: a. 因为前台是GBK,所以设置后台字符集GBK
response.getOutputStream().write("你好啊
".getBytes("GBK"));
b. 或者指定前台为UTF-8
response.setHeader("content-type", "text/html;charset=UTF-8");
同时解决输出字节流和输出字符流 乱码问题
response.setContentType("text/html;charset=utf-8");
public class Servlet03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getOutputStream().write("你好啊
".getBytes("UTF-8"));
}
}
响应图片
两种方式显示图片
a. img标签
b. 动态响应图片给客户端,通过输入流读取到内存,然后通过输出流写出到客户端即可。值得注意的是,在客户端解析资源时默认是以文本(text/html)的形式,当响应图片时需要指定响应头信息,告知客户端响应内容为图片形式,使用一种叫做 MIME 类型的东西来指定。MIME 类型见Tomcat 的 web.xml 文件
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String imageName = request.getParameter("imageName");
if(imageName == null || "".equals(imageName)){
response.getWriter().write("请告诉我你要看啥图片");
return;
}
String realPath = request.getServletContext().getRealPath("/WEB-INF/image/");
System.out.println(realPath);
System.out.println(realPath + imageName);
File file = new File(realPath + imageName);
if(file != null && file.isFile()){
String imageType = imageName.split("\\.")[1];
if("jpg".equals(imageType) || "jpeg".equals(imageType)){
response.setContentType("image/jpeg;charset=utf-8");
}else if("png".equals(imageType)){
response.setContentType("image/png;charset=utf-8");
}else if("gif".equals(imageType)){
response.setContentType("image/gif;charset=utf-8");
}
FileInputStream in = new FileInputStream(file);
ServletOutputStream out = response.getOutputStream();
byte[] car = new byte[1024];
int len = 0;
while((len = in.read(car)) != -1){
out.write(car, 0, len);
}
in.close();
out.close();
}else{
response.getWriter().write("请输入正确的图片名称");
return;
}
}
}
重定向跳转
路径问题:
相对路径:
书写路径时,无论是哪类请求相对路径都是相对当前资源的路径
书写格式:直接从当前路径开始写,目录前不加任何符号;a.html html/b.html
相对路径在请求转发时可能会失效,在请求转发的情况下,因为地址栏不会发生改变,因此开发中不推荐使用相对路径
绝对路径:
格式:以 http:// 开头,或者以 / 开头
❤浏览器中:“/”代表的是 http://主机|IP:端口
❤服务器中:“/”代表的是 http://主机|IP:端口/站点名
public class Servlet01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("s01...");
request.getRequestDispatcher("a/index.html").forward(request, response);
}
}
Cookie
Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端
进行处理的数据,放在本地的计算机上,无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信
息不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是
服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie 来
实现。
Cookie的创建和发送:f12查看
// 创建Cookie对象
Cookie cookie = new Cookie("A", "aa");
// 响应给客户端
resp.addCookie(cookie);
2. Cookie的获取
// 获取客户端的Cookie数组
Cookie[] cookies = req.getCookies();
// 判断是否为空
if(cookies != null && cookies.length > 0){
// 遍历
for (Cookie cookie : cookies) {
// 键名称
String name = cookie.getName();
// 值
String value = cookie.getValue();
System.out.println("键:" + name + ",值:" + value);
}
}
3. Cookie到期时间设置
到期时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效,以秒为单位
public class Cookie03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 键相同,则覆盖
// 创建cookie
Cookie cookie = new Cookie("uname","xiaoqiang");
// 设置maxAge过期时间 默认 -1 保存在浏览器缓存中 关闭浏览器失效
//cookie.setMaxAge(-1);
// 正整数设置过期时间7天,单位为s
//cookie.setMaxAge(7*24*60*60);
// 0 立即失效 cookie的销毁
cookie.setMaxAge(0);
// 发送
response.addCookie(cookie);
}
}