自学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
先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!