關於構建CMS網頁
本文內容是關於用CMS的思想,設計web頁面和數據庫內容。其中web頁面的頁面設計儲存在模板中,頁面內容儲存在數據庫中,我這裏用的數據庫連接時用的是數據庫緩存池來緩存。這種方式設計的網頁能夠適應大部分的門戶網站和小型私有化企業網站。
一、項目結構層設計目錄
1、web結構目錄
基本結構目錄包括:dao包;entity包;servlet包;filter包;db包(數據庫連接);
2、web頁面目錄
基本頁面目錄包括:index.jsp(首頁索引頁面);list.jsp(列表內容頁面模板);image.jsp(圖文內容頁面模板);detail.jsp(自由內容頁面模板);
二、數據庫表設計
註釋:type字段中1、2、3分別對應“列表內容頁面模板”、“圖文內容頁面模板”、“自由內容頁面模板”
1、目錄表
新建一個表,表名爲cms_channel。
設計表結構,基本字段包括:channel_id,channel_name,type(看註釋),parent_id(上級目錄的id),visit_path(訪問路徑),template_path(模板路徑),default_path(默認路徑)
2、內容表
新建一個表,表名爲cms_posts。
設計表結構,基本字段包括:id,channel_id(對應的目錄id),title(標題),cover(圖片),content_info(詳細內容),clicks(點擊量),creator(發佈人),create_time(創建時間)
都設計好後就可以開始寫代碼了
三、web結構目錄代碼
1、db包:首先在db包中新建DBManager.java文件,編寫獲取數據庫連接的方法和關閉數據庫連接的方法。
package com.ponderingtech.db;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DBManager {
private static final Log log = LogFactory.getLog(DBManager.class);
private static final String configFile = "dbcp.properties";
private static DataSource dataSource;
static {
Properties dbProperties = new Properties();
try {
dbProperties.load(DBManager.class.getClassLoader()
.getResourceAsStream(configFile));
dataSource = BasicDataSourceFactory.createDataSource(dbProperties);
Connection conn = getConnection();
DatabaseMetaData mdm = conn.getMetaData();
log.info("Connected to " + mdm.getDatabaseProductName() + " "
+ mdm.getDatabaseProductVersion());
if (conn != null) {
conn.close();
}
} catch (Exception e) {
log.error("初始化連接池失敗:" + e);
}
}
private DBManager() {
}
/**
* 獲取鏈接,用完後記得關閉
*
* @see {@link DBManager#closeConn(Connection)}
* @return
*/
public static final Connection getConnection() {
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
log.error("獲取數據庫連接失敗:" + e);
}
return conn;
}
/**
* 關閉連接
*
* @param conn
* 需要關閉的連接
*/
public static void closeConn(Connection conn) {
try {
if (conn != null && !conn.isClosed()) {
conn.setAutoCommit(true);
conn.close();
}
} catch (SQLException e) {
log.error("關閉數據庫連接失敗:" + e);
}
}
public static void Close(ResultSet rs, Statement st, Connection conn) {
if (rs != null)
try {
rs.close();
// System.out.println("查詢結果返回正常!!");
} catch (SQLException e1) {
System.out.println("查詢結果返回出現異常!!");
e1.printStackTrace();
}
if (st != null)
try {
st.close();
// System.out.println("sql語句的連接正常關閉!!");
} catch (SQLException e) {
System.out.println("sql語句關閉時出現異常!!");
e.printStackTrace();
}
if (conn != null)
try {
conn.close();
// System.out.println("數據庫連接正常關閉!!");
} catch (SQLException e) {
System.out.println("數據庫關閉時出現異常!!");
e.printStackTrace();
}
}
}
2、entity包:在entity包中新建Channel.java和Posts.java文件,編寫目錄實體類的構造方法。
package com.ponderingtech.entity;
import java.util.List;
public class Channel {
private int channelId;
private String channelName;
private int type;
private int parentId;
private String visitPath;
private String templatePath;
private String defaultPath;
private List<Channel> childChannelList;
public Channel() {
super();
}
public Channel(int channelId, String channelName, int type, int parentId,
String visitPath, String templatePath, String defaultPath) {
super();
this.channelId = channelId;
this.channelName = channelName;
this.type = type;
this.parentId = parentId;
this.visitPath = visitPath;
this.templatePath = templatePath;
this.defaultPath = defaultPath;
}
public int getChannelId() {
return channelId;
}
public void setChannelId(int channelId) {
this.channelId = channelId;
}
public String getChannelName() {
return channelName;
}
public void setChannelName(String channelName) {
this.channelName = channelName;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public String getVisitPath() {
return visitPath;
}
public void setVisitPath(String visitPath) {
this.visitPath = visitPath;
}
public String getTemplatePath() {
return templatePath;
}
public void setTemplatePath(String templatePath) {
this.templatePath = templatePath;
}
public String getDefaultPath() {
return defaultPath;
}
public void setDefaultPath(String defaultPath) {
this.defaultPath = defaultPath;
}
public List<Channel> getChildChannelList() {
return childChannelList;
}
public void setChildChannelList(List<Channel> childChannelList) {
this.childChannelList = childChannelList;
}
}
package com.ponderingtech.entity;
import java.util.Date;
public class Posts {
private int id;
private int channelId;
private String title;
private String conver;
private String contentInfo;
private int clicks;
private String creator;
private Date createTime;
public Posts() {
super();
}
public Posts(int id, int channelId, String title, String conver,
String contentInfo, int clicks, String creator, Date createTime) {
super();
this.id = id;
this.channelId = channelId;
this.title = title;
this.conver = conver;
this.contentInfo = contentInfo;
this.clicks = clicks;
this.creator = creator;
this.createTime = createTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getChannelId() {
return channelId;
}
public void setChannelId(int channelId) {
this.channelId = channelId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getConver() {
return conver;
}
public void setConver(String conver) {
this.conver = conver;
}
public String getContentInfo() {
return contentInfo;
}
public void setContentInfo(String contentInfo) {
this.contentInfo = contentInfo;
}
public int getClicks() {
return clicks;
}
public void setClicks(int clicks) {
this.clicks = clicks;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
3、
dao包:在dao包中新建ChannelDao.java和PostsDao.java文件。ChannelDao.java文件中編寫獲取數據庫中cms_channel表數據的方法,PostsDao.java文件中編寫獲取數據庫中cms_PostsDao表數據的方法。
package com.ponderingtech.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.ponderingtech.db.DBManager;
import com.ponderingtech.entity.Channel;
public class ChannelDao {
public List<Channel> getTopChannelList() {
String sql = "select * from cms_channel where parent_id is null";
// 獲取連接
Connection conn = DBManager.getConnection();
Statement st = null;
ResultSet rs = null;
List<Channel> list = new ArrayList<Channel>();
try {
st = conn.prepareStatement(sql);
rs = st.executeQuery(sql);
while (rs.next()) {
Channel c = parse(rs);
list.add(c);
}
} catch (SQLException e) {
System.out.println("sql語句連接異常!");
e.printStackTrace();
} finally {
DBManager.Close(rs, st, conn);
}
List<Channel> allChannelList = getAllChannelList();
for(Channel topChannel:list) {
List<Channel> childChannelList = new ArrayList<Channel>();
for(Channel c:allChannelList) {
if(c.getParentId() >0 && c.getParentId() == topChannel.getChannelId()) {
childChannelList.add(c);
}
}
topChannel.setChildChannelList(childChannelList);
}
return list;
}
public List<Channel> getAllChannelList() {
String sql = "select * from cms_channel";
// 獲取連接
Connection conn = DBManager.getConnection();
Statement st = null;
ResultSet rs = null;
List<Channel> list = new ArrayList<Channel>();
try {
st = conn.prepareStatement(sql);
rs = st.executeQuery(sql);
while (rs.next()) {
Channel c = parse(rs);
list.add(c);
}
} catch (SQLException e) {
System.out.println("sql語句連接異常!");
e.printStackTrace();
} finally {
DBManager.Close(rs, st, conn);
}
return list;
}
public Channel getChannel(String visitPath) {
String sql = "select * from cms_channel where visit_path=?";
// 獲取連接
Connection conn = DBManager.getConnection();
PreparedStatement st = null;
ResultSet rs = null;
Channel c = null;
try {
st = conn.prepareStatement(sql);
st.setString(1, visitPath);
rs = st.executeQuery(sql);
if (rs.next()) {
c = parse(rs);
}
} catch (SQLException e) {
System.out.println("sql語句連接異常!");
e.printStackTrace();
} finally {
DBManager.Close(rs, st, conn);
}
return c;
}
private Channel parse(ResultSet rs) throws SQLException {
Channel c = new Channel(rs.getInt("channel_id"),
rs.getString("channel_name"), rs.getInt("type"),
rs.getInt("parent_id"), rs.getString("visit_path"),
rs.getString("template_path"),
rs.getString("default_path"));
return c;
}
}
package com.ponderingtech.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.ponderingtech.db.DBManager;
import com.ponderingtech.entity.Posts;
public class PostsDao {
public List<Posts> getPostsList(int channelId) {
String sql = "select * from cms_posts where channel_id=?";
// 獲取連接
Connection conn = DBManager.getConnection();
PreparedStatement st = null;
ResultSet rs = null;
List<Posts> list = new ArrayList<Posts>();
try {
st = conn.prepareStatement(sql);
st.setInt(1, channelId);
rs = st.executeQuery();
while (rs.next()) {
Posts c = parse(rs);
list.add(c);
}
} catch (SQLException e) {
System.out.println("sql語句連接異常!");
e.printStackTrace();
} finally {
DBManager.Close(rs, st, conn);
}
return list;
}
public Posts getPosts(String postsId) {
String sql = "select * from cms_posts where id=?";
// 獲取連接
Connection conn = DBManager.getConnection();
PreparedStatement st = null;
ResultSet rs = null;
Posts c = new Posts();
try {
st = conn.prepareStatement(sql);
st.setString(1, postsId);
rs = st.executeQuery();
if (rs.next()) {
c = parse(rs);
}
} catch (SQLException e) {
System.out.println("sql語句連接異常!");
e.printStackTrace();
} finally {
DBManager.Close(rs, st, conn);
}
return c;
}
private Posts parse(ResultSet rs) throws SQLException {
Posts p = new Posts(rs.getInt("id"),
rs.getInt("channel_id"),
rs.getString("title"),
rs.getString("cover"),
rs.getString("content_info"),
rs.getInt("clicks"),
rs.getString("creator"),
rs.getTimestamp("create_time"));
return p;
}
}
未完待續。。。。。。。。。。。。。。。