淘特Jsp Cms二次开发说明

来自站长百科
跳转至: 导航、​ 搜索

导航: 上一页

CMS框架说明及特色[ ]

  • 基于MVC三层架构,业务、控制、显示层层分离,面向对象的编程思想,扩展开发容易。
  • 数据库模块统一放置于包tot.dao.jdbc中,所有业务逻辑相关操作,由统一的DAOFactory获取并实例化,便于系统的统一管理。

打个比方:如果原来的广告管理使用的AdDaoJDBC类,如果通过二次开发(扩展AdDaoJDBC类更加快洁)新建一个类AdNewDaoJDBC,那么只要在DAOFactory中更改AdDao实例类为AdNewDaoJDBC,无需修改其它代码,所有系统中的相关广告管理都会自动更新到新开发的类AdNewDaoJDBC上。

  • 基于语言包的管理,每个国家的语言包以属性文件的形式存放,更换语言容易。使用记事本等编辑软件打开修改后,即可自动更新。无需编程。UTF-8编码,支持各国语言
  • 系统以已提供高性能的连接池,同时提供各WEB容器的连接池接口,只需要设置相关参数就可以进行数据库操作。
  • 统一的数据库BEAN工厂(tot.bean.DataField),通过引用(import)系统中的DataField类,即可完成数据库中字段的复值、取值。
  • 而不需要再写专门的数据bean,对于任何一个工程来讲,都会大大降低了重复工作量。

说明:DataField对应中数据库中的一行记录,通过它的setField()方法增加字段,然后再通过getFieldValue()方法获取字段值。

  • 系统集成Java高效索引、搜索引擎,该模块是先将数据库内容采用一定的分词技术生成索引,前台模糊查询时读取的索引文件,因而速度非常快,同时检索的同时不在查询数据库,从而节省了大量资源。
  • 大量采用了Ajax技术,后台无限级分类、WEB采集等模块均加入了Ajax技术异步调用,极大优化了程序代码,真正意义的实现了“无限”级数量级业务。
  • Java多线程、Task任务处理、线程监听、CACHE缓存、对象连接池等一系列技术优化保证系统的性能。

AbstractDao类说明[ ]

数据操作类(tot.dao.AbstractDao),作为数据库操作的基础类,本系统中所有的数据库业务对象均扩展此类,通过其提供的一系统方法,只要构造相应的sql查询语句就可以获取相应的记录对象。无需再写专门的处理程序。

函数部分方法[ ]

  • public Collection getData(String sqlStr,String fieldArr){}

函数说明:获取数据记录 参数:

  1. @paramsqlStr 用于查询数据库的标准sql语句
  2. @paramfieldArr 用于返回字段的名称映射

返回类型 Collection.

  • public Collection getDataList_mysqlLimit(String sqlStr,String fieldArr,int rowsNum, int offset){}

函数说明:数据显示分页函数,专用于mysql数据库

参数:

  1. @param sqlStr 数据库查询SQL语句.
  2. @param fieldArr 需要返回的字段.
  3. @param rowsNum 每页显示数据行数.
  4. @param offset 当前回溯位置.

返回类型 Collection.

  • public Collection getDataList_Limit_Normal(String sqlStr,String fieldArr,int rowsNum,int offset){}

函数说明:数据显示分页函数,适用于支持记录回滚的数据库。

参数:

  1. @param sqlStr 数据库查询SQL语句.
  2. @param fieldArr 需要返回的字段.
  3. @param rowsNum 每页显示数据行数.
  4. @param offset 当前回溯位置.

返回类型 Collection.

  • public DataField getFirstData(String sqlStr,String fieldArr){}

函数说明:据SQL语句查询获得第一条记录

参数:

  1. @param sqlStr SQL查询语句
  2. @param fieldArr 需要返回的字段名称

返回类型 DataFild

  • public int getDataCount(String sqlStr){}

函数说明:获取记录个数,如:getDataCount("select count(*) from 表")

返回类型:int

  • public boolean exe(String sqlStr) throws ObjectNotFoundException,DatabaseException{}

函数说明:执行sql更新语句 如:exe("update table set field=1 where id=1")

返回类型:boolean

  • public void bat(String sqlStr,String[] fieldvalue){ }

函数说明:批量执行sql更新语句 如:bat("update table set field=1 where id=?",String对象)


备注: 以上函数中均包含sqlStr和fieldArr两个参数,他们分别是要执行的sql语句和要返回的字段名称,注意字段个数要和查询的字段字数相同比如:sqlStr设置如下:"select id,Title,Content from t_article",因为上面sql查询语句返回3个字段,因此fieldArr要设置如下:"id,Title,Content",因为这三个字段是数据库bean中的字段设置、取值所用的字段名称,其名字是随意的,只要字段个数与sqlStr查询语句中返回的字段个数一致就可以了。因此fieldArr也可以设置如:"a1,a2,a3" 因此根据设置的bean字段名称不同,取字段值所采用的字段名称也是不同的。 如:

df.getFieldValue("id"),df.getFieldValue("Title")等是根据fieldArr="id,Title,Content"时的取值。
df.getFieldValue("a1"),df.getFieldValue("a2")等是根据fieldArr="a1,a2,a3"时的取值。

实例操作[ ]

以下例子是一个完整的二次开发数据库类的例子(一个广告操作的数据库类):

package tot.dao.jdbc;
import tot.dao.AbstractDao;
import tot.db.DBUtils;
import tot.bean.*;
import tot.exception.ObjectNotFoundException;
import tot.exception.DatabaseException;
import java.sql.*;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
 *
 * @author tot
 */
public class AdDaoImplJDBC extends AbstractDao{
    private static Log log = LogFactory.getLog(AdDaoImplJDBC.class);
    /** Creates a new instance of AdDaoImplJDBC */
    public AdDaoImplJDBC() {
    }
/** 广告添加 */
    public boolean add(String title,String content,Timestamp moditime){
        Connection conn = null;
        PreparedStatement ps = null;
        boolean returnValue=true;
        String sql="insert into t_ad(Title,Content,ModiTime) values(?,?,?)";
        try{
            conn = DBUtils.getConnection();
            ps=conn.prepareStatement(sql);            
            ps.setString(1,title);
            ps.setString(2,content);
            ps.setTimestamp(3,moditime);
            if(ps.executeUpdate()!=1) returnValue=false;
        } catch(SQLException e){
            log.error("add error",e);
        } finally{
            DBUtils.closePrepareStatement(ps);
            DBUtils.closeConnection(conn);
        }
        return returnValue;
    }
    /*
     * 广告修改
     */
    public boolean mod(int id,String title,String content,Timestamp moditime){
        Connection conn = null;
        PreparedStatement ps = null;
        boolean returnValue=true;
        String sql="update t_ad set Title=?,Content=?,ModiTime=? where id=?";
        try{
            conn = DBUtils.getConnection();
            ps=conn.prepareStatement(sql);
            ps.setString(1,title);
            ps.setString(2,content);
            ps.setTimestamp(3,moditime);
            ps.setInt(4,id);
            if(ps.executeUpdate()!=1) returnValue=false;
        } catch(SQLException e){
            log.error("mod error",e);
        } finally{
            DBUtils.closePrepareStatement(ps);
            DBUtils.closeConnection(conn);
        }
        return returnValue;
    }    
    /* 广告删除 */
    public boolean del(int id) throws ObjectNotFoundException,DatabaseException{
        return exe("delete from t_ad where id="+id);
    }
    /* 
     * 广告分页调用 
     * @param currentpage 当前页数
     * @param pagesize	  每页记录数
    */
    public Collection getAdList_Limit(int currentpage,int pagesize){
        if(DBUtils.getDatabaseType() == DBUtils.DATABASE_MYSQL){
            StringBuffer sql=new StringBuffer(512);
            sql.append("select id,Title,ModiTime from t_ad");
            return getDataList_mysqlLimit(sql.toString(),"id,Title,ModiTime",pagesize,(currentpage-1)*pagesize);
        } else if (DBUtils.getDatabaseType() == DBUtils.DATABASE_SQLSERVER) {
            StringBuffer sql=new StringBuffer(512);
            sql.append("SELECT TOP ");
            sql.append(pagesize);
            sql.append(" id,Title,ModiTime FROM t_ad WHERE (id <=(SELECT MIN(id) FROM (SELECT TOP ");
            sql.append((currentpage-1)*pagesize+1);
            sql.append(" id  FROM t_ad");
            sql.append(" ORDER BY id DESC) AS t))");
            sql.append(" ORDER BY id DESC");
            return getData(sql.toString(),"id,Title,ModiTime");
        } else{
            StringBuffer sql=new StringBuffer(512);
            sql.append("select id,Title,ModiTime from t_ad");
            return getDataList_Limit_Normal(sql.toString(),"id,Title,ModiTime",pagesize,(currentpage-1)*pagesize);
        }
    }
    /** 获取某一条广告记录 ,并以DataField类结果存放,读取时采用DataField.getFieldValue("字段名称")方法*/
    public DataField getGuestBook(int id){
        return getFirstData("select id,Title,ModiTime from t_ad where id="+id,"id,Title,ModiTime");
    }
    /*记录个数*/
    public int getTotalCount(){
        StringBuffer sql=new StringBuffer(512);
        sql.append("select count(*) from t_ad");
        return(this.getDataCount(sql.toString()));
    }
}

常见的前台分页调用部分代码:
开始要import系统常用的包
<%@ page import="tot.exception.*"%>
<%@ page import="tot.util.*" %>
<%@ page import="tot.bean.*" %>
<%@ page import="tot.dao.DaoFactory" %>
..............

<%
  int CurrentPage=RequestUtil.getInt(request,"page");//当前页数
  int PageSize=20;//每页显示个数
  TotalNum=DaoFactory.getAdDAO().getTotalCount(categoryid);//总记录个数
  PageNum=(TotalNum-1+PageSize)/PageSize;//计算总页数
  ArrayList list=(ArrayList)DaoFactory.getAdDAO().getAdList_Limit(CurrentPage,PageSize);//获取记录
  for (Iterator iter = list.iterator(); iter.hasNext(); ) {//遍历记录
  	DataField df=(DataField)iter.next();//一行记录
	String id=df.getFieldValue("id");//读取字段id
	int AdType=Integer.parseInt(df.getFieldValue("AdType"));//读取字段AdType
  }
%>

相关条目[ ]

参考来源[ ]