功能设计:

1.实现读者文章的预览及下载

(实现了单击预览,双击下载)

2.实现文章查找

(实现了通过文章名查找(关键字)或者文章期数或年份(或者年份加期数))

实现步骤:

首先是数据库设计:

数据库使用一个数据表即可,三个字段,一个是filename用于储存文章名,一个是filepath用于储存文章链接,最后一个是time用于储存文章年份及期数。

create table duzhefile
(filename char(20),filepath char(100),time char(6)
)

数据库创建成功后先将数据写入:

Duzhecurl.java

 1 package All;
 2
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5
 6 import org.jsoup.Jsoup;
 7 import org.jsoup.nodes.Document;
 8 import org.jsoup.select.Elements;
 9
10 public class Duzhecurl {
11
12     public static void main(String[] args) throws Exception {
13         // 第一步:访问读者首页
14         String url = "https://www.dzwzzz.com/";
15         Document document = Jsoup.connect(url).get();
16
17         // 第二步:解析页面
18         Elements datatime = document.select("a");
19         //获取a标签
20         for(int num=0;num<datatime.size();num++) {
21             //判断文章链接
22             if(datatime.get(num).attr("href").charAt(4)=='_') {
23                 //获取a标签中href属性的值
24                 String deHref = datatime.get(num).attr("href");
25                 System.out.println("开始获取"+deHref.substring(0, 4)+"年第"+deHref.substring(5,7)+"期");
26                 String time = deHref.substring(0,4)+deHref.substring(5,7);
27                 //访问不同期刊页面
28                 String DuZhe = "https://www.dzwzzz.com/"+deHref;
29                 Document  newdocu = Jsoup.connect(DuZhe).get();
30                 //获取a标签
31                 Elements a_Elements = newdocu.select("a");
32                 for(int i=0;i<a_Elements.size();i++) {
33                     //判断是否是文章链接
34                     if (a_Elements.get(i).attr("href").charAt(0)=='d'
35                             &&a_Elements.get(i).attr("href").charAt(1)=='u')
36                     {
37                         //访问文章所在页
38                         String purpose = "https://www.dzwzzz.com/"+deHref.substring(0, 8)+a_Elements.get(i).attr("href");
39                         Document finaldocu = Jsoup.connect(purpose).get();
40                         //获取文章标题
41                         Elements h1_elements = finaldocu.select("h1");
42                         String title = h1_elements.text();
43                         //获取文章内容
44                         Elements p_Elements = finaldocu.select("p");
45                         String Content = p_Elements.text();
46                         String sql = "insert into duzhefile values(?,?,?)";
47                         Connection conn = Connect.getConnection();
48                         PreparedStatement pstmt = conn.prepareStatement(sql);
49                         pstmt.setString(1, title);
50                         pstmt.setString(2, purpose);
51                         pstmt.setString(3, time);
52                         pstmt.execute();
53                            System.out.println("文章地址"+purpose);
54                            System.out.println(title+"  写入成功!");
55                     }
56                 }
57             }
58         }
59
60     }
61
62 }

数据库写入之后开始设计界面:

FirstPage.fxml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2
 3 <?import javafx.scene.paint.*?>
 4 <?import javafx.scene.text.*?>
 5 <?import java.lang.*?>
 6 <?import javafx.scene.control.*?>
 7 <?import javafx.scene.layout.*?>
 8 <?import javafx.scene.layout.AnchorPane?>
 9
10 <AnchorPane prefHeight="361.0" prefWidth="643.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="All.FirstPageController">
11    <children>
12       <Pane prefHeight="420.0" prefWidth="643.0">
13          <children>
14             <TextField fx:id="SelectFile" layoutX="27.0" layoutY="24.0" prefHeight="23.0" prefWidth="184.0" promptText="输入文件名搜索" />
15             <Button fx:id="Select" layoutX="236.0" layoutY="24.0" mnemonicParsing="false" onMouseClicked="#ClickToSelect" text="搜索" />
16             <TableView fx:id="FileTest" layoutY="74.0" onMouseClicked="#SelectFile" prefHeight="345.0" prefWidth="394.0">
17               <columns>
18                 <TableColumn fx:id="FileName" editable="false" prefWidth="152.0" text="文件名" />
19                 <TableColumn fx:id="FilePath" editable="false" prefWidth="241.0" text="路径" />
20               </columns>
21             </TableView>
22             <Text fx:id="Preview" layoutX="398.0" layoutY="-170.0" strokeType="OUTSIDE" strokeWidth="0.0" text="文件名" textAlignment="CENTER" wrappingWidth="246.12109375" y="200.0">
23                <font>
24                   <Font size="18.0" />
25                </font>
26                <fill>
27                   <RadialGradient centerX="0.40555555555555556" centerY="0.5" radius="0.5">
28                      <stops>
29                         <Stop color="#dd3b09" />
30                         <Stop color="#00dff8" offset="1.0" />
31                      </stops>
32                   </RadialGradient>
33                </fill>
34             </Text>
35             <Text layoutX="22.0" layoutY="65.0" strokeType="OUTSIDE" strokeWidth="0.0" text="单击预览文章,双击下载文章" wrappingWidth="194.0" />
36             <Button fx:id="reset" layoutX="305.0" layoutY="24.0" mnemonicParsing="false" onMouseClicked="#ClickToReset" text="返回" />
37             <Text fx:id="content" layoutX="394.0" layoutY="62.0" strokeType="OUTSIDE" strokeWidth="0.0" text="内容预览" textAlignment="CENTER" wrappingWidth="253.12109375" />
38          </children>
39       </Pane>
40    </children>
41 </AnchorPane>

界面设计完成后是这个样的:

生成控制类后插入数据并实现各个方法:

FirstPageController.java
  1 package All;
  2
  3 import java.io.File;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileOutputStream;
  6 import java.io.IOException;
  7 import java.io.OutputStreamWriter;
  8 import java.io.UnsupportedEncodingException;
  9 import java.net.URL;
 10 import java.sql.Connection;
 11 import java.sql.PreparedStatement;
 12 import java.sql.ResultSet;
 13 import java.sql.SQLException;
 14 import java.util.ResourceBundle;
 15 import java.util.Scanner;
 16 import java.util.regex.Matcher;
 17 import java.util.regex.Pattern;
 18
 19 import org.jsoup.Jsoup;
 20 import org.jsoup.nodes.Document;
 21 import org.jsoup.select.Elements;
 22 import org.omg.CORBA.PUBLIC_MEMBER;
 23
 24 import javafx.collections.FXCollections;
 25 import javafx.collections.ObservableList;
 26 import javafx.fxml.FXML;
 27 import javafx.fxml.Initializable;
 28 import javafx.scene.control.Alert;
 29 import javafx.scene.control.Button;
 30 import javafx.scene.control.Label;
 31 import javafx.scene.control.TableColumn;
 32 import javafx.scene.control.TableView;
 33 import javafx.scene.control.TextArea;
 34 import javafx.scene.control.TextField;
 35 import javafx.scene.control.Alert.AlertType;
 36 import javafx.scene.input.MouseEvent;
 37 import javafx.scene.text.Text;
 38
 39 public class FirstPageController implements Initializable {
 40     @FXML
 41     private TextField SelectFile;//输入框
 42     @FXML
 43     private Button Select;//查找按钮
 44     @FXML
 45     private Button reset;//返回按钮
 46     @FXML
 47     private Text content;//预览内容
 48     @FXML
 49     private TableView<Data> FileTest;//表格
 50     @FXML
 51     private TableColumn<Data, String> FileName;//第一列存文章名
 52     @FXML
 53     private TableColumn<Data, String> FilePath;//第二列存文章链接
 54     @FXML
 55
 56     private Text Preview;//预览标题
 57
 58     private ObservableList<Data> cellData = FXCollections.observableArrayList();
 59     //用于存储数据Data类型的
 60     @FXML
 61     public void SelectFile(MouseEvent event) throws IOException {
 62         Data data = FileTest.getSelectionModel().getSelectedItem();//获取所选择的行的Data对象
 63         String filename = data.getFilename().getValue();//获取选择的Data对象的文章名
 64         String url = data.getFilepath().getValue();//获取选择的Data对象的文章地址
 65         Document doc;//用来存储爬取到的网页源码
 66         String Finacontent;//用来存储文章内容
 67         try {
 68             doc = Jsoup.connect(url).get();//获取Data对象的文章源码
 69             Elements p_Elements = doc.select("p");//查找P标签
 70             String Content = p_Elements.text();//保存p标签的内容
 71             Preview.setText(filename);//将文章名写入面板
 72             content.setText(Content);//将P标签的内容写入预览内容框中
 73             Finacontent = Content;//将文章内容传出去
 74         } catch (IOException e) {
 75             Finacontent = null;//告诉外面内容为空
 76         }
 77         if (event.getClickCount() == 2 && Finacontent.length() > 50) {
 78             //如果点击了两下且文章内容大于50个字符则
 79             File file = new File("E:/FileTest/" + filename + ".txt");
 80             // 创建文件输出流
 81             OutputStreamWriter fileOutputStream;
 82             try {
 83                 fileOutputStream = new OutputStreamWriter(new FileOutputStream(file, true), "UTF-8");
 84                 // 这里的true功能是不覆盖原有内容,所以多次运行程序会造成重复
 85                 // 将文章内容写入文件
 86                 fileOutputStream.write(Finacontent.toString());
 87                 fileOutputStream.close();//关闭流操作
 88                 System.out.println(filename + "  下载成功!");//提示成功
 89                 //弹出弹窗提示下载成功
 90                 Alert alert = new Alert(AlertType.INFORMATION);
 91                 alert.setTitle("提示");
 92                 alert.setContentText("下载成功!!");
 93                 alert.setHeaderText("文章已保存到"+"E:/FileTest目录下");
 94                 alert.showAndWait();
 95             } catch (UnsupportedEncodingException e) {
 96                 e.printStackTrace();
 97             } catch (FileNotFoundException e) {
 98                 e.printStackTrace();
 99             }
100
101         }
102     }
103     @FXML
104     public void ClickToReset(MouseEvent event) {
105         AddData();//如果点击了返回按钮则重新将数据写入表格
106     }
107     @FXML
108     public void ClickToSelect(MouseEvent event) {
109         String prama = SelectFile.getText();//获取输入框输入输入的内容
110         String strMatch1 = "^\\d{1,6}$";//正则表达式匹配1-6位数字
111         Pattern pattern = Pattern.compile(strMatch1);//使用匹配规则
112         Matcher matcher = pattern.matcher(prama);//进行匹配
113         String regex = "[\\u4E00-\\u9FA5]"; //正则表达式匹配汉字
114         Matcher m = Pattern.compile(regex).matcher(prama);//使用匹配汉字规则进行匹配
115         if (matcher.find()==true) {//如果匹配数字成功则进行数据库查找(对文章日期进行查找)
116             cellData.removeAll(cellData);//清空原有的cellData里的数据
117             Connection conn = Connect.getConnection();//获取数据库连接
118             String sql = "select * from duzhefile where time like ?";//定义数据库查询语句
119             try {
120                 // 执行查询语句
121                 PreparedStatement prep = conn.prepareStatement(sql);
122                 prep.setString(1, '%' + prama.replace(" ", "") + '%');//将输入的内容除去空格后绑定到数据库语句中
123                 ResultSet res = prep.executeQuery();//执行数据库查询语句并将结果返回到ResultSet对象中
124                     while (res.next()) {//如果结果有下一行
125                         String name = res.getString("filename");
126                         String path = res.getString("filepath");
127                         cellData.add(0, new Data(name, path));//将查询到的文章名和文章地址插入cellData中
128                         }
129                     if (!res.absolute(1)) {//如果查询结果不存在第一行(即为空),则弹窗提示查找结果为空
130                         Alert alert = new Alert(AlertType.ERROR);
131                         alert.setTitle("提示");
132                         alert.setContentText("请重新输入!");
133                         alert.setHeaderText("查询结果为空!");
134                         alert.showAndWait();
135                         AddData();//将所有数据重新插入(因为查询的时候清空了)
136                     }
137             } catch (SQLException e) {
138                 e.printStackTrace();
139             }
140             FileName.setCellValueFactory(cellData -> cellData.getValue().getFilename());
141             FilePath.setCellValueFactory(cellData -> cellData.getValue().getFilepath());
142             FileTest.setItems(cellData);//将cellData绑定到表格
143         }
144         else if (m.find()) {//如果匹配汉字成功
145             cellData.removeAll(cellData);//清空原有的数据
146             Connection conn = Connect.getConnection();//获取数据库连接
147             String sql = "select * from duzhefile where filename like ?";//定义数据库查询语句
148             try {
149                 // 执行查询语句
150                 PreparedStatement prep = conn.prepareStatement(sql);
151                 prep.setString(1, '%'+ prama.replace(" ", "")+'%');//去除空格后绑定参数
152                 ResultSet res = prep.executeQuery();//执行查询语句并返回结果
153                     while (res.next()) {//如果查询结果不为空
154                         String name = res.getString("filename");
155                         String path = res.getString("filepath");
156                         cellData.add(0, new Data(name, path));//将查询到的数据写入cellData中
157
158                 }
159                     if (!res.absolute(1)) {//如果查询结果不存在第一行(为空),则弹窗提示查找结果为空
160                         Alert alert = new Alert(AlertType.ERROR);
161                         alert.setTitle("提示");
162                         alert.setContentText("请重新输入!");
163                         alert.setHeaderText("查询结果为空!");
164                         alert.showAndWait();
165                         AddData();//将所有数据重新插入(因为查询的时候清空了)
166                     }
167             } catch (SQLException e) {
168                 e.printStackTrace();
169             }
170             FileName.setCellValueFactory(cellData -> cellData.getValue().getFilename());
171             FilePath.setCellValueFactory(cellData -> cellData.getValue().getFilepath());
172             FileTest.setItems(cellData);//将cellData绑定到表格中
173         }
174         else if(prama.length()==0){//如果输入的内容为空(即没有输入)则弹窗提示重新输入
175             AddData();
176             Alert alert = new Alert(AlertType.ERROR);
177             alert.setTitle("提示");
178             alert.setContentText("请重新输入!");
179             alert.setHeaderText("您输入的信息有误!\n输入文件名、年份、月份均可查找");
180             alert.showAndWait();
181         }
182     }
183
184     private Main main;
185     public void setMain(Main main) {
186         this.main = main;
187     }
188
189     @Override
190     public void initialize(URL location, ResourceBundle resources) {
191         AddData();//加载页面时写入数据
192     }
193
194     private void AddData() {//将数据库查询结果写入cellData中,封装成方法方便多次调用
195         Connection conn = Connect.getConnection();
196         String Strsql = "select * from duzhefile";
197         try {
198             // 执行查询语句
199             PreparedStatement prep = conn.prepareStatement(Strsql);
200             ResultSet res = prep.executeQuery();
201             while (res.next()) {
202                 String name = res.getString("filename");
203                 String path = res.getString("filepath");
204                 cellData.add(0, new Data(name,path));
205
206             }
207         } catch (SQLException e) {
208             e.printStackTrace();
209         }
210         FileName.setCellValueFactory(cellData -> cellData.getValue().getFilename());
211         FilePath.setCellValueFactory(cellData -> cellData.getValue().getFilepath());
212         FileTest.setItems(cellData);
213     }
214
215 }

用到的Data类如下:

Data.java

 1 package All;
 2
 3 import javafx.beans.property.SimpleStringProperty;
 4
 5 public class Data {
 6     private SimpleStringProperty filename;
 7     private SimpleStringProperty filepath;
 8
 9
10     public Data(String name,String path) {
11         this.filename = new SimpleStringProperty(name);
12         this.filepath = new SimpleStringProperty(path);
13     }
14
15
16     public SimpleStringProperty getFilename() {
17         return filename;
18     }
19
20
21     public void setFilename(String filename) {
22         this.filename = new SimpleStringProperty(filename);
23     }
24
25
26     public SimpleStringProperty getFilepath() {
27         return filepath;
28     }
29
30
31     public void setFilepath(String filepath1) {
32         this.filepath = new SimpleStringProperty(filepath1);
33     }
34 }

数据库连接类如下:

Connect.java

package All;import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;public class Connect {// 连接数据库urlstatic String url;// 创建Properties对象static Properties info = new Properties();// 驱动程序加载static {// 获得属性文件输入流InputStream input = Connect.class.getResourceAsStream("config.properties");try {// 加载属性文件内容到Properties对象
            info.load(input);// 从属性文件中取出urlurl = info.getProperty("url");// 从属性文件中取出driverString driverClassName = info.getProperty("driver");Class.forName(driverClassName);System.out.println("驱动程序加载成功...");} catch (ClassNotFoundException e) {System.out.println("驱动程序加载失败...");} catch (IOException e) {System.out.println("加载属性文件失败...");}}// 获得数据库连接public static Connection getConnection() {// 创建数据库连接Connection conn = null;try {conn = DriverManager.getConnection(url, info);System.out.println("数据库连接成功!");} catch (SQLException e) {System.out.println("数据库连接失败!");System.out.println(url);System.out.println(info);}return conn;}
}

最后主类如下:

Main.java

package All;import java.io.IOException;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;public class Main extends Application{    private Stage primaryStage;@Overridepublic void start(Stage primaryStage){this.primaryStage = primaryStage;try {FirstPage();} catch (IOException e) {e.printStackTrace();}}public void FirstPage() throws IOException {        FXMLLoader loder = new FXMLLoader(Main.class.getResource("FirstPage.fxml"));AnchorPane root = loder.load();Scene scene = new Scene(root);    FirstPageController controller = loder.getController();controller.setMain(this);primaryStage.setTitle("读者文摘");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

最后实现的效果如下:

至此,所有功能实现。

总结:

用到了Jsoup的知识爬取网页源代码,

用到了正则表达式进行数据匹配

用到了JDBC进行数据库连接并进行数据查找

用到了javafx内的TableView绑定数据操作

用到了流操作进行数据写入文件

重温了File类文件及文件夹的创建

重温了Alter弹窗

转载于:https://www.cnblogs.com/fangmr/p/11324481.html

javafx实现读者文摘上的文章预览及下载相关推荐

  1. servlet实现文件上传,预览,下载和删除

    一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...

  2. SpringBoot 图片上传,预览与下载

    引言 记录一下图片上传本地,并能在浏览器进行访问的方法 配置文件yml # 开发环境配置 server:# 服务器的HTTP端口,默认为8080port: 8099 spring:# IO文件上传配置 ...

  3. vue富文本编辑,编辑自动预览,单个图片上传不能预览的问题解决:

    vue富文本编辑,编辑自动预览,单个图片上传不能预览的问题解决: 参考文章: (1)vue富文本编辑,编辑自动预览,单个图片上传不能预览的问题解决: (2)https://www.cnblogs.co ...

  4. ajax上传图片并显示,Ajax实现图片上传并预览

    效果见尾部. 最近在使用ThinkPHP5开发项目中客户有一个需求是在图片上传时附带预览功能.虽然现在有很多的插件能实现,但是还是觉得自己写比较好.我们知道,图片上传需要一个input:file表单 ...

  5. ajax js图片上传到php,Ajax上传并预览图片(附代码)

    这次给大家带来Ajax上传并预览图片(附代码),Ajax上传并预览图片的注意事项有哪些,下面就是实战案例,一起来看一下. 1. 直接上最简单的 一种 ajax 异步上传图片,并预览 html: 图片上 ...

  6. github html5 预览,github 上如何直接预览仓库中的html

    前言:最近在写vue+element ui 的一些demo,就在github上建了个仓库来管理,但是希望能直接在github上就能预览效果,所以才有了这篇文章.转载请注明出处:https://www. ...

  7. php 表格导入excel插件,BootStrap Fileinput插件和表格插件相结合实现导入Excel数据的文件上传、预览、提交的步骤...

    这篇文章主要介绍了BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传.预览.提交的导入Excel数据操作步骤,需要的朋友可以参考下 bootstrap ...

  8. github 上如何直接预览仓库中的html,搭建自己的主页

    前言:最近在写vue+element ui 的一些demo,就在github上建了个仓库来管理,但是希望能直接在github上就能预览效果,所以才有了这篇文章.转载请注明出处:https://www. ...

  9. layui 附件上传、预览、删除、下载

    layui在开发文档中提供了 附件上传的方法upload.render(),此篇文章在此模块基础方法上扩展补充了附件预览.删除.下载的实现方法.具体如下: layui 文件/图片上传 layui 相册 ...

  10. php案例 文件上传并预览

    作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 前言 代码 cyg.php 2.php 效果:也就是上传的文件里面的内容 前言 php案例 文件上传 ...

最新文章

  1. Windows 7+Code::Blocks+wxWidgets实录(一)
  2. Linux查看网卡状态
  3. Python3调用MySQL数据库中的数据
  4. python如何去掉字符串‘\xa0’
  5. Spring MVC实现文件下载
  6. LeetCode 53. 最大子序和(动态规划)
  7. 苹果发布 macOS 12——Monterey
  8. 如何使用go打出hell word
  9. git 代码回滚_git代码版本管理(1)——git版本回滚
  10. java8 Lambda Stream collect Collectors 常用实例
  11. 汇编笔记1:debug
  12. signature=d66576fde8d472a0c1dddd8b37be6b72,Signature process
  13. codeforces332B - Maximum Absurdity 线段数 or dp
  14. 是什么让我们聚在一起
  15. 支持下一代分布式应用链开发的区块链服务互联网
  16. 微信小程序/js上传图片值腾讯云cos
  17. php 时间 拼接,PHP关于时间的时段的重合、 整合的方法
  18. 刀剑乱舞网页版选不了服务器,《刀剑乱舞》不魔法进入游戏方法
  19. python实现——根据MD5进行文件去重
  20. C#资源文件的使用实例

热门文章

  1. 如何查询SID及根据SID反查对应的账户
  2. 四格漫画《MUXing》——发版后……
  3. linux hook技术
  4. oracle数据库考试答题,Oracle数据库试题
  5. Nginx源码分析 - 初探Nginx的架构(01)
  6. Nginx连接池实现,源码阅读
  7. linux系统下 java 环境的安装
  8. 利用定时器中断方式控制led灯的闪烁速度_实验四 LED点阵
  9. Spring之占位符配置器
  10. 【渝粤教育】广东开放大学 个人与团队管理 形成性考核 (47)