麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Apache Cocoon and XSP

2019-11-18 11:19:22
字體:
來源:轉載
供稿:網友

jc2cn 原創

  Apache Cocoon and XSP
([email protected])
=============================

一.介紹
  
  Apache Cocoon是一個純java的網頁內容發布框架,它答應內容(純數據)、邏輯和表現形式分別放到不同的xml文件中,然后用XSL來將它們組合并顯示出來。這種結構的好處是,表現與內容無關,例如,存放在一個XML文件中的一本書的內容,可以根據表現形式的不同要求,用XSL轉換成Html格式、PDF格式甚至是WML(當然現在WAP不適合看書。。。呵)等不同的形式,而且由于XML的表現無關性,使之作為一種標準的傳輸交換數據格式在B2B(企業-企業)商務活動中以及分布式程序的傳輸交互(例如,SOAP)中有著廣闊的應用。
  XSP即Extensible Server Pages的縮寫,它通過在XML文件中加入Java程序來實現商務邏輯,由于XML文件中的數據是通過XSL來表現的,所以XSP做到了把內容與顯示分開。想一想你熟悉的aspphpjsp是怎么做的?它們是把邏輯代碼插入到HTML頁面中來工作的,也就是說內容與顯示并沒有分開。這很輕易造成麻煩,假如你用這些技術開發過網站就會有體會,必須先等美工人員給你做好了的HTML頁面,然后你嵌入你的那些代碼(假如做的夠久,干脆Ctrl+C and Ctrl+V)。以后美工人員想改點什么還要先抓住你問:“老兄,我動動這塊兒沒事吧?!”。更糟糕的是網站要改版呢?
  在用Cocoon構建網站中,工作人員被分為三種:XML文件的編寫者、XSP的編寫者和XSL的編寫者。XML文件的編寫者主要是編寫XML文件格式,DTD或者Schema,這工作相當于通常網站的內容編輯。XSP編寫者就是負責往XML文件中加入Java邏輯代碼,來動態控制內容,這工作相當于通常網站的ASP、PHP、JSP程序編寫者。XSL編寫者負責編寫顯示頁面的XSL文件,也就是通常網站的美工人員,不過這比一般美工人員要求高,因為XSL由模板組成,就是一個個調用XML的相關元素而沒有內容的空架子,這些模板也是有固定語法的,具體怎么回事以后部分能看到。

二.安裝Cocoon

  雖然JBuilder6開發環境可以調試Cocoon Web程序,但也許你并不使用JBuilder6,所以下面我介紹一下在Windows2000 PRofessional中的安裝配置過程(以我機器上的目錄為例):

1.JDK

  我用的是JBuilder自帶的JDK1.3.1,安裝目錄為c:/jbuilder6/jdk1.3.1/ 。假如你還沒有JDK安裝程序,請到http://java.sun.com去下載一份。
  直接安裝。

2.Apache HTTP Server

  我用的是PHPTriad for Windows自帶的Apache 1.3.12,安裝目錄為c:/apache/ 。假如你還沒有Apache安裝程序,請到http://www.apache.org去下載一份。
  直接安裝,注重修改c:/apache/conf/httpd.conf文件中的port項(大約第211行),假如你有其他HTTP Server比如IIS,請修改此端口值,不要跟IIS沖突。我的port值設定為8000。

3.Tomcat

  我用的是JBuilder自帶的Tomcat3.2.3,安裝目錄為c:/jbuilder6/jakarta-tomcat-3.2.3/ 。假如你還沒有Tomcat安裝程序,請到http://jakarta.apache.org去下載一份。
  下載 ApacheModuleJServ.dll (還是上面的那個網站),將文件拷貝到c:/apache/modules/ 目錄中。
  修改c:/jbuilder6/jakarta-tomcat-3.2.3/conf/tomcat.conf文件,將"LoadModule jserv_module modules/ApacheModuleJServ.dll"前面的"#"去掉(大約第8行),并且將"LoadModule jserv_module libexec/mod_jserv.so"前面加上"#"(大約第13行)。
  修改c:/apache/conf/httpd.conf文件,在文件最后加上"include c:/jbuilder6/jakarta-tomcat-3.2.3/conf/tomcat.conf"
  右鍵單擊"我的電腦"->"高級"->"環境變量",在"系統變量"中"新建"下面兩個環境變量:"變量名"為"TOMCAT_HOME","變量值"為"c:/jbuilder6/jakarta-tomcat-3.2.3";"變量名"為"JAVA_HOME","變量值"為"c:/jbuilder6/jdk1.3.1"。

4.Cocoon

  我用的是JBuilder自帶的Cocoon1.8,安裝目錄為c:/jbuilder6/cocoon/ 。假如你還沒有Cocoon安裝程序,請到http://xml.apache.org去下載一份。
  將c:/jbuilder6/cocoon/lib/ 目錄下的所有*.jar文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/lib/目錄下面。
  將c:/jbuilder6/cocoon/bin/ 目錄下的cocoon.jar 文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/lib/目錄下面。
注重:我用的Tomcat版本可以自動檢查c:/jbuilder6/jakarta-tomcat-3.2.3/lib/目錄下的*.jar文件,然后加入到$CLASSPATH中,假如你發現你的Tomcat不支持自動檢查功能,你要手動向tomcat.bat中加入那些拷貝過去的*.jar文件。
  在c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/下建立cocoon子目錄,然后在c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/目錄下建立WEB-INF子目錄。
  將c:/jbuilder6/cocoon/conf/cocoon.properties文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/WEB-INF/中。
  將c:/jbuilder6/cocoon/src/WEB-INF/web.xml文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/WEB-INF/中。
  修改c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/WEB-INF/web.xml文件,將其中的conf/cocoon.properties改成WEB-INF/cocoon.properties
  修改c:/apache/conf/httpd.conf文件,在最后加上:
Alias /cocoon c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon
 <Directory "c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon">
     Options Indexes FollowSymLinks
 </Directory>
 ApJServMount /cocoon /cocoon
 <Location /cocoon/WEB-INF/ >
     AllowOverride None
     deny from all
 </Location>
  修改c:/jbuilder6/jakarta-tomcat-3.2.3/conf/server.xml文件,加上:
<Context path="/cocoon" docBase="webapps/cocoon" debug="0" reloadable="true" >
</Context>

最后重新啟動Tomcat和Apache,讓設置生效。
在IE中訪問:http://localhost:8080/cocoon/Cocoon.xml
可以看到Cocoon的一些參數。

三.用java寫XSP的邏輯標簽

  先看一個XSP的例子,這是一個簡單的計數器

---------- counter.xml ----------

<?xml version="1.0" encoding="gb2312" ?>

<?cocoon-process type="xsp"?>
<?cocoon-process type="xslt"?>
<?xml-stylesheet href="counter.xsl" type="text/xsl"?>

<xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core">
<xsp:logic>
    private static int nCounter = 0;
    private synchronized int getCounter()
    {
      return nCounter++;
    }
</xsp:logic>

<counter>
    <p>
          訪問:<xsp:eXPr>getCounter()</xsp:expr>(次)
    </p>
</counter>

</xsp:page>

---------- counter.xsl ----------

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="counter">
   <xsl:copy>
    <xsl:apply-templates/>
   </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

下面分析一下上面counter.xml文件中每條語句的意思:

<?xml version="1.0" encoding="gb2312"?>
  這個就不用說了吧?XML文件都必須包含的部分,XSP是一個XML文件,當然也不能少了它。這里使用GB2312字符集,以便在代碼中顯示中文字符。

<?cocoon-process type="xsp"?>
  這個處理指令指示cocoon使用XSP來處理此XML文件。

<?cocoon-process type="xslt"?>
<?xml-stylesheet href="counter.xsl" type="text/xsl"?>
  這個處理指令指示cocoon使用counter.xsl文件來轉換顯示此XML文檔,對XML文件進行XSLT不是必需的。

<xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core">
  每個XSP文件都必須包含xsp:page,這是XSP的根元素。同時也必須指定名字空間。而language屬性不是必需的,它指定處理邏輯部分使用的語言,默認值為java語言。注重:xsp:page必須包含一個XML文件的根元素,上面代碼它包含的根元素是counter。

<xsp:logic></xsp:logic>
  這個標簽包含的就是XSP的邏輯部分。XSP默認的引入(import)了很多常見的java類(具體是什么看后面的說明),所以你可以直接寫java代碼,而不必import需要的包和類了。但是假如想引入某個類,可以在xsp:strUCture中嵌套xsp:include來實現,比如:
<xsp:structure>
    <xsp:include>java.util.Vector</xsp:include>
</xsp:structure>
這就相當于import java.util.Vector

<xsp:expr>getCounter()</xsp:expr>
  這個標簽是求表達式的值,然后顯示出來,這是自動做類型轉換的。它將此值作為輸出XML文件中一個節點的text值存放的。另外,有時候需要在xsp:logic中嵌套著使用xsp:expr,以使xsp:expr輸出的內容作為一個節點,這時候你不能直接把xsp:expr放到xsp:logic中,而是將xsp:expr放到xsp:context中,然后再嵌入到xsp:logic中,像下面這樣:
<xsp:logic>
 <td>
  for (int i = 0; i < parameterValues.length; i++) 
  {
    <xsp:content>
      <xsp:expr>parameterValues[i]</xsp:expr>
    </xsp:content>
    <br/>
  }
 </td>
</xsp:logic>
  注重:其中"<"需要轉換成<以避免XML解析錯誤。這通常在寫程序時候很麻煩,因為你會經常用到">","<"等等需要轉換的符號。你可以將要轉換的內容放到<![CDATA ]]> 標簽中,這樣XML就會不處理其中的內容,所以上面代碼可以這么寫:
<xsp:logic>
 <td>
  <![CDATA[ for (int i = 0; i < parameterValues.length; i++) ]]>
  {
    <xsp:content>
      <xsp:expr>parameterValues[i]</xsp:expr>
    </xsp:content>
    <br/>
  }
 </td>
</xsp:logic>
還要注重的是,一個非空元素不能被xsp:logic截斷。比如上面的代碼,假如<td>寫到xsp:logic外面,就是不正確的:
<!-- 這個td元素是非空的,而且被xsp:logic截斷了 -->
<td>
<xsp:logic>
  <![CDATA[ for (int i = 0; i < parameterValues.length; i++) ]]>
  {
    <xsp:content>
      <xsp:expr>parameterValues[i]</xsp:expr>
    </xsp:content>
    <br/>
  }
</xsp:logic>
</td>

  這只是非常簡單的應用,Cocoon附帶了很多例子,建議你看看。上面是用java代碼在邏輯標簽中實現動態內容的,也許你并不熟悉java語言,這并不代表你不能使用XSP。因為XSP還提供了標簽庫功能,通過使用標簽庫這樣你甚至不懂編程語言也能用標簽庫來建立XSP頁面。關于標簽庫的使用和XSP其他一些問題下次介紹吧!

--------- 附 -------------
下面這些java類被自動引入:

java.io.*; 
java.util.*; 
org.w3c.dom.*; 
org.xml.sax.*; 
javax.servlet.*; 
javax.servlet.http.*; 
org.apache.cocoon.parser.*; 
org.apache.cocoon.producer.*; 
org.apache.cocoon.framework.*; 
org.apache.cocoon.processor.xsp.*; 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄色大片网站在线观看 | av成人免费在线观看 | 国产日产精品久久久久快鸭 | 九色 在线 | 久久草在线视频免费 | 久久久久久亚洲综合影院红桃 | 在线观看国产免费视频 | 午夜a狂野欧美一区二区 | 嗯~啊~弄嗯~啊h高潮视频 | 国产精品视频2021 | xxx日本视频 | 中午字幕无线码一区2020 | 色戒在线版 | 欧美日韩在线播放一区 | 免费国产自久久久久三四区久久 | 久久久久久久久久亚洲精品 | 国产日产精品一区四区介绍 | 精品一区二区三区在线观看视频 | 久久久久久久久成人 | 国产91对白叫床清晰播放 | 国产午夜精品久久久久婷 | 国产成人精品无人区一区 | 国产精品成人av片免费看最爱 | 国产精品午夜在线观看 | 亚洲国产中文字幕 | 国产成视频在线观看 | 亚洲xxx在线观看 | 播色网 | 欧美成人精品不卡视频在线观看 | 成人小视频免费在线观看 | 99爱福利视频在线观看 | 久久精品日产高清版的功能介绍 | www.国产一区.com | 91精品一区二区综合在线 | 久久中文一区 | 久久久久久久久久91 | 福利在线影院 | 国产一区日韩一区 | 久久国产亚洲视频 | 天堂在线资源av | 亚洲一区在线免费视频 |