# AdmissionTicket **Repository Path**: boring-hero/AdmissionTicket ## Basic Information - **Project Name**: AdmissionTicket - **Description**: 自学JSP组件报告 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-26 - **Last Updated**: 2024-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 自学JSP组件报告 **一、组件资源及作用** **1. commons-fileupload-1.2.2.jar** 组件作用:用于处理HTTP文件上传请求,提供了文件上传的解析和存储功能。它允许开发者在Web应用中轻松实现文件上传功能。 **2. commons-io-2.4.jar** 组件作用:提供了一系列I/O实用工具类,用于简化文件、流和字符串等I/O操作。它支持文件复制、文件内容读取、文件过滤等功能,大大简化了文件处理的代码。 ```java 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包的详细作用。 ```java 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 ```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); // 创建一个隐藏的标签,用于下载PDF文件 var a = document.createElement("a"); a.style.display = "none"; a.href = url; a.download = "准考证信息.pdf"; // 下载的文件名 document.body.appendChild(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等邮件协议,提供了邮件的创建、发送、接收和管理等功能。 ```java 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!您的验证码: "+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请求以发送验证码邮件 ```java 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 ```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)、柱状图: ```java 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)、折线图: ```java 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)、饼图: ```java 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)、散点图: ```java 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查询、更新数据库等操作的功能。 ```java 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处理库** ```java 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 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邮箱) ![输入图片说明](document/clip_image072.jpg) ![输入图片说明](document/clip_image074.jpg) 填写真实QQ邮箱,点击获取验证码按钮等待收到信息: ![输入图片说明](document/clip_image075.png) 获取对应验证码后填入对应输入框中进行登录: ![输入图片说明](document/clip_image077.png) (2)、首页 ![输入图片说明](document/clip_image080.jpg) 1、新增准考证信息: ![输入图片说明](document/clip_image081.png) ![输入图片说明](document/clip_image083.png) 打印准考证: ![输入图片说明](document/clip_image085.png) 2、表面应用案例: ![输入图片说明](document/clip_image087.png) ![输入图片说明](document/clip_image089.png) ![输入图片说明](document/clip_image091.png) ![输入图片说明](document/clip_image093.png) 3、个人简历制作: ![输入图片说明](document/clip_image095.png) 这些组件各自在Web应用开发中扮演着不同的角色,提供了各种功能,使得开发者能够更高效地构建功能丰富、性能良好的Web应用程序。