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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue新疆肉牛智慧牧场养殖系统

系统涉及的对象是奶牛。 系统使用员工有管理员和普通员工。 管理员有修改的权限&#xff0c;普通员工没有。 系统需要包含奶牛的编号&#xff0c;种类&#xff0c;体重&#xff0c;健康情况、生长情况、牛奶产量&#xff0c;以及上次更新数据时间等信息&#xff0c;管理员可以对…

Perfect Clear WorkBench 智能修图黑科技,你尽管拍剩下的交给我(v4.6.0.2653)

01 Perfect Clear Perfect Clear WorkBench是EyeQlmaging推出的先进图片处理工具&#xff0c;旨在自动优化和简化图像校正。它通过智能技术提高图片的清晰度、颜色保真度&#xff0c;并增强视觉效果&#xff0c;确保高品质输出。 它的核心优势是利用高级算法和AI技术&#xff…

第59篇:创建Nios II工程之控制LED<一>

Q&#xff1a;还记得第1篇吗&#xff1f;设计简单的逻辑电路&#xff0c;控制DE2-115开发板上LED的亮与熄灭&#xff0c;一行Verilog HDL的assign赋值语句即可实现。本期开始创建Nios II工程&#xff0c;用C语言代码控制DE2-115开发板上的LED实现流水灯效果。 A&#xff1a;在…

win下安装desktop及使用desktop安装k8s

1、下载desktop安装包 Docker Desktop: The #1 Containerization Tool for Developers | Docker 2、点击exe文件进行安装 3、安装完需要在启用或关闭windows功能中勾选如下三个选项 4、在desktop中配置Docker Engine { "registry-mirrors": [ "https:/…

Linux创建YUM仓库

在rhel-8.5中的/mnt/目录下是有AppStream和BaseOS这两个软件包的&#xff0c;里面有可安装的一些软件。 /mnt/BaseOS/Packages/ 普通安装 1.使用rpm命令安装&#xff08;rpm -i 程序名称&#xff09; 查看&#xff0c;已经有了这个程序&#xff08;rpm -qa | grep 程序名&…

Footprint Analytics 与 GalaChain 达成战略合作

​ Footprint Analytics 宣布与 GalaChain 达成战略合作。GalaChain 是 Gala 旗下的 Layer 1 区块链。此次合作标志着双方在游戏&#xff08;包括 Gala Games) 、娱乐和金融等多个行业的区块链生态系统革新方面迈出了重要的一步。 GalaChain 致力于满足企业级项目的广泛需求&…

【电路笔记】-Colpitts振荡器

Colpitts振荡器 文章目录 Colpitts振荡器1、概述2、基本Colpitts 振荡器电路3、示例14、使用运算放大器的Colpitts振荡器5、总结Colpitts 振荡器设计使用两个中心抽头电容器与并联电感器串联,形成产生正弦振荡的谐振储能电路。 1、概述 在许多方面,Colpitts 振荡器与我们在上…

GO语言写Prometheus自定义node-exporter的Docker容器测试

1. 安装docker-compose 执行以下命令&#xff0c;安装docker-compose到CentOS7.9环境中&#xff1a; # 下载二进制文件 sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/d…

不懂就问!现货黄金和实物黄金如何选择?

近期金价大涨&#xff0c;很多投资者就将资金从股票等其他投资品种抽调出来&#xff0c;而投入到黄金市场中。然而&#xff0c;整个黄金投资市场中拥有这么多不同的黄金投资品种&#xff0c;像现货黄金和实物黄金&#xff0c;投资者根本不知道该选哪种&#xff0c;下面我们就来…

[数据结构]——排序——插入排序

目录 ​编辑 1 .插入排序 1.基本思想&#xff1a; 2.直接插入排序&#xff1a; ​编辑 1.代码实现 2.直接插入排序的特性总结&#xff1a; 3.希尔排序( 缩小增量排序 ) 1.预排序 2.预排序代码 3.希尔排序代码 4.希尔排序的特性总结&#xff1a; 1 .插入排序 1.基本思…

2023年全国消费金融财务数据挖掘-投资回报率最高的竟是!

作者Toby&#xff0c;来源公众号Python风控模型&#xff0c;2023年全国消费金融财务统计 大家好&#xff0c;Toby老师汇总了2023年全国消费金融财务数据。这份数据可以用来分析各个消费金融公司在2023年的财务表现&#xff0c;包括资产状况、营业收入、净利润以及投资回报率等…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

【自动化测试】使用MeterSphere进行接口测试

一、接口介绍二、接口测试的过程三、接口自动化测试执行自动化流程 四、接口之间的协议HTTP协议 五、 接口测试用例设计接口文档 六、使用MeterSphere创建接口测试创建接口定义设计接口测试用例 一、接口介绍 自动化测试按对象分为&#xff1a;单元测试、接口测试、UI测试等。…

一次违法网站的渗透经历

0x01 前言 在一次攻防演练中&#xff0c;我发现了一个有趣的渗透路径。在信息收集阶段&#xff0c;我注意到目标网站和用户资产网站共享相同的IP网段。这意味着它们可能在同一台服务器上托管&#xff0c;或者至少由同一家互联网服务提供商管理。这种情况为我们的渗透测试提供了…

路由重分布的概念与配置

路由重分布的概念 l 路由重分布是指连接不同路由域&#xff08;自治系统&#xff09;的边界路由器&#xff0c;它在路由协议之间交换和通告路由信息 从一种协议&#xff08;含静态/直连路由&#xff09;到另一种协议 同一种协议的多个实例 路由重分布的背景 网络出口位置…

几个局域网文件互传工具

推荐几个 局域网文件互传工具 一、 snapdrop https://snapdrop.net/ 两个设备都打开网页 网页会刷新出传送设备&#xff0c;点传送设备&#xff0c;选择文件&#xff0c;确定&#xff0c;另一个点下载 优点无需安装 二、 localsend https://github.com/localsend/locals…

C语言如何使⽤指针操作多维数组?

一、问题 如何使⽤指针操作多维数组呢&#xff1f; 二、解答 从⼆维数组的⻆度来看&#xff0c;a 是⼆维数组名&#xff0c;a 代表整个⼆维数组的⾸地址&#xff0c;也是⼆维数组 0 ⾏的⾸地址&#xff0c;等于1000。a1 代表第⼀⾏的⾸地址&#xff0c;等于1008。 如下图所示。…

【工具使用】神经网络训练高效可视乎库visdom | 使用方式 概念全梳理

我们知道深度学习训练过程中&#xff0c;非常重要的一部分是深度学习的可视乎 一般主流的是tensorboard 还有我在一个代码中看到了visdom&#xff0c;感觉非常Nice 想系统学习并了解一下相关内容 Visdom 是一个由 Facebook Research 开发的开源可视化工具&#xff0c;主要用…

【Java EE】总结12种锁策略以及synchronized的实现原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

C语言 | Leetcode C语言题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; /*1.将字符串原串与副本进行绑定成一个节点2.对字符串副本进行按ascii码表进行从小到大排序3.按照字符串进行比较排序4.合并 */ typedef struct Node{char*s;char*s_vice;int len; }Node;void sortShellChar(char*s,int len){for(int dista…