JavaWeb-自学JSP组件报告

news2024/11/27 2:42:59

自学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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1625716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免单优选:电商销售新模式,低门槛高回报引领消费热潮

免单优选&#xff0c;一种颠覆传统的电商销售新模式&#xff0c;其核心在于通过价格优化策略、创新的奖励机制以及社交网络的深度应用&#xff0c;来激发消费者的购买欲望&#xff0c;进而推动销售实现快速增长。 一、坚守法律底线&#xff0c;打造透明奖励体系 免单优选模式坚…

POCEXP编写—POC编写实战

POC&EXP编写—POC编写实战 1. 概念引入2. POC编写2.1. GET与POST2.2. thinkcmf文件包含(Get请求)2.2.1. POC验证2.2.1.1. 漏洞存在复现 2.2.2. 编写POC2.2.2.1. 脚本报错2.2.2.2. 脚本美化2.2.2.3. 脚本测试2.2.2.4. 注意事项 2.3. Struts2 S2-061 远程命令执行漏洞(Get请求…

Hot 100总结【leetcode】

文章目录 哈希1. 1 两数之和2. 49 字母异或词分组3. 128 最长连续序列4. 283 移动零5. 11 盛最多水的容器6. 15 三数之和7. 42 接雨水 滑动窗口8. 3 无重复的最长子串9. 438 找到字符串中所有字母异位词子串10. 560 和为k的子数组11. 239 滑动窗口最大值12. 76 最小覆盖子串 普…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

KT-0850 三箱社交箱

01简介 社交一般指社会交往。 社会交往 &#xff0c;简称“社交”&#xff08;socializing&#xff09;&#xff0c;是指在一定的历史条件下&#xff0c;个体之间相互往来&#xff0c;包括物质、精神交流的社会活动。三箱社交(Three-chamber Sociability)箱行为实验是一种经典…

【蓝桥2025备赛】容斥原理

容斥原理 背景&#xff1a;两个集合相交 高中的韦恩图&#xff0c;我们知道两个集合相交时我们可以通过简单的计算来认识相关的性质 集合相交的区域是 A ∩ B A\cap B A∩B ,集合的并集是 A ∪ B A\cup B A∪B ,那怎么用集合表示 A ∪ B A\cup B A∪B 我们可以看作是A集合…

【go零基础】go-zero从零基础学习到实战教程 - 2项目初始化

到项目初始化过程了&#xff0c;这边的项目设计完全按照作者自己的喜好来进行定义和设置的&#xff0c;所以各位完全可以按照自己的偏好自喜设置哈。 首先是创建一个工作文件夹哈。 别问为啥不直接quickstart&#xff0c;因为quickstart生成的api名字是greet&#xff0c;改起来…

Springboot3集成Web、RedisTemplate、Test和knife4j

本例将展示&#xff0c;如何在Springboot3中完成&#xff1a; Redis功能的Web接口实现构建Redis功能的单元测试knife4j自动化生成文档 Redis功能 Pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

02 贪吃蛇

前言 呵呵 这是不知道 在哪里看到的 别人做的一个贪吃蛇 因此 也把我 之前的 贪吃蛇 移植上来了 当然 这个不过是为了 简单的入门了解, 呵呵 然后 c版本的贪吃蛇 需要先移植成 c 版本, 然后 再根据 单片机相关 设计调整 比如 led 点阵的输出, 比如 c99 语法的一些不兼容…

分布式密钥生成

可验证且无经销商 分布式密钥生成 (DKG) 是一种加密协议&#xff0c;使多方能够协作生成共享密钥&#xff0c;而无需任何一方完全了解密钥。 它通过在多个参与者之间分配信任来增强各种应用程序的安全性&#xff0c;从而降低密钥泄露的风险。 我们引入了一种可验证且无经销商的…

C语言中整型与浮点型在内存中的存储

今天让我们来看看整型的数据和浮点型的数据在内存中是怎么存储的呢 整型数据在内存中的存储 整型数据在内存中存储的是二进制的补码 正数的话也没什么可说的&#xff0c;原码反码补码都相同 我们来看看负数&#xff1a; 以-5为例 原码&#xff1a;10000000 00000000 00000000 0…

集控中心的调度桌成就事业的重要工具

在集控中心的调度室内&#xff0c;一排排整齐的调度桌构成了一道独特的风景线。其中最引人注目的便是那一张张配备现代化设备&#xff0c;宽敞而舒适的调度桌。就我们嘉德立来说这些调度桌不仅见证了调度员们严谨、细致的工作态度&#xff0c;也是他们成就事业的重要工具。 集控…

C++初阶之入门

零、什么是C C是基于C语言而产生的&#xff0c;它既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对象的程序设计&#xff0c;还可以进行面向对象的程序设计。 C缺点之一&#xff0c;是相对许多语言复杂&#xff0c;而且难学难精。许多人说学…

13 c++版本的五子棋

前言 呵呵 这大概是 大学里面的 c 五子棋了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 五子棋 #include<Windows.h> #include<io…

ChatGPT全方位指导:学术论文写作从零开始,轻松搞定高质量论文!

目录 文末福利 一、论文选题的深度探讨 二、撰写摘要的艺术 三、关键词的精选 四、引言的构建 五、正文的结构设计 六、撰写结论的策略 七、致谢的编写 八、附录的有效利用 九、参考文献的整理 文末有福利哦 撰写一篇高质量的学术论文是一项既复杂又耗时的任务。这个…

c++中的指针

一、指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般采用16进制数字表示。可以利用指针变量保存地址。 二、指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名 #include<iostream> u…

JAVA实现easyExcel模版导出

easyExcel文档 模板注意&#xff1a; 用 {} 来表示你要用的变量 &#xff0c;如果本来就有"{“,”}" &#xff0c;特殊字符用"{“,”}"代替{} 代表普通变量{.}代表是list的变量 添加pom依赖 <dependency><groupId>com.alibaba</groupId&g…

模块三:二分——LCR. 173.点名

文章目录 题目描述算法原理暴力查找二分查找 代码实现暴力查找二分&#xff1a;CJava 题目描述 题目链接&#xff1a;LCR. 173.点名 关于这道题中&#xff0c;时间复杂度为 O(N) 的解法有很多种&#xff0c;⽽且也是⽐较好想的&#xff0c;这⾥就不再赘述。本题只讲解⼀个最优…

超实用的电脑桌面便签+待办清单app

对于上班族来说&#xff0c;桌面便签加待办清单软件是提升工作效率的得力助手。想象一下&#xff0c;在繁忙的工作中&#xff0c;你能够快速记录重要事项&#xff0c;设置待办任务提醒&#xff0c;一切都能有条不紊地进行。这种便捷性&#xff0c;尤其在处理多项任务和紧急事务…

Unity读书系列《Unity3D游戏开发》——脚本(一)

文章目录 前言一、脚本模版及其拓展1、脚本模版2、拓展脚本模版 二、脚本的生命周期三、脚本的执行顺序四、脚本序列化1、序列化数据2、serializedObject3、监听部分元素修改事件 五、定时器与间隔定时器六、工作线程&#xff08;多线程&#xff09;总结 前言 脚本在Unity的重…