食品安全项目阶段整合

0、开发环境

MyEclipse 10+自带Tomcat6+Struts2;

1、DAO是什么

  DAO(Data Access Objects) 数据访问对象是第一个面向对象的接口 ,数据访问层,一般我们写的DAO类都是进行数据操作的类,里面的代码都是对于数据库中的数据做增删改查等等,所以在此新建cfsnDAO类,编写数据库的查询、删除等操作。

2、java web中一个页面显示的逻辑

2.1、web层

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">

2.2、Action类

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;
  }
}

2.3、这个类调用底层CfsnDAO.java中的queryNews方法

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信号。

2.4、接下来当然是newsAll.jsp显示所有新闻咯

<%@ 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的各个参数的值,在页面上显示出来。

一个页面显示过程就结束了。

3、补充cfsn.java封装了新闻信息

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 ;
  }

4、回顾一下本项目的主要结构

-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;
  }
}

5、运行

点击2要需要一点时间,第一次,第二次都失败了

 

第三次才返回成功页面。

食品安全项目阶段整合_第1张图片

还有多次测试导致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开始了呢?

6、下一步的工作

初步掌握SSH框架;

尝试HttpClient抓网页、Jsoup语义分析;

(Mark Jsoup网页内容抓取分析

网络爬虫专栏)

你可能感兴趣的:(食品安全项目阶段整合)