MyEclipse 10+自带Tomcat6+Struts2;
DAO(Data Access Objects) 数据访问对象是第一个面向对象的接口 ,数据访问层,一般我们写的DAO类都是进行数据操作的类,里面的代码都是对于数据库中的数据做增删改查等等,所以在此新建cfsnDAO类,编写数据库的查询、删除等操作。
index.jsp
<body> <div align="center"> <s:a href="newsAll.action">1、查看cfsn_news中所有数据</s:a><hr> <s:a href="deleteAll.action">2、删除cfsn_news中所有数据</s:a> <s:a href="Grab.action">3、即时抓取cfsn某页面并将全部内容插入到数据库中</s:a> <s:a href="newsAll.action">4、即时抓取但不插入到数据库<br>直接显示</s:a> </div> </body>
index.jsp是我们在浏览器输入http://localhost:8080/cfsn的默认页面;【为什么呢?这是因为在WEB-INF文件夹下web.xml中<welcome-file-list>标签定义了一堆东西】
line3表示用户点击之后触发名为newsAll的action,至于这个Action做什么则要由src目录下struts.xml所决定:
这一段
<action name="newsAll" class="org.jason.spiderWeb.ShowCfsnNews">
<result name="success">newsAll.jsp</result>
</action>
表示网站要按指令调用包org.jason.spiderWeb下的ShowCfsnNews.java,该文件会返回一个string信号,如果是“success”,newsAll.jsp将会被打开;【此处name写错导致运行时显示404错误】
其他的Action标签功能类似,比如<action name="Grab" class="org.jason.spiderWeb.GrabAction">
ShowCfsnNews.java
package org.jason.spiderWeb; import java.util.List; import org.jason.spiderUtil.CfsnDAO; import org.jason.spiderUtil.Cfsn; import com.opensymphony.xwork2.ActionSupport; public class ShowCfsnNews extends ActionSupport{ private List<Cfsn> cfsn ; //getter &setter public List<Cfsn> getCfsn() { return cfsn; } public void setCfsn(List<Cfsn> cfsn) { this.cfsn = cfsn; } //调用底层query方法查询数据库表中内容 public String execute(){ cfsn = new CfsnDAO().queryNews(); return SUCCESS; } }
package org.jason.spiderUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class CfsnDAO { private static Connection conn ; private static PreparedStatement pstmt ; private static ResultSet rs ; private static final String DRIVER = "com.mysql.jdbc.Driver" ; private static final String URL = "jdbc:mysql://localhost:3306/db0703" ; private static final String USERNAME = "root" ; private static final String PASSWORD = "" ; private static Cfsn cfsn ; //数据库连接 public synchronized static Connection getConnection () { try { Class.forName (DRIVER) ; conn = DriverManager.getConnection (URL,USERNAME,PASSWORD) ; } catch (ClassNotFoundException e) { e.printStackTrace () ; return null ; } catch (SQLException e) { e.printStackTrace () ; return null ; } return conn ; } //1、查看数据库中新闻表cfsn_news public static List<Cfsn> queryNews () { List<Cfsn> list = new ArrayList<Cfsn> () ; try { pstmt = getConnection().prepareStatement("select * from cfsn_news"); rs = pstmt.executeQuery () ; while (rs.next()) { cfsn = new Cfsn () ; cfsn.setId (rs.getInt(1)) ; cfsn.setTitle (rs.getString(2)) ; cfsn.setUrl (rs.getString(3)) ; list.add (cfsn) ; } } catch(SQLException e) { e.printStackTrace() ; } return list ; } //2、删除表中全部数据,返回成功与否 public boolean deleteNews(){ boolean b = true ; String DELETE="delete from cfsn_news"; int result=-1; try { //获取连接 getConnection(); // statement用来执行查询SQL语句 Statement statement = conn.createStatement(); //执行删除语句 result=statement.executeUpdate(DELETE); //如果受影响的行数小于1则表示删除失败 if(result<1){ b=false; } } catch (SQLException e) { e.printStackTrace(); } return b; } //3、将title和url添加到表cfsn_news中 //执行数据库操作 static boolean insertNews(String[] titleArray,String[] urlArray) throws ClassNotFoundException{ //受影响的行数 int result=0; try { //获取连接 getConnection(); // statement用来执行查询SQL语句 Statement statement = conn.createStatement(); //循环插入操作 for(int i=0;i<titleArray.length;i++){ String sql_insert="insert into cfsn_news(title,URL) " + "values('"+titleArray[i]+"','"+urlArray[i]+"')"; //excuteUpdate执行完后,返回影响表的行数 result+=statement.executeUpdate(sql_insert); } //依次关闭Statement对象、Connection对象,最好用if判断一下是否为空 statement.close(); conn.close(); } catch(SQLException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } if(result>0){ return true; }else{ return false; } } }
最终ShowCfsnNews类的execute()会得到一个List类型变量cfsn,并返回SUCCESS信号。
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>newsAll</title> </head> <body> <div align="center"> <table border="1"> <tr> <th>ID</th> <th>标题</th> <th>链接</th> </tr> <s:iterator value="cfsn"> <tr> <td><s:property value="id"/></td> <td><s:property value="title"/></td> <td><s:property value="CfsnUrl"/></td> </tr> </s:iterator> </table> </div> </body> </html>
此页面中<s:iterator value="cfsn">标签会循环得到cfsn的各个参数的值,在页面上显示出来。
一个页面显示过程就结束了。
package org.jason.spiderUtil; public class Cfsn { public int id; public String title; //新闻标题 public String CfsnUrl ;//网页链接 //构造方法初始化数据 public Cfsn(){ id=0; title = "" ; CfsnUrl = "" ; } //getter和setter方法 //id public int getId(){ return id; } public void setId(int id){ this.id=id; } //title public String getTitle () { return title ; } public void setTitle (String title) { this.title = title ; } //CfsnUrl public String getUrl () { return CfsnUrl ; } public void setUrl (String url) { this.CfsnUrl = url ; }
-src
-org.jason.spiderUtil //pakage
-Cfsn.java
-CfsnDAO.java
-Grab.java //grab the page
-Spider.java
-org.jason.spiderWeb
-DeleteCfsnNews.java
-GrabAction.java
-ShowCfsnNews.java
struts.xml
……
-WebRoot
-META-INF
-spider
-Del_OK.jsp
-Grab_OK.jsp
-error.jsp
-WEB-INF
-lib
-web.xml
-index.jsp
-newsAll.jsp
Grab.jsp
package org.jason.spiderUtil; import java.util.ArrayList; public class Grab { //3、调用spider抓取数据添加到表cfsn_news中 public boolean grabNews(){ // 定义即将访问的链接 String url = "http://www.cfsn.cn/news/node_4534.htm"; // 访问链接并获取页面内容 String content = Spider.SendGet(url); // 获取该页面的所有的Cfsn对象 ArrayList<Cfsn> myCfsn = Spider.GetCfsn(content); //定义两个数组分别存放title和url String[] titleArray = new String[myCfsn.size()]; String[] urlArray = new String[myCfsn.size()]; //获取新闻数量 System.out.println(myCfsn.size()); //循环赋值 for(int i=0;i<titleArray.length;i++){ titleArray[i]=myCfsn.get(i).title; urlArray[i]=myCfsn.get(i).CfsnUrl; } //插入到数据库中 boolean b=false; try { b = CfsnDAO.insertNews(titleArray,urlArray); } catch (ClassNotFoundException e) { e.printStackTrace(); } return b; } }
spider.java前面博文有;
spiderWeb下的三个类
package org.jason.spiderWeb; import com.opensymphony.xwork2.ActionSupport; import org.jason.spiderUtil.CfsnDAO; import org.jason.spiderUtil.Cfsn; public class DeleteCfsnNews extends ActionSupport{ public String execute(){ boolean b = new CfsnDAO().deleteNews(); //删除成功则返回success if(b){ return SUCCESS; }else{ return ERROR; } } } package org.jason.spiderWeb; import org.jason.spiderUtil.Grab; import com.opensymphony.xwork2.ActionSupport; //grab and show all cfsn news public class GrabAction extends ActionSupport{ public String execute(){ boolean b = new Grab().grabNews(); //删除成功则返回success if(b){ return SUCCESS; }else{ return ERROR; } } } package org.jason.spiderWeb; import java.util.List; import org.jason.spiderUtil.CfsnDAO; import org.jason.spiderUtil.Cfsn; import com.opensymphony.xwork2.ActionSupport; public class ShowCfsnNews extends ActionSupport{ private List<Cfsn> cfsn ; //getter setter public List<Cfsn> getCfsn() { return cfsn; } public void setCfsn(List<Cfsn> cfsn) { this.cfsn = cfsn; } //调用底层query方法查询数据库表中内容 public String execute(){ cfsn = new CfsnDAO().queryNews(); return SUCCESS; } }
点击2要需要一点时间,第一次,第二次都失败了
第三次才返回成功页面。
还有多次测试导致cfsn_news的自增字段id太大了,可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。
mysql> alter table cfsn_news AUTO_INCREMENT=1;
Query OK, 50 rows affected (0.04 sec)
Records: 50 Duplicates: 0 Warnings: 0
额,再次select之后发现id还是没变
在MySQL中有时候想让自增的字段从1开始,办法是很多的,我就在此分享一种最简单实用的方法,就是用MySQl管理工具先把该表清空,然后把该自增字段设为非自增,然后再设为自增,现在再插入一条记录,看看是不是已经从1开始了呢?
初步掌握SSH框架;
尝试HttpClient抓网页、Jsoup语义分析;
(Mark Jsoup网页内容抓取分析
网络爬虫专栏)