Day21-Sevlet与会话

Posted 2月2日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day21-Sevlet与会话相关的知识,希望对你有一定的参考价值。

Servlet

简介

Servlet是sun公司开发动态web的一门技术

实现

Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

  • 编写一个类,实现Serlet接口
  • 把开发好java类部署到web服务器中。

Hello Servlet

  1. 创建一个maven项目

  2. 创建一个子模块,子模块可以调用父项目的各种依赖

  3. 在子模块中创建一个HelloServlet类

  4. 编写映射

    • 为什么需要映射?

      我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;

  5. 配置tomcat

  6. 开始测试

image-20210619200407914

原理

image-20210619194212489

Tomcat包含web服务器和web容器

Mapping

一个Servlet可以指定一个或者多个映射

特殊情况

/* 将该页面设置为首页
xx/*,访问xx开头任意结尾的页面

通配符存在优先级问题:指定了固定映射路径优先级最高,如果没有就使用默认的请求

ServletContext

Servlet上下文对象

运行过程

web容器在启动的时候,会为每个web程序创建一个ServletContext对象

作用

  1. 共享数据:保存web程序在运行过程中的所想要存储的数据,其他web程序可以调用

  2. 获取配置信息:通过context.getInitParamer()获取web.xml中配置的信息

     <context-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
        </context-param>
    
  3. 请求转发

    路径不发生改变

     @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

  4. 读取资源文件

java和resources俗称classes路径,可以读取写好的Properties资源文件

HttpServletResponse

  1. 发送数据
     PrintWriter writer = resp.getWriter();
     writer.print("HelloServlet");
  1. 下载文件
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1. 要获取下载文件的路径
    String realPath = "F:\\\\班级管理\\\\西开【19525】\\\\2、代码\\\\JavaWeb\\\\javaweb-02-servlet\\\\response\\\\target\\\\classes\\\\秦疆.png";
    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();
  1. 验证码功能

    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());
    
        }
    
  2. 重定向

    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中,通过该对象的方法,获取客户端请求的信息

作用

获取参数请求转发

image-20210620144238538

常用的两个方法

@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资源,最终关闭浏览的一个过程

保存会话的两个技巧

  • 客户端技术(响应,请求)
  1. 用户通过servlet发起请求

  2. 服务器检查是否存在cookie(req.getCookies(),返回一个cookie对象)

  3. 创建cookie,将cookie通过resp.addCookie()响应给客户端

  • 特点
    1. 一个Cookie只能保存一个信息,new Cookie(String str,String str),采用键值对的方式
    2. 一个web可以向浏览器发送多个cookie,最多存放20个
    3. Cookie大小限制为4kb
    4. 一般浏览器可以存储300个cookie

session

  • 服务器技术,保存用户信息,将用户信息存放在session中

什么是session

服务器给每一个用户(浏览器)创建一个Session对象,并将唯一的sessionID通过cookie保存在客户端

session的应用场景

  1. 保存用户登录信息
  2. 保存网站常用信息(如实现购物车功能)

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());

以上是关于Day21-Sevlet与会话的主要内容,如果未能解决你的问题,请参考以下文章

无法将数据库状态与会话同步

图与会话

身份验证:JWT 使用与会话

伪会话与会话 CICS 编程的优势是啥?

表单身份验证超时与会话超时

会话与会话工厂之间的差异 - 休眠?