JavaWeb-自学JSP组件报告

自学JSP组件报告

一、组件资源及作用

1. commons-fileupload-1.2.2.jar

组件作用:用于处理HTTP文件上传请求,提供了文件上传的解析和存储功能。它允许开发者在Web应用中轻松实现文件上传功能。

2. commons-io-2.4.jar

组件作用:提供了一系列I/O实用工具类,用于简化文件、流和字符串等I/O操作。它支持文件复制、文件内容读取、文件过滤等功能,大大简化了文件处理的代码。

package com.item.tickst.servlet;

import com.item.tickst.bean.Exams;
import com.item.tickst.dao.imp.ExamsManageByJDBCByDAOImp;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @author 为一道彩虹
 */
@WebServlet("/submit-exam-info")
@MultipartConfig
public class ExamsInfoServletImp extends HttpServlet
{
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        // 根据表单中name="xxx"属性,获取对应数据
        String name = request.getParameter("name");
        String gender = request.getParameter("gender");
        String idNumber = request.getParameter("idNumber");
        String dob = request.getParameter("dob");
        String ethnicity = request.getParameter("ethnicity");
        String examName = request.getParameter("examName");
        String examSubjects = request.getParameter("examSubjects");
        String examDateTime = request.getParameter("examDateTime");
        String examVenue = request.getParameter("examVenue");
        String seatNumber = request.getParameter("seatNumber");

        // 检查是否有文件上传请求
        if (!ServletFileUpload.isMultipartContent(request))
        {
            throw new ServletException("Content type is not multipart/form-data");
        }

        // 获取上传文件的部件
        // "photo" 是表单中文件上传字段的名字(name="photo")
        Part filePart = request.getPart("photo");
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();

        // 并接图片URL路径用于存放在数据库中
        String photo = "./images/" + fileName;

        // 获取 ServletContext 对象
        ServletContext servletContext = getServletContext();
        // 获取项目的绝对路径
        String projectPath = servletContext.getRealPath("/images");

        // 指定文件保存路径(持久化存储)
        Path filePath = Paths.get(projectPath, fileName);

        try
        {
            // 保存(写入)文件到服务器(持久化存储)
            filePart.write(String.valueOf(filePath.toFile()));
            System.out.println("上传成功!!!");

            // 将上述表单的数据封装到(Exams)对象中用于存储
            Exams exams = new Exams();
            exams.setName(name);
            exams.setGender(gender);
            exams.setIdentificationNumber(idNumber);
            exams.setBirthDate(dob);
            exams.setEthnicity(ethnicity);
            exams.setExamName(examName);
            exams.setExamSubject(examSubjects);
            exams.setExamDate(examDateTime);
            exams.setExamLocation(examVenue);
            exams.setSeatNumber(seatNumber);
            exams.setPhoto(photo);

            // 添加数据到数据库
            ExamsManageByJDBCByDAOImp daoImp = new ExamsManageByJDBCByDAOImp();
            int rows = daoImp.AddExamInformation(exams);

            // 判断返回影响行数是否大于0(添加是否成功)
            if (rows > 0)
            {
                // 将学生信息(Exams)存放到Session
                request.getSession().setAttribute("exams", exams);
                // 上传成功,重定向到成功页面
                response.sendRedirect("printing.jsp");
                System.out.println("添加成功!!!");
            }
            else
            {
                System.out.println("添加失败!!!");
            }
        }
        catch (IOException e)
        {
            // 处理文件上传失败的情况
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "未能上载文件:" + e.getMessage());
            System.out.println("未能上载文件:" + e.getMessage());
        }
    }

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

3. html2pdf-3.0.3.jar

组件作用:能够将HTML内容转换为PDF文档。它允许开发者将Web页面或HTML内容转换为PDF格式,以便于打印或存档。

4. io-7.1.14.jar, kernel-7.1.14.jar, kernel-7.2.0.jar, layout-7.1.14.jar, styled-xml-parser-7.1.14.jar, svg-7.1.14.jar

这些jar包似乎属于同一个项目或框架的组成部分,具体作用可能因上下文而异。它们可能涉及到图形渲染、文档处理、布局控制、XML解析或SVG支持等高级功能。由于没有具体的上下文信息,很难给出每个jar包的详细作用。

package com.item.tickst.servlet;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import javax.servlet.ServletContext;
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.ByteArrayOutputStream;
import java.io.IOException;

/**
 * 描述:用于处理 PDF 的生成的 Servlet
 *
 * @author 为一道彩虹
 */
@WebServlet(name = "PdfGenerationServlet", urlPatterns = {"/generatePdf"})
public class PdfGenerationServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 设置请求和响应的字符编码为 UTF-8
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        // 获取 ServletContext 对象
        ServletContext servletContext = getServletContext();
        // 获取项目的绝对路径
        String projectPath = servletContext.getRealPath("/");

        // 获取JSP页面的内容
        String jspContent = request.getParameter("jspContent").replaceAll("background-color: #f2f2f2;", "");
        jspContent = jspContent.replaceAll("打印准考证", "");

        // 设置响应内容类型为 PDF
        response.setContentType("application/pdf");

        // 创建一个新的 ByteArrayOutputStream 用于存储 PDF 字节流
        ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();

        try
        {
            // 创建 PDF 写入器
            PdfWriter writer = new PdfWriter(pdfOutputStream);
            // 创建 PDF 文档对象
            PdfDocument pdfDoc = new PdfDocument(writer);
            // 设置字体
            String fontPath = projectPath + "images/simkai.ttf"; // 替换成你的字体文件路径
            // 创建一个自定义的字体提供者
            FontProvider fontProvider = new FontProvider();
            fontProvider.addFont(fontPath, PdfEncodings.IDENTITY_H);
            // 使用 ConverterProperties 设置一些 PDF 转换的属性
            ConverterProperties converterProperties = new ConverterProperties();
            converterProperties.setFontProvider(fontProvider);
            // 设置字体,确保 PDF 中的文本可以正确显示中文等特殊字符
            converterProperties.setBaseUri(projectPath);
            // 调用 HtmlConverter 将 HTML 内容转换为 PDF,并将结果写入 ByteArrayOutputStream 中
            HtmlConverter.convertToPdf(jspContent, pdfDoc, converterProperties);

            // 关闭文档
            pdfDoc.close();

            // 将 PDF 字节流写入到 HttpServletResponse 输出流中
            response.getOutputStream().write(pdfOutputStream.toByteArray());
            response.getOutputStream().flush();
        }
        catch (IOException e)
        {
            // 捕获 IOException 异常并打印堆栈跟踪
            e.printStackTrace();
        }
        finally
        {
            // 关闭 ByteArrayOutputStream
            pdfOutputStream.close();
        }
    }
}

前端触发事件JS

function printPdf() {
    var jspContent = document.documentElement.outerHTML; // 获取当前页面的内容
    jspContent = encodeURIComponent(jspContent); // 编码内容,以便在URL中传递特殊字符

    // 发送 AJAX 请求
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "generatePdf", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.responseType = "blob"; // 响应类型为二进制流

    xhr.onload = function () {
        if (xhr.status === 200) {
            // 创建一个Blob URL,用于下载PDF文件
            var blob = new Blob([xhr.response], {type: "application/pdf"});
            var url = window.URL.createObjectURL(blob);

            // 创建一个隐藏的<a>标签,用于下载PDF文件
            var a = document.createElement("a");
            a.style.display = "none";
            a.href = url;
            a.download = "准考证信息.pdf"; // 下载的文件名
            document.body.appendChild(a);

            // 模拟点击<a>标签,开始下载PDF文件
            a.click();

            // 释放Blob URL
            window.URL.revokeObjectURL(url);
        }
    };

    xhr.send("jspContent=" + jspContent); // 发送JSP页面内容作为参数
}

5. javax.mail-1.5.6.jar

组件作用:提供了Java邮件API,允许开发者通过Java程序发送和接收电子邮件。它支持SMTP、POP3和IMAP等邮件协议,提供了邮件的创建、发送、接收和管理等功能。

package com.item.tickst.jdbc;

import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
import java.util.Random;

/**
 * 描述:用于发送邮件的类,包含发送验证码和发送HTML格式邮件的功能
 *
 * @author 为一道彩虹
 */
public class EmailSender
{
    /** 存储生成的验证码 */
    private String verificationCode;

    /**
     * 发送包含验证码的邮件
     */
    public String sendVerificationCode(String recipientEmail)
    {
        // 生成验证码
        verificationCode = generateVerificationCode();
        try
        {
            // 发送包含验证码的邮件
            sendEmail("xxxxxx@qq.com", "tiogleazwkfjdjaj", recipientEmail, "准考证系统-登录测试", "Hello World!<font color='red'>您的验证码:</font>   "+verificationCode+" ,五分钟后失效!!!");
        }
        catch (MessagingException | GeneralSecurityException e)
        {
            e.printStackTrace();
        }

        return verificationCode;
    }

    /**
     * 描述:发送HTML格式的邮件(发送QQ邮件)
     *
     * @param senderEmail : 发件人的邮箱地址
     * @param authorizationCode : 发件人的授权码,用于登录邮箱进行验证
     * @param recipientEmail : 收件人的邮箱地址
     * @param subject : 邮件的主题
     * @param content : 邮件的内容,可以是HTML格式的文本
     * @throws MessagingException
     * @throws GeneralSecurityException
     */
    public void sendEmail(String senderEmail, String authorizationCode, String recipientEmail, String subject, String content) throws MessagingException, GeneralSecurityException
    {
        // 设置邮件相关属性
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.smtp.socketFactory.fallback", "false");
        properties.setProperty("mail.smtp.port", "465");
        properties.setProperty("mail.smtp.socketFactory.port", "465");
        properties.setProperty("mail.host", "smtp.qq.com");
        properties.setProperty("mail.transport.protocol", "smtp");
        properties.setProperty("mail.smtp.auth", "true");

        // 设置SSL加密
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);

        // 创建邮件会话
        Session session = Session.getDefaultInstance(properties, new Authenticator()
        {
            @Override
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication(senderEmail, authorizationCode);
            }
        });
        //开启debug模式
        session.setDebug(true);

        // 获取邮件传输对象
        Transport transport = session.getTransport();
        transport.connect("smtp.qq.com", senderEmail, authorizationCode);

        // 创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //邮件发送人
        mimeMessage.setFrom(new InternetAddress(senderEmail));
        //邮件接收人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recipientEmail));
        //邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content, "text/html;charset=UTF-8");

        // 发送邮件
        transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        transport.close(); // 关闭连接
    }

    /**
     * 描述:生成6位数验证码
     *
     * @return 返回生成的验证码
     */
    public static String generateVerificationCode()
    {
        StringBuilder code = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++)
        {
            int digit = random.nextInt(10); // 随机生成一个数字(0-9)
            code.append(digit); // 将生成的数字拼接到验证码字符串中
        }
        System.out.println("Verification Code: " + code.toString());
        return code.toString();
    }
}

用于发送验证码的Servlet,处理POST请求以发送验证码邮件

package com.item.tickst.servlet;

import com.item.tickst.jdbc.EmailSender;
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 javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 描述:用于发送验证码的Servlet,处理POST请求以发送验证码邮件
 *
 * @author 为一道彩虹
 */
@WebServlet("/sendVerificationCode")
public class SendVerificationCodeServlet extends HttpServlet
{
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     * 处理POST请求,发送验证码邮件
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 从表单获取收件人邮箱
        String recipientEmail = request.getParameter("email");

        if (recipientEmail != null && !recipientEmail.equals(""))
        {

            // 实例化EmailSender类发送验证码邮件
            EmailSender emailSender = new EmailSender();
            String verificationCode = emailSender.sendVerificationCode(recipientEmail);

            // 将验证码存储在会话中
            HttpSession session = request.getSession();
            session.setAttribute("recipientEmail", recipientEmail);
            session.setAttribute("verificationCode", verificationCode);

            // 将邮件发送成功的消息发送回客户端
            response.getWriter().println("验证码发送成功!");
            request.setAttribute("message", "验证码发送成功~");
        }
        else
        {
            // 将邮件发送成功的消息发送回客户端
            response.getWriter().println("验证码发送失败!!!");
            request.setAttribute("message", "验证码发送失败!!!");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }

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

前端触发事件JS

//倒计时
var countdown=60;
function settime(val) {
    if (countdown == 0) {
        val.removeAttribute("disabled");
        val.value="获取验证码";
        countdown = 60;
        return false;
    } else {
        val.setAttribute("disabled", true);
        val.value="重新发送(" + countdown + ")";
        countdown--;
    }
    setTimeout(function() {
        settime(val);
    },1000);

    // 显示验证码输入框
    document.getElementById("captchaGroup").style.display = "block";
}

// 发送验证码函数
function sendVerificationCode() {
    var email = document.getElementById("email").value;
    if (email) {
        // 发送异步请求
        $.ajax({
            type: "POST",
            url: "/sendVerificationCode",
            data: { email: email },
            success: function(response) {
                console.log(response); // 输出后端返回的消息
                settime(document.querySelector(".obtain")); // 启动倒计时
            },
            error: function(xhr, status, error) {
                console.error(error); // 输出错误信息
            }
        });
    } else {
        alert("请输入邮箱地址!");
    }
}

6. jcommon-1.0.0.jar 和 jfreechart-1.0.0.jar

组件作用:jfreechart是用于创建交互式图表的Java库,而jcommon是jfreechart的底层支持库,提供了一些基础功能。jfreechart支持多种图表类型,如折线图、柱状图、饼图等,并提供了丰富的配置选项和交互功能。

(1)、柱状图:

package com.item.tickst.servlet;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
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.io.IOException;
import java.io.OutputStream;

/**
 * 描述:用于生成柱状图的图表的Servlet
 *
 * @author 为一道彩虹
 */
@WebServlet("/bar-chart")
public class BarChartServlet extends HttpServlet
{

    /**
     * 处理 GET 请求,生成柱状图并返回给客户端
     *
     * @param request  HttpServletRequest对象,表示客户端的请求
     * @param response HttpServletResponse对象,表示对客户端的响应
     * @throws ServletException servlet异常
     * @throws IOException      IO异常
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 设置响应内容类型为图像
        response.setContentType("image/png");

        // 创建柱状图数据集
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        // 添加每个月的销售额数据
        dataset.addValue(1000, "销售额", "一月");
        dataset.addValue(1200, "销售额", "二月");
        dataset.addValue(1400, "销售额", "三月");
        dataset.addValue(1800, "销售额", "四月");
        dataset.addValue(2000, "销售额", "五月");
        dataset.addValue(2200, "销售额", "六月");

        // 创建柱状图
        JFreeChart chart = ChartFactory.createBarChart(
                "某商品上半年销售额", // 图表标题
                "月份", // X 轴标签
                "销售额(元)", // Y 轴标签
                dataset, // 数据集
                PlotOrientation.VERTICAL,
                true, // 是否显示图例
                true, // 是否生成提示
                false // 是否生成URL链接
        );

        // 设置柱状图样式
        chart.setBackgroundPaint(Color.WHITE); // 设置图表背景色
        chart.getTitle().setPaint(Color.BLUE); // 设置图表标题颜色
        chart.getCategoryPlot().getDomainAxis().setLabelPaint(Color.BLUE); // 设置X轴标签颜色
        chart.getCategoryPlot().getRangeAxis().setLabelPaint(Color.BLUE); // 设置Y轴标签颜色

        // 将图表渲染为图像并写入输出流
        OutputStream outputStream = response.getOutputStream();
        ChartUtilities.writeChartAsPNG(outputStream, chart, 800, 400);
    }
}

(2)、折线图:

package com.item.tickst.servlet;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
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.io.IOException;
import java.io.OutputStream;

/**
 * 描述:用于生成折线图的图表的Servlet
 *
 * @author 为一道彩虹
 */
@WebServlet("/line-chart")
public class LineChartServlet extends HttpServlet
{

    /**
     * 处理 GET 请求,生成折线图并返回给客户端
     *
     * @param request  HttpServletRequest对象,表示客户端的请求
     * @param response HttpServletResponse对象,表示对客户端的响应
     * @throws ServletException servlet异常
     * @throws IOException      IO异常
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 设置响应内容类型为图像
        response.setContentType("image/png");

        // 创建折线图数据集
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        // 添加每个月的销售额数据
        dataset.addValue(1000, "销售额", "一月");
        dataset.addValue(1200, "销售额", "二月");
        dataset.addValue(1400, "销售额", "三月");
        dataset.addValue(1800, "销售额", "四月");
        dataset.addValue(2000, "销售额", "五月");
        dataset.addValue(2200, "销售额", "六月");
        dataset.addValue(2400, "销售额", "七月");
        dataset.addValue(2600, "销售额", "八月");
        dataset.addValue(2800, "销售额", "九月");
        dataset.addValue(3000, "销售额", "十月");
        dataset.addValue(3200, "销售额", "十一月");
        dataset.addValue(3500, "销售额", "十二月");

        // 创建折线图
        JFreeChart chart = ChartFactory.createLineChart(
                "某商品一年内销售额", // 图表标题
                "月份", // X 轴标签
                "销售额(元)", // Y 轴标签
                dataset, // 数据集
                PlotOrientation.VERTICAL,
                true, // 是否显示图例
                true, // 是否生成提示
                false // 是否生成URL链接
        );

        // 设置折线图样式
        chart.setBackgroundPaint(Color.WHITE); // 设置图表背景色
        chart.getTitle().setPaint(Color.BLUE); // 设置图表标题颜色
        chart.getCategoryPlot().getDomainAxis().setLabelPaint(Color.BLUE); // 设置X轴标签颜色
        chart.getCategoryPlot().getRangeAxis().setLabelPaint(Color.BLUE); // 设置Y轴标签颜色

        // 将图表渲染为图像并写入输出流
        OutputStream outputStream = response.getOutputStream();
        ChartUtilities.writeChartAsPNG(outputStream, chart, 800, 400);
    }
}

(3)、饼图:

package com.item.tickst.servlet;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
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.io.IOException;
import java.io.OutputStream;

/**
 * 描述:用于生成饼图的图表的Servlet
 *
 * @author 为一道彩虹
 */
@WebServlet("/pie-chart")
public class PieChartServlet extends HttpServlet
{

    /**
     * 处理 GET 请求,生成饼图并返回给客户端
     *
     * @param request  HttpServletRequest对象,表示客户端的请求
     * @param response HttpServletResponse对象,表示对客户端的响应
     * @throws ServletException servlet异常
     * @throws IOException      IO异常
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 设置响应内容类型为图像
        response.setContentType("image/png");

        // 创建饼图数据集
        DefaultPieDataset dataset = new DefaultPieDataset();
        // 添加不同类型商品的销售占比数据
        dataset.setValue("手机", 25);
        dataset.setValue("电脑", 40);
        dataset.setValue("平板", 20);
        dataset.setValue("配件", 15);

        // 创建饼图
        JFreeChart chart = ChartFactory.createPieChart(
                "商品销售占比", // 图表标题
                dataset, // 数据集
                true, // 是否显示图例
                true, // 是否生成提示
                false // 是否生成URL链接
        );

        // 设置饼图样式
        chart.setBackgroundPaint(Color.WHITE); // 设置图表背景色
        chart.getTitle().setPaint(Color.BLUE); // 设置图表标题颜色

        // 将图表渲染为图像并写入输出流
        OutputStream outputStream = response.getOutputStream();
        ChartUtilities.writeChartAsPNG(outputStream, chart, 800, 400);
    }
}

(4)、散点图:

package com.item.tickst.servlet;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
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.io.IOException;
import java.io.OutputStream;

/**
 * 描述:用于生成散点图的图表的Servlet
 *
 * @author 为一道彩虹
 */
@WebServlet("/scatter-plot")
public class ScatterPlotServlet extends HttpServlet
{

    /**
     * 处理 GET 请求,生成散点图并返回给客户端
     *
     * @param request  HttpServletRequest对象,表示客户端的请求
     * @param response HttpServletResponse对象,表示对客户端的响应
     * @throws ServletException servlet异常
     * @throws IOException      IO异常
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 设置响应内容类型为图像
        response.setContentType("image/png");

        // 创建散点图数据集
        XYDataset dataset = createDataset();

        // 创建散点图
        JFreeChart chart = ChartFactory.createScatterPlot(
                "学生成绩分布", // 图表标题
                "考试成绩", // X 轴标签
                "作业成绩", // Y 轴标签
                dataset, // 数据集
                PlotOrientation.VERTICAL, // 方向
                true, // 是否包含图例
                true, // 是否生成提示
                false // 是否生成URL链接
        );

        // 设置散点图样式
        chart.setBackgroundPaint(Color.WHITE); // 设置图表背景色
        chart.getTitle().setPaint(Color.BLUE); // 设置图表标题颜色

        // 将图表渲染为图像并写入输出流
        OutputStream outputStream = response.getOutputStream();
        ChartUtilities.writeChartAsPNG(outputStream, chart, 800, 400);
    }

    /**
     * 创建散点图数据集
     *
     * @return XYDataset对象,表示散点图数据集
     */
    private XYDataset createDataset()
    {
        XYSeries series = new XYSeries("学生成绩");
        // 添加学生的成绩数据,这里使用随机生成的数据作为示例
        series.add(65, 70);
        series.add(80, 85);
        series.add(55, 60);
        series.add(90, 95);
        series.add(75, 80);
        series.add(40, 50);
        series.add(85, 90);

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        return dataset;
    }
}

7. mysql-connector-java-8.0.26.jar

组件作用:是MySQL数据库的JDBC驱动程序,允许Java程序通过JDBC API与MySQL数据库进行连接和交互。它提供了执行SQL查询、更新数据库等操作的功能。

package com.item.tickst.jdbc;

import java.sql.*;

/**
 * 描述:JDBC链接数据库工具类
 *
 * @author 为一道彩虹
 */
public class FactoryDB
{
    private static final String URL = "jdbc:mysql://localhost:3306/printing?characterEncoding=utf-8";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";

    //1.加载驱动
    static
    {
        try
        {
            Class.forName("com.mysql.cj.jdbc.Driver");
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    // 2.获取数据库连接
    public static Connection getConnection()
    {
        try
        {
            return DriverManager.getConnection(URL, USER, PASSWORD);
        }
        catch (SQLException throwables)
        {
            throwables.printStackTrace();
        }
        return null;
    }

    // 3.关闭资源
    public static void Close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet)
    {
        try
        {
            if (resultSet != null)
            {
                resultSet.close();
            }
            if (preparedStatement != null)
            {
                preparedStatement.close();
            }
            if (connection != null)
            {
                connection.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    // 测试链接
    public static void main(String[] args)
    {
        System.out.println(getConnection());
    }
}

8. slf4j-api-1.7.36.jar

组件作用:是简单日志门面(Simple Logging Facade for Java)的API部分,它本身不实现日志功能,而是提供了日志记录的接口。开发者可以根据需要选择具体的日志实现框架(如logback、log4j等)进行集成,以实现统一的日志管理。

9. 在Java Web项目中实现Token的功能,主要依赖于Servlet API和任意的JSON处理库

package com.item.tickst.jdbc;

import java.security.SecureRandom;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * 描述:管理Token的工具类
 * 在Java Web项目中实现Token的功能,主要依赖于Servlet API和任意的JSON处理库。这里我列出一些可能用到的依赖库:
 *
 * @author 为一道彩虹
 */
public class TokenManager
{

    /** 用于存储Token和用户ID之间的映射关系 */
    private static Map<String, String> tokenMap = new HashMap<>();

    /**
     * 生成一个随机的Token
     *
     * @return 生成的Token
     */
    public static String generateToken()
    {
        SecureRandom secureRandom = new SecureRandom();
        byte[] tokenBytes = new byte[32];
        secureRandom.nextBytes(tokenBytes);
        return Base64.getUrlEncoder().encodeToString(tokenBytes);
    }

    /**
     * 将Token关联到用户身上
     *
     * @param token 生成的Token
     * @param userId 用户ID
     */
    public static void associateTokenWithUser(String token, String userId)
    {
        tokenMap.put(token, userId);
    }

    /**
     * 通过Token获取关联的用户ID
     *
     * @param token 要验证的Token
     * @return 关联的用户ID,如果Token无效则返回null
     */
    public static String getUserIdByToken(String token)
    {
        return tokenMap.get(token);
    }

    /**
     * 验证Token是否有效
     *
     * @param token 要验证的Token
     * @return 如果Token有效则返回true,否则返回false
     */
    public static boolean isValidToken(String token)
    {
        return tokenMap.containsKey(token);
    }

    /**
     * 删除Token
     *
     * @param token 要删除的Token
     */
    public static void removeToken(String token)
    {
        tokenMap.remove(token);
    }

    /** 测试 */
    public static void main(String[] args)
    {
        System.out.println(generateToken());
    }
}

二、程序运行及注释截图

**概述:**自学JSP组件项目案例以准考证系统进行演示(由于时间原因不方便修改)

(1)、登录(需要students表信息进行登录和填写QQ邮箱)
在这里插入图片描述
在这里插入图片描述

填写真实QQ邮箱,点击获取验证码按钮等待收到信息:

在这里插入图片描述

获取对应验证码后填入对应输入框中进行登录:

在这里插入图片描述

(2)、首页

在这里插入图片描述

1、新增准考证信息:
在这里插入图片描述
在这里插入图片描述

打印准考证:
在这里插入图片描述

2、表面应用案例:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、个人简历制作:

在这里插入图片描述

这些组件各自在Web应用开发中扮演着不同的角色,提供了各种功能,使得开发者能够更高效地构建功能丰富、性能良好的Web应用程序。

项目源码:https://gitee.com/boring-hero/AdmissionTicket

先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值