web服务器接收到客户端的http请求,针对这个请求分别创建一个代表请求的HttpServletRequest对象和一个代表响应的一个HttpSerlvetResponse对象
获取客户端传来的参数,找HttpServletRequest
如果要给客户端响应一些信息,找HttpSerlvetResponse
负责向浏览器发送数据的方法(HttpSerlvetResponse)
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法(HttpSerlvetResponse)
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
应用:
1、向浏览器输出信息
2、下载文件
①要获取下载文件的路径
②下载的文件名是什么
③设置想办法我们能让浏览器支持下载我们需要的东西
④获取下载文件的输入流
⑤创建缓冲区
⑥获取OutputStream对象
⑦将FileOutputStream流写入到buffer缓冲区
⑧使用OutputStream将缓冲区中的数据输出到客户端
package chap2;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1、要获取下载文件的路径String realPath = getServletContext().getRealPath("/img/img1.jpg");System.out.println("下载文件的路径"+realPath);//2、下载的文件名是什么String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);//3、设置想办法我们能让浏览器支持下载我们需要的东西resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));//4、获取下载文件的输入流FileInputStream in = new FileInputStream(realPath);//5、创建缓冲区int len=0;byte[] buffer = new byte[1024];//6、获取OutputStream对象ServletOutputStream out = resp.getOutputStream();//7、将FileOutputStream流写入到buffer缓冲区//8、使用OutputStream将缓冲区中的数据输出到客户端while ((len=in.read(buffer))>0){out.write(buffer,0,len);}in.close();out.close();}
}
package chap2;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;public class ImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//让浏览器三秒刷新一次resp.setHeader("refresh","3");//在内存中创建一个图片BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//得到图片Graphics2D graphics = (Graphics2D) image.getGraphics();//笔//设置图片的背景颜色graphics.setColor(Color.white);graphics.fillRect(0,0,80,20);//给图片写数据graphics.setColor(Color.BLUE);graphics.setFont(new Font(null,Font.ITALIC,20));graphics.drawString(makenum(),0,20);
// 告诉浏览器,这个请求是用图片的方式打开的resp.setContentType("image/jpeg");
// 网站存在缓存,不让浏览器缓存resp.setDateHeader("expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");
// 把图片写给浏览器ImageIO.write(image,"jpg",resp.getOutputStream());}private String makenum(){Random random = new Random();String num = random.nextInt(999999) + "";StringBuffer stringBuffer = new StringBuffer();for (int i = 0; i <7-num.length() ; i++) {stringBuffer.append("0");}String s=stringBuffer.toString()+num;return s;}
}
B收到A的请求后,通知A去访问C,即重定向
常见场景:用户登录
void sendRedirect(String var1) throws IOException;
package chap2;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重定向的原理
// resp.setHeader("Location","/image");
// resp.setStatus(302);resp.sendRedirect("/image");}
}
<%--设置中文编码--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%--设置识别EL表达式--%>
<%@page isELIgnored="false" %>
Hello World!
package chap2;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if (username.equals("admin")&&password.equals("123456")){resp.sendRedirect("/image");}else {resp.sendRedirect("index.jsp");}}
}
HttpServletRequest代表客户端的请求
用户通过Http协议访问服务器,Http请求中的所有信息都会被封装到HttpServletRequest对象中
通过HttpServletRequest的方法获取所有信息
<%--Created by IntelliJ IDEA.User: KerwinWanDate: 2023/1/13Time: 19:09To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录
package chap2;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;public class LoginServlet2 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("Utf-8");String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbies = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobbies));if (username.equals("admin")&&password.equals("123456")){resp.sendRedirect("/image");}else {resp.sendRedirect("index.jsp");}}
}
会话:用户打开一个浏览器,点击了很多的超链接,访问了多个web资源,关闭浏览器,这样的过程成为会话
有状态会话:一个客户端访问过服务端后,下次访问的时候服务器已经认识这个客户端了,即有状态会话
如何证明一个网站来过:
1、服务器给客户端一个信件,客户端下次访问服务器带上信件就可以(信件也就是cookie)
2、服务器登记你来过了,下次你来的时候我来匹配你
cookie和session是保存会话的两种技术
cookie是客户端技术,session是服务器技术,可以保存会话信息
cookie一般会保存在本地的 用户目录下(appdata)
cookie的一些细节:
1、一个cookie只能保存一个信息
2、一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
3、cookie大小有限制4kb
4、浏览器最多有300个cookie
删除cookie:
1、不设置有效期,关闭浏览器,自动失效。
2、设置有效期为0。
package chap2;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.sql.Date;
import java.util.Arrays;//保存用户上一次访问时间
public class CookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服务器直接告诉用户来的时间,时间作为一个信件,下次带来
// 解决中文乱码问题req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html");PrintWriter out = resp.getWriter();
// cokkie,服务器端从客户端获取Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie存在多个
// 判断cookie是否存在System.out.println(Arrays.toString(cookies));System.out.println(cookies.length);
// 编码解码System.out.println(URLEncoder.encode("张三","UTF-8"));System.out.println(URLDecoder.decode("kewein","UTF-8"));if (cookies.length>1){out.write("你上次访问的时间是");for (int i = 0; i < cookies.length; i++) {Cookie cookie = cookies[i];
// getName()方法获取cookie的key getValue()方法获取cookie的valueif (cookie.getName().equals("lastLoginTime")){long lastLoginTime=Long.parseLong(cookie.getValue());Date date = new Date(lastLoginTime);out.write(date.toLocaleString());}}}else {out.write("这是第一次访问本站");}
// 新建cookieCookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
// 设置cookie有效期为1天cookie.setMaxAge(24*60*60);
// 响应给客户端的一个cookieresp.addCookie(cookie);}
}
服务器给每个用户创建一个Session对象
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
用户登录之后,整个网络都可以访问
常用于保存用户的信息、保存购物车的信息等
每个用户的sessionid唯一
web.xml文件设置session默认失效时间
15
cookie和session的区别
cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
session把用户的数据写到用户独占session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
session对象由服务器创建
package chap2;import chap2.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;public class SessionServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("UTF-8");
// 得到session对象HttpSession session = req.getSession();
// 给session中存东西session.setAttribute("name",new Person("lisi",18));
// 获取session的IDString id = session.getId();
// 判断Session是不是新建的if (session.isNew()){resp.getWriter().write("session创建成功,ID:"+id);}else {resp.getWriter().write("session已经在服务器存在,ID:"+id);}
// session创建过程中如何运行
// Cookie cookie = new Cookie("JSESSIONID", id);
// resp.addCookie(cookie);}
}
package chap2;import chap2.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("UTF-8");
// 得到session对象HttpSession session = req.getSession();
// 给session中存东西Person person = (Person) session.getAttribute("name");System.out.println(person.toString());}
}
package chap2;import chap2.pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionServlet3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("UTF-8");
// 得到session对象HttpSession session = req.getSession();
// 删除session中的数据session.removeAttribute("name");
// 手动注销sessionsession.invalidate();}
}