jsp-servlet开发

发布于:2025-02-11 ⋅ 阅读:(84) ⋅ 点赞:(0)

STS中开发步骤

建普通jsp项目过程

1.建项目(非Maven项目)
new----project----other----Web----Dynamic Web Project
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.下载包放到LIB目录中,如果是Maven项目可以自动导包(pom.xml中设置好)
在这里插入图片描述
3.设置工作空间,网页的编码(我常用UTF-8)
在这里插入图片描述
在这里插入图片描述
3.分层(dao,vo,servlet…)

一个构建maven项目的过程

《1》
image.png
《2》
image.png

《3》配置maven
image.png
《4》下图中,爆红,是因为,Dynamic Web Module模式版本太低了,现在我们都3.x了,这里还是2.5,如下面第二图所示。
image.png
image.png
处理办法:
      先去掉那个勾选,再点应用(apply),选勾选3.1版本,同时到下面点击’Further configuration available…',我们勾选Generate web.xml。。。,让项目自建web.xml文件。
image.png
《5》,build path,即增加jdk库,apache库
image.png

         一个自已写的settings.xml,里面没有设置从远程仓库上传,下载功能,只设了阿里云下载镜像包。对IDEA 也适用,

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  

  <localRepository>C:\Users\Administrator\Desktop\maven\repository</localRepository>
 
  <pluginGroups>
     <pluginGroup>org.codehaus.plugins</pluginGroup>
  </pluginGroups>

 
  <proxies>
   
  </proxies>
 <mirrors>
  
  <mirror>
        <id>aliyunmaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
     </mirror>  
  </mirrors>
<profiles>
<!--jdk版本一劳永逸的改法,因为系统默认为1.5版,太扯了-->
     <profile>
      <id>jdk-1.8</id>
      <activation>
       <activeByDefault>true</activeByDefault>
        <jdk>jdk1.8</jdk>
       </activation>
      <properties>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
     <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
     </properties>
    </profile>
 </profiles>
<!--激活下载仓库预文件-->
 
 <activeProfiles>
    <activeProfile>myProfile</activeProfile>
    
  </activeProfiles>
</settings>

各种路径的获取方法

1Java Resources的类路径的根路径

        String Path=this.getClass().getResource("/").getPath();
	    System.out.println("thisgetClassgetResourcePath="+Path);
	    String fontsPath=this.getClass().getResource("/").getPath()+"static/fonts/";
//thisgetClassgetResourcePath=/C:/Users/Administrator/Desktop/STSWORKSPACE/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jspservlet/WEB-INF/classes/
//URL,获取类路径IDEA中
        URL path1 = this.getClass().getResource("");
        System.out.println(path1);   //  /C:/Users/Administrator/Desktop/IODemo/out/production/io1/cn/ybzy/demo/
      //利用线程类获取类路径根路径
       path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        System.out.println("Threadpath:"+path);

      IDEA
在这里插入图片描述
      IDEA JAVA工程的类路径下(相对于maven工程来说)

public class IOTest {
    public static void main(String[] args){
        IOTest it1=new IOTest();
        it1.getUrl();
    }
    public void getUrl(){
        String path = "";
        path=this.getClass().getResource("/").getPath();
        System.out.println("1:"+path);   //  /C:/Users/Administrator/Desktop/IODemo/out/production/io1/
        path=this.getClass().getResource("").getPath();
        System.out.println("2:"+path);  //  /C:/Users/Administrator/Desktop/IODemo/out/production/io1/cn/ybzy/demo/
    }

}

      STS/ECPLISE
在这里插入图片描述

2,同一目录下,只要写文件名即可
3.jsp中获取servlet路径

<!-- 1.表单-->
<body>
  欢迎购买: <%=book.getBookname() %>
 <form action="/jspservlet/servlet/AddServlet" method="post">
   书本价格:<%=book.getBookprice() %><br>
   <input name="bookno" type="hidden" value="<%=book.getBookno() %>">
   <input name="bookname"  type="hidden" value="<%=book.getBookname() %>">
   <input name="bookprice" type="hidden" value="<%=book.getBookprice() %>">
   <input type="submit" value="购买">
 
 </form>

<!-- 2.jsp:forward 不用绝对路径也可,该跳转可保存request空间的属性值传到要转到的页面或servlet-->
<body>
   <jsp:forward page="servlet/PageServlet2"></jsp:forward>
</body>

<!--3.链接-->
<a href="/项目名/xxxx/.....">执行相关逻辑</a>

<!-- 4 response.sendRedirect("xxx")该跳转不共享request的值,session,application这些不受影响-->

4.servlet跳转到jsp页

//1 doPost或doGet方法,参数实例化了request,response,不用自已创建
resp.sendRedirect("/jspservlet/showAllBook.jsp");

//2 doPost或doGet方法,参数实例化了request,response,不用自已创建
RequestDispatcher rd = req.getRequestDispatcher("/showStudents.jsp");
 rd.forward(req, resp);

5.获得项目根路径
假如项目名为manventest,不过这里不是工作空间中项目的根目录,而运行后的项目根目录,STS/ECLIPSE中如下:

String des = request.getRealPath("/");
//String des = application.getReqlPath("/");
//C:\Users\Administrator\Desktop\STSWORKSPACE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\maventest\


//获取根目下的文件即可这样写
<jsp:forward page="/writePdf.pdf"></jsp:forward>

利用java File类获取物理上项目的根路径,不是上面编译后字节码文件的根路径

public class IOTest {
    public static void main(String[] args) throws IOException {
        IOTest it1=new IOTest();
        it1.getUrl();
    }
    public void getUrl() throws IOException {
        String path = "";
        path=this.getClass().getResource("/").getPath();
        System.out.println("1:"+path);   //  /C:/Users/Administrator/Desktop/IODemo/out/production/io1/
        path=this.getClass().getResource("").getPath();
        System.out.println("2:"+path);  //  /C:/Users/Administrator/Desktop/IODemo/out/production/io1/cn/ybzy/demo/

        //利用File类,System类获取项目根路径
        File file = new File("");
        path = file.getCanonicalPath();   //抛出异常,我丢给方法上了,调用它用try catch或也丢给方法上
        System.out.println("Filepath:"+path);
        path = System.getProperty("user.dir");
        System.out.println("Systempath:"+path);

    }

}

在这里插入图片描述

jsp-servlet验证码开发

1.index.jsp嵌入由下面的servlet生成的图片并刷新可重新获得验证码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
    <script>
        function reloadCode() {
           var time=new Date().getTime();
          document.getElementById("imagecode").src="<%= request.getContextPath()%>/servlet/ImageServlet?date="+time;
        }
       /* js部分的Date相关是防止浏览器缓存后不能正常刷新,添加时间的唯一性来实现能够及时刷新和展示。

        js 部分可以参阅:JavaScript 语言入门

        也可以在ImageServlet中添加防止浏览器缓存的语句:

        response.setHeader("Pragma", "No-cache");*/
   
    </script>
</head>
<body>
<form action="<%= request.getContextPath()%>/servlet/ValidateServlet" method="get" >
           请您输入账号:
			<input type="text" name="account" />
			<BR>
			请您输入密码:
			<input type="password" name="password" />
			<BR>
    验证码:<input  type="text" name="checkCode"/><br/>
    <img alt="验证码" id="imagecode" src="<%= request.getContextPath()%>/servlet/ImageServlet"/>
    <a href="javascript:reloadCode();">看不清楚</a><br>
    <br/><input type="submit" value="提交">
</form>
</body>
</html>

2.Servelt生成验证码图片

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet  extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    	
        BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);//创建图像缓冲区
        Graphics g = bi.getGraphics();      //通过缓冲区创建一个画布
        Color c = new Color(200, 150, 255); //创建颜色
        g.setColor(c);                     //为画布创建背景颜色
        g.fillRect(0, 0, 68, 22);           //填充矩形
        char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//转化为字符型的数组
        Random r = new Random();
        int len = ch.length;
        int index;                           //index用于存放随机数字
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            index = r.nextInt(len);               //产生随机数字
            g.setColor(new Color(r.nextInt(88), r.nextInt(188), r.nextInt(255)));  //设置颜色
            g.drawString(ch[index] + "", (i * 15) + 3, 18);   //画数字以及数字的位置
            sb.append(ch[index]);
        }
        request.getSession().setAttribute("piccode", sb.toString());
        ImageIO.write(bi, "JPG", response.getOutputStream());
    }
}

3.Servlet逻辑判断验证是否正确,再进行相应的跳转

public class ValidateServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setHeader("Pragma", "No-cache");
		response.setContentType("text/html;charset=utf-8");//解决乱码问题
		//得到提交的验证码
		String code = request.getParameter("checkCode");
		//获取session中的验证码
		HttpSession session = request.getSession();
		String randStr = (String)session.getAttribute("piccode");
		response.setCharacterEncoding("utf8");
		PrintWriter out = response.getWriter();
		if(!code.equals(randStr)){
			out.println("验证码错误!");
		}
		else{
			out.println("验证码正确!跳转到LoginServlet......");
		}	
		out.flush();//将流刷新
        out.close();//将流关闭
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);		
	}
}

4.测试
我首先:生成验证码图片看看
http://localhost/yanzhengma/index.jsp
在这里插入图片描述
然后,测试提交效果。
在这里插入图片描述
在这里插入图片描述

JFreeChart开发图片报表

在web开发过程中,经常需要将数据以比较直观的方式显示出来,此时报表能够起到很好的作用。
JAVA技术报表的代表产品有:JFreeChart,JasperReports,iReport,FineReport,iText等。

下载JFreeChart包

https://sourceforge.net/projects/jfreechart/

下载后解压:到解压的文件目录的lib下复制如下两个文件到WebContent目录WEB-INF的lib目录下
在这里插入图片描述
1.web.xml

<servlet>
     <servlet-name>DisplayChart</servlet-name>
     <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DisplayChart</servlet-name>
    <url-pattern>/DisplayChart</url-pattern>
  </servlet-mapping>

1.1开发柱状报表
《1》。实例化数据集org.jfree.data.category.DefaultCategoryDataset类
《2》,添加数据给DefaultCategoryDatase对象,当然也可以从数据库中查询

datase.addValue(value1,value2,value3);

         value1为纵坐标的值,value2是纵坐标中的各个项目的种类,value3是横坐标中各个项目的种类。实际上,value1即为人数数据,value2可以为NULL,因为纵坐标没有对人数进行细分。
《3》。通过工厂类org.jfree.chart.ChartFactory创建柱状报表。

JFreeChart chart = ChartFactory.createBarChart(value1,value2,value3,value4,value5,false,false,false);

         各参数的意义如下

value1:表示柱状报表的标题,
value2:表示柱状表的横坐标名称,如“成绩”
value3:表示。。。。纵坐标的名称,如‘人数’
value4:数据集
value5:表示的是所作之图是水平还是坚直,可以用org.jfree.chart.plot.PlotOrientation的常量表示
             .VERTICAL 和 .HORIZONTAL

《4》。用org.jfree.chart.servlet.ServletUtilities将chart保存为图片,确定宽,高,并确定保存的范围(一般session)然后组图片路径。

String filename = ServeltUtilities.saveChartAsPng(chart,width,height,session);
String graphUrl = "/项目名/DisplayChart?filename="+filename;

《5》设置中文体体,在jsp页面中显示图片

    Font font = new Font("隶书", Font.PLAIN, 20);
     StandardChartTheme stheme=new StandardChartTheme("CN"); 
     stheme.setExtraLargeFont(font);                             //设置标题字体
     stheme.setLargeFont(new Font("宋书",Font.PLAIN,20));         //设置轴向字体
     stheme.setRegularFont(font);                                 //设置图例字体
     ChartFactory.setChartTheme(stheme);              //应用字体功能

jsp页中显示图片

<img src="<%=graphURL%"></img>

案例:显示男女成绩分布报表

<%@page import="org.jfree.data.general.DatasetUtilities"%>
<%@page import="org.jfree.data.category.CategoryDataset"%>
<%@page import="org.jfree.chart.StandardChartTheme"%>
<%@page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@page import="org.jfree.chart.JFreeChart"%>
<%@page import="org.jfree.chart.plot.PlotOrientation"%>
<%@page import="org.jfree.chart.ChartFactory,java.awt.*"%>
<%@page import="org.jfree.data.category.DefaultCategoryDataset"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>柱状报表2美化了</title>
</head>

<body>
 <%
     double[][] data = new double[][]{{1,2},{3,5},{7,5},{7,8},{2,6}};
     String[] rowKeys = new String[]{"优秀","良好","中等","及格","不及格"};
     String[] columnKeys = {"男","女"};
     
     Font font = new Font("隶书", Font.PLAIN, 20);
     StandardChartTheme stheme=new StandardChartTheme("CN"); 
     stheme.setExtraLargeFont(font);                             //设置标题字体
     stheme.setLargeFont(new Font("宋书",Font.PLAIN,20));         //设置轴向字体
     stheme.setRegularFont(font);                                 //设置图例字体
     ChartFactory.setChartTheme(stheme); 
     
     CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys,columnKeys,data);
     JFreeChart chart =ChartFactory.createBarChart3D("考试成绩统计表(按性别)","成绩","人数",dataset,PlotOrientation.VERTICAL,true,false,false); 
     String filename = ServletUtilities.saveChartAsPNG(chart,600,400,session);
     String graphURL = "/jfreechart/DisplayChart?filename="+filename;
 
   %>
<img src="<%=graphURL %>">
</body>
</html>

测试 http://localhost:8080/jfreechart/barchar2.jsp
在这里插入图片描述
1.2开发饼状报表

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>饼状报表</title>
</head>
<body>
 <%
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("优秀",0.45);
        dataset.setValue("良好",0.3);
        dataset.setValue("中等",0.1);
        dataset.setValue("及格",0.05);
        dataset.setValue("不及格",0.1);
        
        Font font = new Font("隶书", Font.PLAIN, 20);
        StandardChartTheme stheme=new StandardChartTheme("CN"); 
        stheme.setExtraLargeFont(font);                             //设置标题字体
        stheme.setLargeFont(new Font("宋书",Font.PLAIN,20));         //设置轴向字体
        stheme.setRegularFont(font);       //设置图例字体
        ChartFactory.setChartTheme(stheme); 
        
        JFreeChart chart = ChartFactory.createPieChart3D("考试成绩统计图",dataset,true,false,false);
        
        
        String filename = ServletUtilities.saveChartAsPNG(chart,600,400,session);
        String graphURL = "/jfreechart/DisplayChart?filename="+filename;
     %>
     <img src="<%=graphURL %>"></img>
</body>
</html>

1.3曲线报表
         下面是双曲线,单曲线只要减少一个TimeSeries对象即可。

@page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@page import="org.jfree.chart.title.TextTitle"%>
<%@page import="org.jfree.data.time.Month"%>
<%@page import="org.jfree.data.time.TimeSeries"%>
<%@page import="org.jfree.data.time.TimeSeriesCollection"%>
<%@page import="org.jfree.chart.ChartFactory"%>
<%@page import="java.awt.*"%>
<%@page import="org.jfree.chart.StandardChartTheme"%>
<%@page import="org.jfree.chart.JFreeChart"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>

<title>曲线图报表</title>
</head>
<body>
<%

   TimeSeriesCollection lineDataset = new TimeSeriesCollection();
   TimeSeries timeSeries = new TimeSeries("熊少文",Month.class);
   timeSeries.add(new Month(1,2024),85);
   timeSeries.add(new Month(2,2024),76);
   timeSeries.add(new Month(3,2024),65);
   timeSeries.add(new Month(4,2024),80);
   timeSeries.add(new Month(5,2024),66);
   timeSeries.add(new Month(6,2024),72);
   timeSeries.add(new Month(7,2024),83);
   timeSeries.add(new Month(8,2024),88);
   timeSeries.add(new Month(9,2024),85);
   timeSeries.add(new Month(10,2024),74);
   timeSeries.add(new Month(11,2024),78);
   timeSeries.add(new Month(12,2024),63);
   lineDataset.addSeries(timeSeries);
   TimeSeries timeSeries2 = new TimeSeries("徐会凤",Month.class);
   timeSeries2.add(new Month(1,2024),98);
   timeSeries2.add(new Month(2,2024),95);
   timeSeries2.add(new Month(3,2024),89);
   timeSeries2.add(new Month(4,2024),88);
   timeSeries2.add(new Month(5,2024),86);
   timeSeries2.add(new Month(6,2024),82);
   timeSeries2.add(new Month(7,2024),93);
   timeSeries2.add(new Month(8,2024),98);
   timeSeries2.add(new Month(9,2024),85);
   timeSeries2.add(new Month(10,2024),74);
   timeSeries2.add(new Month(11,2024),78);
   timeSeries2.add(new Month(12,2024),83);
   lineDataset.addSeries(timeSeries2);
   JFreeChart chart = ChartFactory.createTimeSeriesChart("每月考试成绩","月份","成绩",lineDataset,true,false,false);

   Font font = new Font("隶书", Font.PLAIN, 20);
   StandardChartTheme stheme=new StandardChartTheme("CN"); 
   stheme.setExtraLargeFont(font);                             //设置标题字体
   stheme.setLargeFont(new Font("宋书",Font.PLAIN,20));         //设置轴向字体
   stheme.setRegularFont(font);                                 //设置图例字体
   ChartFactory.setChartTheme(stheme);
  
   
   //设置子标题  
   TextTitle subTtitle = new TextTitle("2024年度");
   chart.addSubtitle(subTtitle);
   //设置主标题 
   chart.setTitle(new TextTitle("每月月考成绩"));
   chart.setAntiAlias(true);
   String filename = ServletUtilities.saveChartAsPNG(chart,600,400,session);
   String graphURL =request.getContextPath()+"/DisplayChart?filename="+filename;
 %>
<img src="<%=graphURL%>">
</body>
</html>

在这里插入图片描述

iText开发动态PDF报表

      pdf是由服务器生成的,不是客户端生成的。
      该应用,我用maven项目来做,因为iText pdf java包太难自主下载了,我用maven自动下载。

  1. 新建一个maven工程 maventest

    在这里插入图片描述

  2. 导包pom.xml

 <dependencies>
     <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.1.9</version>
            <type>pom</type>
       </dependency>
  </dependencies>
  1. 建一个jsp页面,创建一个空白文档
    在这里插入图片描述
<%@page import="com.itextpdf.layout.Document"%>
<%@page import="com.itextpdf.kernel.pdf.PdfDocument"%>
<%@page import="com.itextpdf.kernel.pdf.PdfWriter"%>
<%@page import="com.itextpdf.kernel.pdf.DocumentProperties"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <%

  String des="C:\\";
  String dest = des+"sample.pdf";
  PdfWriter writer = new PdfWriter(dest);
  // 2、创建一个 PdfDocument,参数为PdfWriter
  PdfDocument pdfDoc = new PdfDocument(writer);

   // 3、用PdfDocument创建一个空白 page 
    pdfDoc.addNewPage();

    // 4、创建一个 Document,参数为PdfDocument
     Document document = new Document(pdfDoc);
   // 5、关闭 document,PdfDocument
     document.close();
    pdfDoc.close();
%>
</body>
</html>

3.下面是创建分页,段落,表格,设置pdf页面大小,边距等示例

<%
    String des="C:\\";
 //创建分页
      //创建区域中断对象AreaBreak,结果是两页的空白页
      /*String dest = des+"addingAreaBreak.pdf";
       PdfWriter writer = new PdfWriter(dest);
       PdfDocument pdf = new PdfDocument(writer);
       Document document = new Document(pdf);

       // 创建一个 Area Break
       AreaBreak aB = new AreaBreak();

       // 添加到 PDF
       document.add(aB);
       document.close();
       pdf.close();*/
   //创建两个段落
     /*String dest = des+"addingParagraph.pdf";
     PdfWriter writer = new PdfWriter(dest);
     PdfDocument pdf = new PdfDocument(writer);
     Document document = new Document(pdf);

   String para1 = "段落1的内容";

   String para2 = "段落2的内容";

     // 创建段落 Paragraphs
     Paragraph paragraph1 = new Paragraph(para1);
     Paragraph paragraph2 = new Paragraph(para2);

    // 把段落添加到 document
     document.add(paragraph1);
     document.add(paragraph2);

     // 关闭
      document.close();
     pdf.close();*/
   
   //创建一个表格
      //创建一个 Table 对象
        
          String dest = des+"addingTable.pdf";
          PdfWriter writer = new PdfWriter(dest);
          PdfDocument pdf = new PdfDocument(writer);
          //设置pdf页面大小,边距等
          Document doc = new Document(pdf,PageSize.A8);
       
          doc.setBottomMargin(40);
          doc.setLeftMargin(40);
          doc.setRightMargin(40);
          doc.setTopMargin(50);
          
          // 创建表格 table
          //三个参数代表这个表格有三列,每列的宽度是150
          float [] pointColumnWidths = {150F, 150F, 150F};
          Table table = new Table(pointColumnWidths);
   
          // 逐个单元格添加内容到表格 table
          table.addCell("表头1内容");
          table.addCell("表头2内容");
          table.addCell("表头3内容");
          table.addCell("单元格1内容");
          table.addCell("单元格2内容");
          table.addCell("单元格3内容");
   
          //把表格添加到document
          doc.add(table);
   
          // 关闭
          doc.close();
          pdf.close();
        
   


   %>
</body>

4.中文输出和字体解决
      宋体细体,ITEXT本身有,可以直接使用。使用它就能输出中文。
      这里添加了华文琥珀和黑体两个字体,将字体拷贝的项目的资源目录下,不拷贝也行,定义的路径直接指向系统字体库。
在这里插入图片描述
STS/ECLIPSE中,static要放在WEB-INF-classes中,没有classes文件夹,自行创建
在这里插入图片描述

 //字体设置,解决中文输出问题 宋体细体,ITEXT集成的。
        PdfFont  sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");
        // 创建字体  STHUPO.TTF 华文琥珀,simhei.ttf黑体
        //定义字体存放路径
        String fontsPath=this.getClass().getResource("/").getPath()+"static/fonts/";
        PdfFont boldFont = PdfFontFactory.createFont(fontsPath+"STHUPO.TTF", PdfEncodings.IDENTITY_H,true);
        PdfFont heitiFont = PdfFontFactory.createFont(fontsPath+"simhei.ttf", PdfEncodings.IDENTITY_H,true);
 
        //添加首页标题,字体大小30
        Text titleText=new Text("健康体检报告").setFont(boldFont).setFontSize(30);
        Paragraph titelPara=new Paragraph(titleText);
        //设置对齐方式,上边距30,下边距30,文本居中
        document.add(titelPara.setMarginTop(30).setMarginBottom(30).setTextAlignment(TextAlignment.CENTER));

5.添加图片
         注意:要添加到已有pdf文件,该文件已存,如果没有,执行(http://localhost:8080/项目名/xxx.jsp)两遍即可。

<%@page import="com.itextpdf.layout.Document"%>
<%@page import="com.itextpdf.kernel.pdf.canvas.PdfCanvas"%>
<%@page import="com.itextpdf.kernel.pdf.PdfPage"%>
<%@page import="com.itextpdf.layout.element.Image"%>
<%@page import="com.itextpdf.io.image.ImageDataFactory"%>
<%@page import="com.itextpdf.io.image.ImageData"%>
<%@page import="com.itextpdf.kernel.pdf.PdfDocument"%>
<%@page import="com.itextpdf.kernel.pdf.PdfWriter"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>pdf图片</title>
</head>
<body>
<%
   //String des = "C:\\";
   String des = application.getRealPath("/");
   String dest = des+"addingImage.pdf";
   
   PdfWriter writer = new PdfWriter(dest);
   PdfDocument pdf = new PdfDocument(writer);
   Document doc = new Document(pdf);

  String imagePath=this.getClass().getResource("/").getPath()+"static/image/43.jpg";
  Image image = new Image(ImageDataFactory.create(imagePath));
  image.setFixedPosition(10,25);     //设置位置
  image.setAutoScale(true);        //自动适配图像,让图像整个显示(像素大的话有效果)
  image.setRotationAngle(45);      //旋转图片
  doc.add(image);
  doc.close();
  response.setHeader("Content-Dispostion","attachment;filename=addingImage.pdf");
  response.setContentType("applicatin/pdf");   //表示出现下载保存对话框
%>
 <jsp:forward page="/addingImage.pdf"></jsp:forward>
</body>
</html>

效果图
在这里插入图片描述

6.写入文字到pdf中


<body>
<%  
   //String des = "C:\\";
   //String des=application.getRealPath("/");   //request.getRealPath();功能也一样,不过不推荐用。
   String des = request.getRealPath("/");
   
   String dest = des+"writePdf.pdf";
   String msg = "This is Test";
   PdfWriter writer = new PdfWriter(dest);
   PdfDocument pdf = new PdfDocument(writer);
   Document doc = new Document(pdf);
   doc.add(new Paragraph(msg));
   doc.close();
%>
</body>

7.读取pdf的文本

<%


try {
   // 初始化 PDF 文档
   String filename = application.getRealPath("/")+"writePdf.pdf";
   PdfDocument pdfDoc = new PdfDocument(new PdfReader(filename));

   // 遍历 PDF 文档中的每一页
   for (int page2 = 1; page2 <= pdfDoc.getNumberOfPages(); ++page2) {
       String pageContent = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(page2));
       out.println(pageContent);
       System.out.println(pageContent);
   }

   // 关闭 PDF 文档
   pdfDoc.close();
} catch (IOException e) {
   e.printStackTrace();
}


%>

8.添加列表

<% 
     String des = request.getRealPath("/");

    String dest = des+"addList.pdf"; 
    PdfWriter writer = new PdfWriter(dest);
    PdfDocument pdf = new PdfDocument(writer);                    
    Document document = new Document(pdf);  
    Paragraph paragraph = new Paragraph("Tutorials Point provides the following tutorials");
    List list = new List();  
    
    // Add elements to the list       
    list.add("Java");       
    list.add("JavaFX");      
    list.add("Apache Tika");       
    list.add("OpenCV");       
    list.add("WebGL");       
    list.add("Coffee Script");       
    list.add("Java RMI");       
    list.add("Apache Pig"); 
    document.add(paragraph);                    
    
    // Adding list to the document       
    document.add(list);
    
    // Closing the document       
    document.close();              
    System.out.println("List added"); 
%>

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到