Java课程设计(网络爬虫设计、java简单画图程序设计、图书销售管理系统设计).docx_第1页
Java课程设计(网络爬虫设计、java简单画图程序设计、图书销售管理系统设计).docx_第2页
Java课程设计(网络爬虫设计、java简单画图程序设计、图书销售管理系统设计).docx_第3页
Java课程设计(网络爬虫设计、java简单画图程序设计、图书销售管理系统设计).docx_第4页
Java课程设计(网络爬虫设计、java简单画图程序设计、图书销售管理系统设计).docx_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学与技术学院20142015 第二学期Java面向对象程序设计课程设计报告 课程设计题目: 1、网络爬虫设计 2、java简单画图程序设计 3、基于 SQL server 2008 图书销售管理系统设计 学 号:20122617 姓 名:徐玉松 专 业:软件工程 教 师: 陈 帆 2015-06目录网络爬虫设计5第1部分 设计的内容要求51.1设计内容51.2设计要求5第2部分 设计思想52.1使用经典MVC模式62.2使用多线程技术62.3java接口灵活使用62.4自定义JPanel7第3部分 详细设计93.1爬取正确链接并获取网页源代码或错误链接91、主要算法92、对应流程图123.2解析地址类型131、算法设计132、流程图143.3GUI表格数据跟新151、算法设计152、流程图15第4部分 运行效果图164.1界面截图16正确链接:16错误链接:16邮件地址:17未能识别18已完成:18日志:19解析后网页源代码:194.2运行环境20第5部分 心得与体会20第6部分 附录20Window类20java简单画图程序设计28第1部分 设计的内容要求281.1设计要求28第2部分 设计思想282.1自定义形状类282.2形状存储29第3部分 详细设计293.1画图形291、算法设计292、流程图313.2撤销与清除321、算法322、流程图333.3改变颜色331、算法332、流程图34第4部分 运行效果图354.1画图354.2改变颜色354.3撤销364.4清除364.5运行环境36第5部分 心得与体会37第6部分 附录37图书销售管理系统40第1部分 设计的内容要求401.1设计要求40第2部分 设计思想402.1使用经典MVC模式402.2灵活的使用java接口机制402.3自定义JPanel41第3部分 详细设计413.1图书、订单、厂商插入411、算法412、流程图433.2图书、订单、厂商删除441、算法442、流程图453.3图书、订单、厂商查询451、算法452、流程图493.4图书、订单、厂商插入501、算法502、流程图50第4部分 运行效果图514.1初始界面514.2查询524.3删除524.4插入534.5修改54第5部分 心得与体会55第6部分 附录55网络爬虫设计第1部分 设计的内容要求1.1 设计内容设计一款基于互联网的网络爬虫,要求使用java语言,并且使用其中的awt或者是swing包设计一款具有可视化的爬虫软件,其界面要十分友好,能满足一般爬虫的要求,要实现基本的爬取互联网上的资源的能力,能根据用户的自己需求爬取不同的网站,并能将网站对应源代码提取出来。1.2 设计要求爬虫需要实现的功能有:1、 能对用户手动输入的链接执行爬取功能,并能对用户非法输入进行检测。2、 能实现开始、暂停、结束功能3、 能对正在爬取,爬取完成、正确链接、错误链接、邮件地址、未能识别的链接以及日志进行提取并时刻更新GUI让爬取的进度能实时的显示出来。4、 能对正确链接实现网页源代码的提取,并将其保存。5、 有非常友好的界面设计,有良好的用户体验。第2部分 设计思想2.1 使用经典MVC模式使用经典MVC模式设计,实现数据访问和对界面更新的分离,我使用底层spider类从网络抓取对应的数据,控制层将对应的数据进行处理,使用实体类进行对应的数据共享传输,并在显示层使用容器机制对底层传来的对象进行绑定,实现了GUI的实时更新。2.2 使用多线程技术由于涉及对多个GUI界面进行跟新,而且数据实时在底层网上传输,怎样才能使GUI得更新不会阻塞UI主线程呢,根据对java多线程的了解后,我使用了多线程技术将数据更新放在了线程中,这样实现数据对象更新后才将其发送给UI主线程对界面进行更新。2.3 java接口灵活使用在底层的数据要怎样才能准确的返回给UI应用层呢,如果这两个层次分别由不同的人进行开发那么我们应该怎么样进行合理的数据交互呢?为此我定义了接口使底层数据的返回格式完全实现规范化,这样在设计UI 和底层代码之间只需要都遵守这个数据交换的接口,无需知道各个层次里面的具体实现是什么样,这对大型项目的开发也是十分重要的,降低了各个模块之间的耦合度。我具体接口的设计如下:/* * * author 徐玉松 * */public interface ISpiderReportable /* * 用于报告发现的链接 * param base 跟链接 * param url 当前链接 * return 是否发现 */ public boolean spiderFoundURL(URL base,URL url); /* * 用于报告错误链接 * param url 错误链接 */ public void spiderURLError(URL url); /* *用于报告错误邮件地址 * param email 邮件地址对象 */ public void spiderFoundEMail(EmailURL email); /* * 用于报告爬取完成的链接 * param comleteURL 爬取完成对象 */ public void spiderComlereURL(ComleteURL comleteURL); /* * 用于报告好的爬取地址 * param goodLINK 好的爬取地址对象 */ public void spiderGoodURL(GoodLINK goodLINK); /* * 用于报告坏的爬取地址 * param errorURL 坏的爬取地址对象 */ public void spiderErrorURL(ErrorURL errorURL); /* * 用于报告爬取到未知的链接地址 * param unknowURL 未知链接地址对象 */ public void spiderUnknowURL(UnknowURL unknowURL);2.4 自定义JPanel由于java swing自带的jpanel十分简单而且满足不了相应数据绑定的需求,我自主学习了java swing里面的自定义组件,将jpanel里面放了一个jtable并在其中添加了数据源。如下便是我其中一个自定义控件设计。public class GoodLinkPane extends JPanel private GoodLinkContainer goodLinkContainer;private int index;private List list;private JScrollPane playerScrollPane;public GoodLinkPane() / init(columnNames,comleteURL);this.setLayout(new BorderLayout();goodLinkContainer = new GoodLinkContainer();JTable jTable = new JTable(goodLinkContainer);jTable.setGridColor(Color.BLACK);jTable.setShowGrid(true);jTable.setShowHorizontalLines(true);jTable.setShowVerticalLines(true);jTable.setFillsViewportHeight(true);playerScrollPane = new JScrollPane(jTable);playerScrollPane.setPreferredSize(new Dimension(200, 400);add(playerScrollPane, BorderLayout.CENTER);index = 0;list = new ArrayList();this.setVisible(true);public void setTable(GoodLINK goodLINK) index+;goodLINK.setIndex(index);list.add(goodLINK);goodLinkContainer.setData(list);第3部分 详细设计3.1 爬取正确链接并获取网页源代码或错误链接1、 主要算法使用HttpURLConnection类 打开相应网络链接,如果打开相应的网络抛出异常则此链接为错误链接,并使用类中对应的httpURLConnection.getResponseCode()方法获取链接的返回码,如果返回码小于400则判断链接能够联通,否则则为错误链接,我们将两种不同的链接分别记录在GoodLINK、ErrorURL实体类中,并将其链接的基本属性一并写入。如果是正确链接我们还将其网页内容爬取出来放到D:/spiderHtml+爬取网站名(比如D:/spiderHtml/http dean swjtu edu cn)中,具体实现:checkLink()函数实现。protected boolean checkLink(URL url) try BufferedReader reader;String line;StringBuffer stringBuffer = new StringBuffer();URLConnection connection = url.openConnection();connection.connect();HttpURLConnection httpURLConnection = (HttpURLConnection) connection;if (httpURLConnection.getResponseCode() = 400) ErrorURL errorURL = new ErrorURL();errorURL.setResponsCode(String.valueOf(httpURLConnection.getResponseCode();errorURL.setTime(new Date() + );errorURL.setUrl(url + );this.spiderErrorURL(errorURL);return false; else GoodLINK goodLINK = new GoodLINK();goodLINK.setContentType(connection.getContentType();goodLINK.setResponsCode(String.valueOf(httpURLConnection.getResponseCode();goodLINK.setTime(new Date() + );goodLINK.setUrl(url + );System.out.println(goodLINK.toString();this.spiderGoodURL(goodLINK);reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), utf-8);while (line = reader.readLine() != null) stringBuffer.append(line + n);String genfilename = startURL.getText();genfilename = genfilename.replace(:, );genfilename = genfilename.replace(., );genfilename = genfilename.replace(/, );genfilename = genfilename.replace(, );genfilename = genfilename.replace(?, );genfilename = genfilename.replace(&, );File file = new File(D:/spiderHtml + / + genfilename.trim();if (file.exists() else file.mkdirs();/System.out.println(file);try String filename = url.toString();filename = filename.replace(:, );filename = filename.replace(., );filename = filename.replace(/, );filename = filename.replace(, );filename = filename.replace(?, );filename = filename.replace(&, );System.out.println()+file.getAbsolutePath();File newFile = new File(file.getAbsolutePath() + + filename + .html);if (newFile.exists()/ 存在,则删除if (!newFile.delete()/ 删除成功则创建System.err.println(删除文件 + newFile + 失败);if (newFile.createNewFile() / 创建成功,则写入文件内容PrintWriter p = new PrintWriter(new FileOutputStream(newFile.getAbsolutePath();p.write(stringBuffer.toString();p.close(); else System.err.println(创建文件: + newFile + 失败); catch (Exception e) e.printStackTrace();return true; catch (IOException e) ErrorURL errorURL = new ErrorURL();errorURL.setResponsCode(requst timeout);errorURL.setTime(new Date() + );errorURL.setUrl(url + );this.spiderErrorURL(errorURL);return false;2、 对应流程图3.2 解析地址类型1、 算法设计我将传入的链接作为跟链接,在此链接的基础上寻找该链接下网页中的所有链接,并将可用的链接装入ArrayList, 针对每一个ArrayList中的URL又递归调用解析函数直到所有的链接都被解析完成则终止解析,我使用的解析类如下所示:protected class Parser extends HTMLEditorKit.ParserCallback protected URL base;public Parser(URL base) this.base = base;public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) String href = (String) a.getAttribute(HTML.Attribute.HREF);if (href = null) & (t = HTML.Tag.FRAME)href = (String) a.getAttribute(HTML.Attribute.SRC);if (href = null)return;int i = href.indexOf(#);if (i != -1)href = href.substring(0, i);if (href.toLowerCase().startsWith(mailto:) EmailURL emailURL = new EmailURL();emailURL.setUrl(href);emailURL.setTime(new Date()+);report.spiderFoundEMail(emailURL);return;handleLink(base, href);public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) handleSimpleTag(t, a, pos); / handle the same wayprotected void handleLink(URL base, String str) try URL url = new URL(base, str);if (report.spiderFoundURL(base, url)addURL(url); catch (MalformedURLException e) UnknowURL unknowURL = new UnknowURL();unknowURL.setUrl(str);unknowURL.setTime(new Date()+);report.spiderUnknowURL(unknowURL);2、 流程图3.3 GUI表格数据跟新1、 算法设计我使用了java中的容器来装载数据,并且自定义了表格的属性,我自定义的容器,它继承了AbstractTableModel这个抽象类,并将我要显示的数据绑定到对应的表格中,这样我只需跟新绑定在对应表格上的对象数据,自然可以实现对应数据的更新,应该注意的是更新数据时必须放在一个线程里面,这也是难点所在。2、流程图第4部分 运行效果图4.1 界面截图爬取目标地址为:/ 教务网正确链接:错误链接:邮件地址:未能识别已完成:日志:解析后网页源代码:4.2 运行环境系统:程序可运行在运行在win7操作系统 ,xp系统,win8系统,Linux系统硬件:内存4G及其以上,Interi5处理器及以上,硬盘500G。第5部分 心得与体会对于java 我大二时便开始接触,一直以来都在学习Android方面的知识,做过一些项目,也学习过java web开发,深知java作为一门能跨平台的语言有着独特的优势,而且java中的各种机制有着独特的魅力,让我一直不懈的想去学习其中的一些非常好的设计思想,经过这学期的学习,我有增长了不少java方面的知识,尤其是对java swing 的学习,弥补了我在java这方面的一些缺点,而且在学习过程中,我发现swing 中组件的设计与Android中的设计非常相似,因为对Android还算熟练,学java swing的时候便十分得心应手,但是也遇到一些困难。通过这个课程设计的学习我又将以前学习的设计模式套用进去,感觉其中的实现机制和Android开发十分相似,不管是从多线程GUI的跟新,还是数据源的绑定都是十分好的设计,让我不知不觉的感受到了Android 控件设计很多机制都是参考了java swing设计方法,但是又做了很大的改进,真是有异曲同工之妙。最后,在这个设计中,我有更深刻的理解到了java 接口使用的方法,这个设计使用起来非常方便,不仅让模块之间耦合度降低,而且可以再开发不同模块之前就可以将接口定义。打个比方,接口就像类与类之间的协议,任何类实现接口的类都必须遵守这个协议。第6部分 附录Window类public class window implements ISpiderReportable, ActionListener private Spider spider = null;private MyDetailPane pane1;TogPane pane6;UnknowPane pane5;EmailPane pane4;ErrorLinkPane pane2;GoodLinkPane pane3;ComleteURL comleteURL = new ComleteURL();JTabbedPane myTabPane;private JButton begin;private JButton pause;private JButton stop;JFrame jFrame;private JTextArea startURL;private JTextArea currentURL;private Thread thread = null;public window() public JFrame InitiWindow() jFrame = new JFrame(网络爬虫);jFrame.setBounds(800, 500, 800, 500);ImageIcon icon = new ImageIcon(images/spider.jpg);jFrame.setIconImage(icon.getImage();jFrame.setLayout(new BorderLayout();JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT);ImageIcon icon_start = new ImageIcon(images/start.png);icon_start.setImage(icon_start.getImage().getScaledInstance(20, 20,Image.SCALE_DEFAULT);begin = new JButton(icon_start);begin.setBounds(20, 20, 20, 20);ImageIcon icon_pause = new ImageIcon(images/pause.png);icon_pause.setImage(icon_pause.getImage().getScaledInstance(20, 20,Image.SCALE_DEFAULT);pause = new JButton(icon_pause);pause.setBounds(20, 20, 20, 20);startURL = new JTextArea(在此输入链接, 1, 50);ImageIcon icon_stop = new ImageIcon(images/stop.png);icon_stop.setImage(icon_stop.getImage().getScaledInstance(20, 20,Image.SCALE_DEFAULT);stop = new JButton(icon_stop);stop.setBounds(20, 20, 20, 20);JLabel Current = new JLabel(当前链接:);currentURL = new JTextArea(1, 50);jPanel.add(begin);jPanel.add(pause);jPanel.add(startURL);jPanel.add(stop);JPanel jPanel1 = new JPanel(new FlowLayout(FlowLayout.LEFT);jPanel1.add(Current);jPanel1.add(currentURL);myTabPane = new JTabbedPane(JTabbedPane.TOP);/ TAB面板,tab标题位于顶部myTabPane.setBorder(BorderFactory.createLineBorder(Color.GREEN, 1);/ 设置边框pane1 = new MyDetailPane();pane2 = new ErrorLinkPane();pane3 = new GoodLinkPane();pane4 = new EmailPane();pane5 = new UnknowPane();pane6 = new TogPane();myTabPane.add(解析完成, pane1);myTabPane.add(错误链接, pane2);/ 这里面放的是一个表格myTabPane.add(正确链接, pane3);/ 这里面放的是一个表格myTabPane.add(邮件地址, pane4);myTabPane.add(未能识别, pane5);myTabPane.add(日志, pane6);myTabPane.setToolTipTextAt(0, 解析完成);myTabPane.setToolTipTextAt(1, 错误链接);myTabPane.setToolTipTextAt(2, 正确链接);myTabPane.setToolTipTextAt(3, 邮件地址);myTabPane.setToolTipTextAt(4, 未能识别);myTabPane.setToolTipTextAt(5, 日志);myTabPane.setSelectedIndex(2);/ 默认选择第0个,即“位置导航”jFrame.add(BorderLayout.NORTH, jPanel);jFrame.add(BorderLayout.CENTER, myTabPane);jFrame.add(BorderLayout.SOUTH, jPanel1);jFrame.setVisible(true);begin.addActionListener(this);pause.addActionListener(this);stop.addActionListener(this);int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;jFrame.setLocation(width / 2 - 400, height / 2 - 200);return jFrame;Overridepublic boolean spiderFoundURL(URL base, URL url) / TODO Auto-generated method stubUpdateCurrentStats cs = new UpdateCurrentStats();cs.msg = url.toString();SwingUtilities.invokeLater(cs);if (!checkLink(url) return false;if (!url.getHost().equalsIgnoreCase(base.getHost()return false;elsereturn true;class UpdateCurrentStats implements Runnable public String msg;public void run() currentURL.setText(msg);class updateTOG implements Runnable String msg;public void run() pane6.setTable(msg);protected boolean checkLink(URL url) try BufferedReader reader;String line;StringBuffer stringBuffer = new StringBuffer();URLConnection connection = url.openConnection();connection.connect();HttpURLConnection httpURLConnection = (HttpURLConnection) connection;if (httpURLConnection.getResponseCode() = 400) ErrorURL errorURL = new ErrorURL();errorURL.setResponsCode(String.valueOf(httpURLConnection.getResponseCode();errorURL.setTime(new Date() + );errorURL.setUrl(url + );this.spiderErrorURL(errorURL);return false; else GoodLINK goodLINK = new GoodLINK();goodLINK.setContentType(connection.getContentType();goodLINK.setResponsCode(String.valueOf(httpURLConnection.getResponseCode();goodLINK.setTime(new Date() + );goodLINK.setUrl(url + );System.out.println(goodLINK.toString();this.spiderGoodURL(goodLINK);reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), utf-8);while (line = reader.readLine() != null) stringBuffer.append(line + n);String genfilename = startURL.getText();genfilename = genfilename.replace(:, );genfilename = genfilename.replace(., );genfilename = genfilename.replace(/, );genfilename = genfilename.replace(, );genfilename = genfilename.replace(?, );genfilename = genfilename.replace(&, );File file = new File(D:/spiderHtml + / + genfilename.trim();if (file.exists() else file.mkdirs();/System.out.println(file);try String filename = url.toString();filename = filename.replace(:, );filename = filename.replace(., );filename = filename.replace(/, );filename = filename.replace(, );filename = filename.replace(?, );filename = filename.replace(&, );System.out.println()+file.getAbsolutePath();File newFile = new File(file.getAbsolutePath() + + filename + .html);if (newFile.exists()/ 存在,则删除if (!newFile.delete()/ 删除成功则创建System.err.println(删除文件 + newFile + 失败);if (newFile.createNewFile() / 创建成功,则写入文件内容PrintWriter p = new PrintWriter(new FileOutputStream(newFile.getAbsolutePath();p.write(stringBuffer.toString();p.close(); else System.err.println(创建文件: + newFile + 失败); catch (Exception e) e.printStackTrace();return true; catch (IOException e) ErrorURL errorURL = new ErrorURL();errorURL.setResponsCode(requst timeout);errorURL.setTime(new Date() + );errorURL.setUrl(url + );this.spiderErrorURL(errorURL);return false;Overridepublic void spiderURLError(URL url) / TODO Auto-generated method stubOverridepublic void spiderFoundEMail(final EmailURL email) / TODO Auto-generated method stubupdateTOG cs = new updateTOG();cs.msg = email.toString();SwingUtilities.invokeLater(cs);thread = new Thread() Overridepublic void run() / TODO Auto-generated method stubpane4.setTable(email);thread.start();Overridepublic void spiderComlereURL(final ComleteURL comleteURL) / TODO Auto-generated method stubupdateTOG cs = new updateTOG();cs.msg = comleteURL.toString();SwingUtilities.invokeLater(cs);thread = new Thread() Overridepublic void run() / TODO Auto-generated method stubpane1.setTable(comleteURL);thread.start();Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getSource() = begin) System.out.println(开始);thread = new Thread() Overridepublic void run() / TODO Auto-generated method stubspider =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论