一個(gè)JAVA版本的CMS系統(tǒng):
我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、碑林ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的碑林網(wǎng)站制作公司
師說(shuō)CMS是用Java開(kāi)發(fā)的內(nèi)容管理系統(tǒng),目前是開(kāi)源中國(guó)比較活躍的開(kāi)源項(xiàng)目之一。
師說(shuō)CMS采用目前最流行的Maven項(xiàng)目架構(gòu),設(shè)計(jì)簡(jiǎn)單易懂,是一個(gè)輕量級(jí)的Java CMS。
Spring MVC為表現(xiàn)層,Spring為業(yè)務(wù)層,MyBatis為數(shù)據(jù)層。項(xiàng)目大量使用注解,代碼注釋清晰,文檔齊全,是學(xué)習(xí)和二次開(kāi)發(fā)的首選。
參考如下代碼:
MS Access在測(cè)試階段比較利于攜帶,Web開(kāi)發(fā)初期我經(jīng)常使用它。后期再移植到SQLServer或Oracle上。但最近在需要對(duì)數(shù)據(jù)庫(kù)中插入圖片文件時(shí),發(fā)現(xiàn)了一個(gè)問(wèn)題,即JDK自帶的JDBC-ODBC不支持java.sql.Blob里的方法,經(jīng)過(guò)查閱Java API和程序調(diào)試,我找到了個(gè)變通的方法,即:
1,在寫入BLOB類型字段時(shí),使用java.sql.PreparedStatement的setBinaryStream方法,
2,讀出BLOB類型字段時(shí),因?yàn)榉祷氐氖亲止?jié)數(shù)組byte[]類型,可以把它轉(zhuǎn)換成ByteArrayInputStream然后讀出內(nèi)容寫到文件里去。
這樣即使用JDK自帶的JDBC-ODBC驅(qū)動(dòng), 也能自如的在數(shù)據(jù)庫(kù)里讀寫上傳下載的文件了,哈哈。
import java.sql.*;
import java.io.*;
//對(duì)BLOB字段先寫入(要求被寫入的文件存在),再讀出來(lái)
//要求先建立一個(gè)item表,有三個(gè)字段,id(int),file_name(char),file_blob(blob)
//對(duì)Access, blob字段應(yīng)該設(shè)置成為“OLE對(duì)象”類型
public class blobtest{
public static void main(String[] args){
Connection conn = null;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
/*這里的數(shù)據(jù)庫(kù)的url一定要寫正確,這是關(guān)鍵,其中DBQ可以絕對(duì)路徑,也可以是相對(duì)路徑,為了體現(xiàn)數(shù)據(jù)存儲(chǔ)路徑的/獨(dú)立性,你可以將數(shù)據(jù)庫(kù)copy到不同的位試一下*/
String dbUrl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=blob.mdb";
conn = DriverManager.getConnection(dbUrl,"","");
File file1=new File("fileToWrite.doc");
File file2=new File("fileRead.doc");
//BlobWriteForOracle( conn, file1);
//BlobReadForOracle( conn, file2);
BlobWriteForAccess( conn, file1);
BlobReadForAccess( conn, file2);
conn.close();
}catch(Exception ex){
System.err.println(ex.getMessage());
public static void BlobWriteForAccess( Connection conn, File file){
try{
conn.setAutoCommit(false); // 取消Connection對(duì)象的auto commit屬性
String file_name=file.getName();
// get maxid ( to avoid insert id repeatly )
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select max(id) from item");
rs.next();
int maxid = rs.getInt(1);
//maxid = (maxid==null)?0:maxid;
int id = maxid+1 ;
//System.out.println("write_id="+id);
PreparedStatement pstmt = conn.prepareStatement( "insert into item ( id, file_name, file_blob ) values ( " + id + ", ? , ? )" );
FileInputStream in = new FileInputStream(file );
int length = in.available();
pstmt.setString( 1, file_name );
pstmt.setBinaryStream( 2, in , in.available() );
System.out.println( "插入了 "+ pstmt.executeUpdate ()+ " 行數(shù)據(jù), "
+ "id =" + id
+ ", 文件名是" + file.toString() +" , 共 "+ length +" bytes" );
conn.commit();
pstmt.close();
}catch(Exception ex){
ex.printStackTrace();
System.out.print("["+ex.getMessage()+"]");
try{
conn.rollback();
}catch(SQLException sqle){
System.err.println(sqle.getMessage());
}
}
public static void BlobReadForAccess( Connection conn, File file){
try{
conn.setAutoCommit(false); // 取消Connection對(duì)象的auto commit屬性
String file_name=file.getName();
// get maxid ( to avoid insert id repeatly )
Statement stmt1 = conn.createStatement();
ResultSet rs1 = stmt1.executeQuery("select max(id) from item");
rs1.next();
int maxid = rs1.getInt(1);
//maxid = (maxid==null)?0:maxid;
int id = maxid;
//System.out.println("read_id="+id);
String sql="SELECT file_blob FROM item WHERE id=" + id + ""; //
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
rs.next();
Object obj1 = rs.getObject("file_blob"); // 得到BLOB對(duì)象
//System.out.println("type is :"+obj1.getClass().getName());
byte[] blob=(byte[])obj1;
FileOutputStream out=new FileOutputStream(file); // 建立輸出流
ByteArrayInputStream in=new ByteArrayInputStream(blob); // 建立輸入流
int size=1024;
byte[] buffer=new byte[size]; // 建立緩沖區(qū)
int len;
while((len=in.read(buffer)) != -1)
out.write(buffer,0,len);
in.close();
out.close();
conn.commit();
}catch(Exception ex){
ex.printStackTrace();
System.out.print("["+ex.getMessage()+"]");
try{
conn.rollback();
}catch(SQLException sqle){
System.err.println(sqle.getMessage());
}
CMS是什么?
CMS是Content Management System的縮寫,意位“內(nèi)容管理系統(tǒng)”。內(nèi)容管理系統(tǒng)是一種位于Web前端(Web服務(wù)器)和后端辦公系統(tǒng)或流程(內(nèi)容創(chuàng)作、編輯)之間的軟件系統(tǒng)。
內(nèi)容的創(chuàng)作人員、編輯人員、發(fā)布人員使用內(nèi)容管理系統(tǒng)來(lái)提交、修改、審批、發(fā)布內(nèi)容。這里指的“內(nèi)容”還包括文件、表格、圖片、數(shù)據(jù)庫(kù)中的數(shù)據(jù)甚至視頻等一切你想要發(fā)布到互聯(lián)網(wǎng)中的信息。
一個(gè)內(nèi)容管理系統(tǒng)通常有幾個(gè)要素:文檔模板、腳本語(yǔ)言或標(biāo)記語(yǔ)言、與數(shù)據(jù)庫(kù)集成。內(nèi)容的包含物右內(nèi)嵌入頁(yè)面的特殊標(biāo)記控制。這些標(biāo)記對(duì)于一個(gè)內(nèi)容管理系統(tǒng)通常是唯一的。這些系統(tǒng)通常有復(fù)雜的操作語(yǔ)言支持,如 Python,Perl或Java等。
內(nèi)容管理在網(wǎng)站中的作用
CMS對(duì)站點(diǎn)管理和編輯人員的作用最大。這其中的好處是能夠使用模板和通用的設(shè)計(jì)元素以確保整個(gè)網(wǎng)站的協(xié)調(diào)。制作者只要在他們的文檔中采用少量的模板代碼,即可把精力集中在設(shè)計(jì)的內(nèi)容上了。要改變網(wǎng)站的外觀,管理員只須修改模板而不是一個(gè)個(gè)單獨(dú)的頁(yè)面。
很多人內(nèi)容管理系統(tǒng)允許對(duì)網(wǎng)站的不同層次面人員賦予不同等級(jí)的訪問(wèn)權(quán)限,這使得他們不必研究操作系統(tǒng)級(jí)的權(quán)限設(shè)置,只改動(dòng)瀏覽器借口即可完成。目前,新浪的CMS是C++制作的,重點(diǎn)強(qiáng)調(diào)數(shù)據(jù)結(jié)構(gòu)的豐富,功能非常強(qiáng)大。評(píng)論回復(fù)系統(tǒng)做的最好的是網(wǎng)易,延伸閱讀做得也不錯(cuò)。搜狐的圖庫(kù)系統(tǒng)做得最好。
其他的網(wǎng)站功能如搜索引擎、日歷、Web郵件等也會(huì)以第三方插件的形式集成進(jìn)來(lái)。
國(guó)內(nèi)CMS三大分類情況
由于針對(duì)的目標(biāo)用戶不同,各個(gè)內(nèi)容管理系統(tǒng)的一些特點(diǎn)都會(huì)有所不同。對(duì)于要想把CMS應(yīng)用到網(wǎng)站中的站長(zhǎng)而言,為了準(zhǔn)確的網(wǎng)站定位,了解國(guó)內(nèi)的CMS內(nèi)容管理系統(tǒng)的分類情況是非常有必要的。
第一類,面向政府、事業(yè)單位,有內(nèi)外網(wǎng)的應(yīng)用,特點(diǎn)是用戶間的需求差距大,內(nèi)容管理只是一個(gè)大的系統(tǒng)中的某一個(gè)部分,一個(gè)網(wǎng)站中可能有多個(gè)CMS系統(tǒng)。一般在實(shí)施時(shí)要求制定開(kāi)發(fā),不可能用現(xiàn)成產(chǎn)品來(lái)滿足需求。這樣的解決方案有:方正祥羽、清華萬(wàn)博、WITS、中關(guān)村軟件等。這一類別的產(chǎn)品價(jià)格非常高,通常在幾萬(wàn)元,也可能上百萬(wàn)!
第二類,面向政府、媒體、ICP、大型企業(yè),特點(diǎn)是維護(hù)內(nèi)容的人數(shù)多,水平有高有低,但是需求比較明確,做各種類型的信息發(fā)布平臺(tái),要求承受的產(chǎn)品級(jí)的解決方案。相應(yīng)的產(chǎn)品有:TurboCMS、TRS WCM、龍訊。
第三類,面向企業(yè)、個(gè)人,特點(diǎn)為用戶是網(wǎng)站技術(shù)愛(ài)好者,喜歡鉆研。需求上可能比較復(fù)雜,比如要跟BBS、用戶注冊(cè)等應(yīng)用集成在一起,滿足個(gè)性化的需求,最好有原代碼,可以自己根據(jù)需要修改等等。
下面給你推薦幾個(gè)Java開(kāi)源CMS建站系統(tǒng):
1、DoraCMS是基于Nodejs+express+mongodb編寫的一套內(nèi)容管理系統(tǒng),結(jié)構(gòu)簡(jiǎn)單,較目前一些開(kāi)源的cms,doracms易于拓展,特別適合前端開(kāi)發(fā)工程師做二次開(kāi)發(fā)。
2、PublicCMS是采用2017年最新主流技術(shù)開(kāi)發(fā)的免費(fèi)開(kāi)源JAVACMS系統(tǒng)。架構(gòu)科學(xué),輕松支持上千萬(wàn)數(shù)據(jù)、千萬(wàn)PV;支持全站靜態(tài)化,SSI,動(dòng)態(tài)頁(yè)面局部靜態(tài)化等為您快速建站,建設(shè)大規(guī)模站點(diǎn)提供強(qiáng)大驅(qū)動(dòng),也是企業(yè)級(jí)項(xiàng)目產(chǎn)品原型的良好選擇。
3、電子商務(wù)平臺(tái)及CMS建站系統(tǒng) CmsWing
一款基于ThinkJS(Node.js MVC)和MySQL的功能強(qiáng)大的(PC端,手機(jī)端和微信公眾平臺(tái))電子商務(wù)平臺(tái)及CMS建站系統(tǒng)。
其實(shí)JAVA的CMS和PHP與.NET的比起來(lái)有一定差距,PHP的CMS太多,功能也多就不舉例了,值得一提的是.NET的Orchard開(kāi)源CMS,由微軟推動(dòng),2010年開(kāi)始開(kāi)發(fā),使用了.NET頂尖web技術(shù),非常容易擴(kuò)展,使用也非常靈活,它是工具型cms,非業(yè)務(wù)積累型,幾乎可以干任何事,如果對(duì)平臺(tái)沒(méi)什么限制,建議你使用orchard。