Maven

Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。

主要功能就是通过配置xml可以自动获取jar包不用手动去添加。

Maven部署项目流程

ServletContext

ServletContext(Servlet上下文)是Java Web应用程序中的一个对象,它代表了整个Web应用程序的运行环境。每个Web应用程序都有唯一的ServletContext实例。它允许Servlet之间进行通信,并提供了一些功能来管理应用程序的生命周期和配置参数。

1、共享数据,请求转发

通过ServletContext来共享数据,HelloServlet类 设置域对象username,通过请求转发的方式 HelloServlet02类获取域对象

@WebServlet("/s1")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext  = this.getServletContext();
        // 设置域对象
        servletContext.setAttribute("username","张三");

        // 请求转发
        req.getRequestDispatcher("/s2").forward(req,resp);
        System.out.println("进入了s2");    

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
    }
}


@WebServlet("/s2")
public class HelloServlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext  = this.getServletContext();

        //获取域对象 username
        String username = (String) servletContext.getAttribute("username");

        //获取到的内容 张三
        System.out.println(username);

    }

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

2、读取Maven下的资源文件properties

通过加载resources下的dp.properties 用流的方式读取配置文件属性username和password

@WebServlet("/s3")
public class HelloServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 通过ServletContext获取资源文件的输入流
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

        // 创建Properties对象
        Properties prop  = new Properties();

        // 加载属性文件
        prop.load(is);

        // 获取username和password属性的值
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        // 打印属性值
        System.out.println(username + "\t" + password);
        response.getWriter().print(username + "\t" + password);

    }
}

HttpServletResponse

HttpServletResponse 是 Java Servlet API 中的一个接口,用于向客户端发送 HTTP 响应。

HttpServletResponse 接口的主要方法包括:

  • setStatus(int statusCode):设置响应的状态码。
  • setContentType(String type):设置响应的内容类型。
  • setHeader(String name, String value):设置响应头部的名称和值。
  • getWriter():获取用于向客户端写入文本数据的 PrintWriter 对象。
  • getOutputStream():获取用于向客户端写入二进制数据的 ServletOutputStream 对象。

1、通过Response下载文件

@WebServlet("/s4")
/**
 * 文件下载Servlet
 * 通过指定文件路径,将文件以附件形式提供给客户端下载
 */
public class HelloServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取文件路径
        String filePath = "C:\\Users\\likedx\\Desktop\\IdeaProject\\Servlet\\servlet_01\\src\\main\\resources\\a.txt";
        // 创建一个文件对象
        File file = new File(filePath);

        // 创建一个文件输入流,用于读取要下载的文件
        FileInputStream fis = new FileInputStream(file);

        // 获取文件的MIME类型
        String mimeType = getServletContext().getMimeType(filePath);
        if (mimeType == null) {
            mimeType = "application/octet-stream";
        }

        // 设置响应的内容类型为文件的MIME类型
        response.setContentType(mimeType);

        // 设置响应的内容长度为文件的长度
        response.setContentLength((int) file.length());

        // 设置响应的内容长度为文件的长度
        response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");

        // 创建一个字节数组作为缓冲区
        byte[] buffer = new byte[4096];
        int bytesRead = -1;

        // 从文件输入流中读取数据,并将其写入响应输出流中,直到文件被完全读取
        while ((bytesRead = fis.read(buffer)) != -1) {
            response.getOutputStream().write(buffer, 0, bytesRead);
        }
        // 关闭文件输入流
        fis.close();
    }
}

2、Response验证码实现

验证码的ImageServlet

package com.demo;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

@WebServlet("/validCode")
public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width = 120, height = 30;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 获取图形上下文
        Graphics g = image.getGraphics();
        // 生成随机类
        Random random = new Random();
        // 设定背景色
        g.setColor(new Color(255, 255, 255));
        g.fillRect(0, 0, width, height);
        // 设定字体
        g.setFont(new Font("Times New Roman", Font.PLAIN, 23));
        // 画边框
        g.setColor(getRandColor(160, 200));
        g.drawRect(0, 0, width - 1, height - 1);
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 10; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }
        // 取随机产生的认证码(4位数字)
        String sRand = "";
        for (int i = 0; i < 4; i++) {
            int type = random.nextInt(3);
            String rand = getCaptchaPath(type);
            sRand += rand;
            // 将认证码显示到图象中
            g.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));
            // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
            g.drawString(rand, 26 * i + 14, 23);
        }
        // 将认证码存入SESSION
        //session.setAttribute("vcode", sRand);
        // 图象生效
        g.dispose();
        // 输出图象到页面
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }

    public String getCaptchaPath(int type) {
        String result = "";
        Random random = new Random();
        if (type == 0) {
            result = String.valueOf(random.nextInt(10));
        } else if (type == 1) {
            int itmp = new Random().nextInt(26) + 65;
            result = String.valueOf((char) itmp);
        } else {
            int itmp = new Random().nextInt(26) + 97;
            result = String.valueOf((char) itmp);
        }
        return result;
    }

    public Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色
        Random random = new Random();
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">

        function changeCode() {

            var img = document.getElementById("images");
            img.src = "validCode?time=" + new Date().getTime();

        }

    </script>
</head>
<body>

<form action="" method="get"> 
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    验证码:<input type="text" name="code">
    <%--这里是无论点击图片还是文字内容都更新验证码--%>
    <img id="images" src="validCode" onclick="changeCode()"><a href="javascript:changeCode()">看不清换一张</a>
    <input type="submit" value="登录">
</form>

</body>
</html>

要跳转的Servlet代码访问demo的时候会跳转到login.jsp登录页面

package com.demo;

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

@WebServlet("/demo")
public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        out.write("注册成功!3秒后跳转到登陆页面");
        //这里设置3秒钟之后进行跳转
        response.setHeader("refresh","3;url=login.jsp");
    }
}

Cookie

服务器响应给客户端Cookie

        //服务给客户端响应一个Cookie
        Cookie cookie1 = new Cookie("Logintime",System.currentTimeMillis()+"");
        cookie1.setMaxAge(24*60*60); //设置Cookie过期时间
        response.addCookie(cookie1);

通过请求获取客户端的Cookie

@WebServlet("/s1")
public class Servlet_Cookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应的字符编码
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type","text/html;charset=utf-8");

        //获取响应数据输出在页面上
        PrintWriter print = response.getWriter();

        //cookie 返回的是数组 说明Cookie存在多个
        Cookie[] cookie = request.getCookies();

        //判断Cookie是否存在
        if (cookie != null) {
            print.write("上一次访问的时间是:");
            for (int i = 0; i < cookie.length; i++) {
                Cookie cookies = cookie[i];
                //获取Cookie的名字
                if(cookies.getName().equals("Logintime")) {
                    //将Cookie的值转换为长整型
                    long Logintime = Long.parseLong(cookies.getValue());
                    //根据转换后的时间戳创建一个Date对象。
                    Date date = new Date(Logintime);
                    //将格式化后的日期字符串写入响应输出流。
                    print.write(date.toLocaleString());

                }

            }
        }else {
            print.write("第一次访问");
        }

        //服务给客户端响应一个Cookie
        Cookie cookie1 = new Cookie("Logintime",System.currentTimeMillis()+"");
        cookie1.setMaxAge(24*60*60); //设置Cookie过期时间
        response.addCookie(cookie1);
    }
}

Session

Cookie存储在客户端 也可以理解为客户端浏览过的一些信息会生成缓存信息存放在客户端

Session是服务端生成的相当于是一个对象,用于存储用户的会话数据

简单的一个登录验证

<%--
  Created by IntelliJ IDEA.
  User: likedx
  Date: 2023/10/18
  Time: 15:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="checkLogin" method="post">
    用户名:<input type="text" name="username" /><br/>
    密 码:<input type="password" name="password" /><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

用于判断用户登录信息的Servlet类CheckServlet

@WebServlet("/checkLogin")
public class CheckServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("username");
        String pwd = request.getParameter("password");
        //判断用户名和密码是否相同
            if ("admin".equals(user) && "123456".equals(pwd)) {

            //创建一个Session对象
            HttpSession session = request.getSession();
            //设置最长访问时间
            session.setMaxInactiveInterval(60*60*24)    ;

            //将用户名存入到Session
            session.setAttribute("username",user);


            //重定向到主页面
            response.sendRedirect(request.getContextPath()+"/mainPage");
        }else {
            //设置相应的编码
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write("<h1>账号或密码错误</h1>");
            writer.write("<h3><a href='"+request.getContextPath()+"/login.jsp'>点击重新登录</a></h3>");

        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.doGet(request, response);
    }
}

当用户点击登录的时候会跳转到主页面MainServlet

@WebServlet("/mainPage")
public class MainServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的MIME类型和编码
        response.setContentType("text/html;charset=utf-8");
        //得到session
        HttpSession session = request.getSession();
        //取出用户名
        Object username = session.getAttribute("username");
        PrintWriter writer = response.getWriter();
        //判断用户名是否存在
        if (username != null){
            //在一天内登录过,无需再次登录
            writer.write("<h1>用户:"+username+" 登录成功</h1>");
        }else {
            //没有登录,或者登录间隔大于1天。重定向到登陆界面
            response.sendRedirect(request.getContextPath()+"/login.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);

    }

}

当用户打开浏览器访问url的时候 session会生成一个新的会话 如果登录成功的情况下Session会在24小时失效 在不关闭浏览器的情况下 如果你关闭浏览器重新打开会重新生成一个新的会话也是需要重新登录的 所以在登录成功的情况下不关闭浏览器 可以一直保持会话。。

最后修改:2023 年 10 月 19 日
如果觉得我的文章对你有用,请随意赞赏