Day21-Sevlet与会话
Servlet
简介
Servlet是sun公司开发动态web的一门技术
实现
Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
- 编写一个类,实现Serlet接口
- 把开发好java类部署到web服务器中。
Hello Servlet
- 
创建一个maven项目 
- 
创建一个子模块,子模块可以调用父项目的各种依赖 
- 
在子模块中创建一个HelloServlet类 
- 
编写映射 - 
为什么需要映射? 我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径; 
 
- 
- 
配置tomcat 
- 
开始测试 

原理

Tomcat包含web服务器和web容器
Mapping
一个Servlet可以指定一个或者多个映射
特殊情况
/* 将该页面设置为首页
xx/*,访问xx开头任意结尾的页面
通配符存在优先级问题:指定了固定映射路径优先级最高,如果没有就使用默认的请求
ServletContext
Servlet上下文对象
运行过程
web容器在启动的时候,会为每个web程序创建一个ServletContext对象
作用
- 
共享数据:保存web程序在运行过程中的所想要存储的数据,其他web程序可以调用 
- 
获取配置信息:通过 context.getInitParamer()获取web.xml中配置的信息<context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param>
- 
请求转发 路径不发生改变 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.print("HelloServlet"); ServletContext servletContext = req.getServletContext(); servletContext.getRequestDispatcher("path").forward(req,resp); //在Path中添加请求转发的url }![image-20210619221043166]() 
- 
读取资源文件 
java和resources俗称classes路径,可以读取写好的Properties资源文件
HttpServletResponse
- 发送数据
     PrintWriter writer = resp.getWriter();
     writer.print("HelloServlet");
- 下载文件
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1. 要获取下载文件的路径
    String realPath = "path";
    System.out.println("下载文件的路径:"+realPath);
    // 2. 下载的文件名是啥?
    String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    // 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
    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缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
    while ((len=in.read(buffer))>0){
        out.write(buffer,0,len);
    }
    in.close();
    out.close();
- 
验证码功能 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器3秒自动刷新一次; resp.setHeader("refresh","3"); //在内存中创建一个图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D g = (Graphics2D) image.getGraphics(); //笔 //设置图片的背景颜色 g.setColor(Color.white); g.fillRect(0,0,80,20); //给图片写数据 g.setColor(Color.BLUE); g.setFont(new Font(null,Font.BOLD,20)); g.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()); }
- 
重定向 ![image-20210620140808354]() 
resp.sendRedirect("path")
访问这个页面时,会跳转到path页面
小功能
页面刷新
resp.setHeader("refresh",3)
生成随机数
public static String makeNum(){    Random random = new Random();    //生成一个0-999999范围内的随机数    String num = random.nextInt(999999)+"";    //创造一个可变字符串    StringBuffer s= new StringBuffer();    for(int i=0;i<6-num.length;i++){        //当生成位数不足6位时,自动补0        s.append("0");    }    return s+num;}
重定向和转发的区别
相同点:页面都会实现跳转
不同点:请求转发url地址不改变,重定向则会改变url地址
HttpRequest
代表客户端的请求
过程:用户通过Http协议访问服务器,HTTP请求中的所有信息会封装到HttpRequest中,通过该对象的方法,获取客户端请求的信息
作用
获取参数请求转发

常用的两个方法
@Overrideprotected void doGet(HttpservletRequest req. HttpservletResponse resp) throws ServletException, IOException {	//解决中文乱码问题	req. setcharacterEncoding("utf-8");	resp.setcharacterEncoding("utf-8");    //获取参数	String username = req.getParameter("username");	String password = req.getParameter("password");	String[] hobbys = req.getParameterValues("hobbys");	System.out.println("==========");	//验证获取到的参数	System. out.println(username);	System. out.println(password);	System. out.println(Arrays.tostring(hobbys));	System. out.println("============");	system. out.println(req.getContextPath());	//请求转发	  req.getRequestDispatcher("/success.jsp").forward(req,resp);}
会话
用户打开一个浏览器,访问web资源,最终关闭浏览的一个过程
保存会话的两个技巧
cookie
- 客户端技术(响应,请求)
- 
用户通过servlet发起请求 
- 
服务器检查是否存在cookie(req.getCookies(),返回一个cookie对象) 
- 
创建cookie,将cookie通过resp.addCookie()响应给客户端 
- 特点
- 一个Cookie只能保存一个信息,new Cookie(String str,String str),采用键值对的方式
- 一个web可以向浏览器发送多个cookie,最多存放20个
- Cookie大小限制为4kb
- 一般浏览器可以存储300个cookie
 
session
- 服务器技术,保存用户信息,将用户信息存放在session中
什么是session
服务器给每一个用户(浏览器)创建一个Session对象,并将唯一的sessionID通过cookie保存在客户端
session的应用场景
- 保存用户登录信息
- 保存网站常用信息(如实现购物车功能)
session的使用
//获取session对象 HttpSession session = req.getSession();//给Session中存东西session.setAttribute("name",new Person("某某某",1));
//使用session中存放的对象HttpSession session = req.getSession();Person person = (Person) session.getAttribute("name");System.out.println(person.toString());
 
                    
                     
                    
                 
                    
                


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号