JavaWeb_2022.11.29

目录

servlet_01

1.共享数据

2.面试问题:转发 重定向

3下载资源(了解)

4.验证码(了解)

5.获取随机数(验证码问题附带)

6.重定向/转发

7.jsp

8.cookie

ps:防止乱码(在方法最上部分)


servlet_01

package com.example.session_cookie_01;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.DataInput;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * @Author shawcd
 * @Description //TODO $
 * @Date $ $
 * @Param $
 * @return $
 */
@WebServlet(name = "cookisServlet",value = "/cookie")
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器 告诉你 你来的时间,把这个时间封装成为一个信件 你下次带来 我就知道你来了

        //解决中文乱码
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");

        //
        PrintWriter out = resp.getWriter();

        //Cookie 服务器端从客户端获取
        Cookie[] cookies = req.getCookies();
        //判断cookies是否存在
        if (cookies != null){
            out.write("你上一次访问的时间是:");
            //如果存在怎么办
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获得cookie的名字
                if (cookie.getName().equals("lastLoginTime")){
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toString());
                }
            }
        }else{
            out.write("这是您第一个访问本站!");
        }
        //服务器给客户端响应一个cookie

        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");

        //设置cookie持续时间为一天
        cookie.setMaxAge(60*60*24);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

1.共享数据

在一个servlet中保存的数据,可以在另一个servlet中获得!

2.面试问题:转发 重定向

同:都会跳转页面

不同:1、请求次数不同(重定向至少请求两次,转发请求一次;2、时地址栏会发生变化,而时地址栏不会发生变化;3、两次请求不共享数据,转发一次请求共享数据

在这里插入图片描述

3下载资源(了解)

  1. 向浏览器输出消息(一直在讲,就不说了)
  2. 下载文件
    1. 要获取下载文件的路径
    2. 下载的文件名是啥?
    3. 设置想办法让浏览器能够支持下载我们需要的东西
    4. 获取下载文件的输入流(写过的获取输入流文件)
    5. 创建缓冲区
    6. 获取OutputStream对象
    7. 将FileOutputStream流写入到bufer缓冲区
    8. 使用OutputStream将缓冲区中的数据输出到客户端!
@WebServlet(name = "fileServlet", value = "/response")
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        FileInputStream in = null;
        ServletOutputStream out = null;
        try {
            // 1. 要获取下载文件的路径
            String realPath = "D:\\AbandonIT\\Idea\\JavaWeb_kuangshen\\response\\target\\classes\\1.jpg";
            System.out.println("下载的文件路径是"+realPath);
            // 2. 下载的文件名是啥?
            String filename = realPath;
//        System.out.println("下载的文件名字叫"+filename);
            // 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
            resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename,"utf-8"));
//        System.out.println("测试03");
            // 4. 获取下载文件的输入流
            in = new FileInputStream(realPath);
//            System.out.println("测试04");
            // 5. 创建缓冲区
            int len;
            byte[] buffer = new byte[1024];
//            System.out.println("测试05");
            // 6. 获取OutputStream对象
            out = resp.getOutputStream();

            // 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
            if ((len = in.read(buffer)) > 0){
                out.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }

    }

4.验证码(了解)

@WebServlet(name="imageServlet",value="/image")
public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //如何让浏览器5秒刷新一次;
        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.cyan);
        graphics.setFont(new Font(null,Font.BOLD,20));
        graphics.drawString(makeNum(),0,20);

        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpg");

        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

        //把图片写给浏览器
        ImageIO.write(image, "jpg", resp.getOutputStream());

    }

    //生成随机数
    public String makeNum(){
//        Random random = new Random();
//        String num = random.nextInt(9999)+"";
//        StringBuffer sb = new StringBuffer();
//        for (int i = 0; i < 4-num.length(); i++) {
//            sb.append("0");
//        }
//        num=sb.toString()+num;
//        return num;

        String num = (int)((Math.random()*9+1)*1000)+"";
        return num;
    }


}

5.获取随机数(验证码问题附带)

生成6位随机数(不会是5位或者7位,仅只有6位):

System.out.println((int)((Math.random()*9+1)*100000));

同理,生成5位随机数:

System.out.println((int)((Math.random()*9+1)*10000));

同理,生成4位随机数:

System.out.println((int)((Math.random()*9+1)*1000));

6.重定向/转发

6.1重定向

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username +":" + password);

        resp.sendRedirect("/response/success.jsp");
    }

6.2 转发


        req.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");

        System.out.println("username = " + username);
        System.out.println("password = " + password);
        System.out.println(Arrays.toString(hobbys));

        req.getRequestDispatcher("/success.jsp").forward(req,resp);

7.jsp

<html>
<body>
<h2>Hel1o World!</h2>

<%--这里超交的路径,需要寻找到项目的路径--%>
<%--${pageContext. request, contextPath}代表当前的项目--%>
<form action="${pageContext. request.contextPath}/request" method="get">
  用户名: <input type="text" name="username"> <br>
  密码: <input type="password" name="password"> <br>
  <input type="submit">
</form>

</body>
</html>

8.cookie

  1. 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你; seesion

 

cookie:一般会保存在本地的 用户目录下 appdata;

  • 一个网站cookie是否存在上限!聊聊细节问题
  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
  • Cookie大小有限制4kb;
  • 300个cookie浏览器上限

删除Cookie;

不设置有效期,关闭浏览器,自动失效;
设置有效期时间为 0 ;
 

 概括代码

Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie

 全部代码

package com.example.session_cookie_01;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.DataInput;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * @Author shawcd
 * @Description //TODO $
 * @Date $ $
 * @Param $
 * @return $
 */
@WebServlet(name = "cookisServlet",value = "/cookie")
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器 告诉你 你来的时间,把这个时间封装成为一个信件 你下次带来 我就知道你来了

        //解决中文乱码
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");

        //
        PrintWriter out = resp.getWriter();

        //Cookie 服务器端从客户端获取
        Cookie[] cookies = req.getCookies();
        //判断cookies是否存在
        if (cookies != null){
            out.write("你上一次访问的时间是:");
            //如果存在怎么办
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获得cookie的名字
                if (cookie.getName().equals("lastLoginTime")){
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toString());
                }
            }
        }else{
            out.write("这是您第一个访问本站!");
        }
        //服务器给客户端响应一个cookie

        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");

        //设置cookie持续时间为一天
        cookie.setMaxAge(60*60*24);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

 

 

 

ps:防止乱码(在方法最上部分)

req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值