亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Apache Cocoon and XSP

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

jc2cn 原創

  Apache Cocoon and XSP
(bigmouse@peoplemail.com.cn)
=============================

一.介紹
  
  Apache Cocoon是一個純java的網頁內容發布框架,它答應內容(純數據)、邏輯和表現形式分別放到不同的xml文件中,然后用XSL來將它們組合并顯示出來。這種結構的好處是,表現與內容無關,例如,存放在一個XML文件中的一本書的內容,可以根據表現形式的不同要求,用XSL轉換成Html格式、PDF格式甚至是WML(當然現在WAP不適合看書。。。呵)等不同的形式,而且由于XML的表現無關性,使之作為一種標準的傳輸交換數據格式在B2B(企業-企業)商務活動中以及分布式程序的傳輸交互(例如,SOAP)中有著廣闊的應用。
  XSP即Extensible Server Pages的縮寫,它通過在XML文件中加入Java程序來實現商務邏輯,由于XML文件中的數據是通過XSL來表現的,所以XSP做到了把內容與顯示分開。想一想你熟悉的asp、php、jsp是怎么做的?它們是把邏輯代碼插入到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网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清理论片| 国产亚洲一区二区在线| 亚洲国产福利在线| 亚洲欧美日韩中文在线制服| 91精品久久久久久久久久久久久久| 亚洲毛片在线免费观看| 成人网址在线观看| 一区二区欧美亚洲| 4438全国亚洲精品在线观看视频| 欧美在线视频免费观看| 国产精品2018| 国产视频久久久久久久| 精品在线欧美视频| 欧美日韩美女在线| 亚洲国产精品小视频| 不卡av日日日| 欧美成aaa人片在线观看蜜臀| 日韩精品免费视频| 日韩高清av在线| 久久精品亚洲94久久精品| 欧美有码在线观看视频| 日本乱人伦a精品| 久久影视电视剧凤归四时歌| 欧美另类极品videosbestfree| 92看片淫黄大片看国产片| 精品国内亚洲在观看18黄| 亚洲男人天堂2019| 亚洲最大在线视频| 日韩欧美精品在线观看| 2020国产精品视频| 粉嫩av一区二区三区免费野| 亚洲欧美国产精品| 热久久视久久精品18亚洲精品| 欧美午夜激情视频| 91av视频在线免费观看| 国产精品日韩在线播放| 色综合久久久久久中文网| 日本精品久久电影| 日韩欧美一区二区在线| 国产成人精品999| 亚洲精品久久久一区二区三区| 国产精品专区h在线观看| 97香蕉久久夜色精品国产| 亚洲欧美资源在线| 欧美性在线视频| 青青草原一区二区| 国产在线精品一区免费香蕉| 亚洲精品欧美日韩| 国产精品99久久久久久久久久久久| 91九色国产在线| 这里只有精品久久| 国产亚洲精品美女久久久久| 欧美日韩国产丝袜美女| 久久久免费在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产亚洲人成a一在线v站| 成人美女免费网站视频| 热久久视久久精品18亚洲精品| 欧美性xxxx18| 久久久亚洲国产天美传媒修理工| 国产精自产拍久久久久久| 久久久女人电视剧免费播放下载| 亚洲精品福利在线| 欧美午夜丰满在线18影院| 国产精品一区二区av影院萌芽| 萌白酱国产一区二区| 亚洲天堂色网站| 亚洲国产成人精品久久久国产成人一区| 精品视频在线播放| 亚洲成人精品视频| 欧美裸体xxxxx| 国产精品激情av电影在线观看| 亚洲精品日韩av| 精品久久久久久久久久| 国产一区二区三区久久精品| 亚洲国产免费av| 性欧美xxxx视频在线观看| 日韩的一区二区| 国产精品美女在线观看| 亚洲色图综合网| 欧美精品中文字幕一区| 色无极亚洲影院| 亚洲精品久久久久中文字幕二区| 一夜七次郎国产精品亚洲| 久久久久北条麻妃免费看| 狠狠色噜噜狠狠狠狠97| 亚洲理论片在线观看| www日韩欧美| 91久久国产精品91久久性色| 欧美成人高清视频| 国产福利视频一区| 日韩精品视频在线播放| 国产精品自产拍在线观看| 69国产精品成人在线播放| 一本一道久久a久久精品逆3p| 亚洲一区二区三区香蕉| 国产一区二区三区在线看| 久久精品亚洲一区| 97国产精品人人爽人人做| 91精品91久久久久久| 中文字幕不卡在线视频极品| 久久久免费高清电视剧观看| 欧美国产日韩精品| 日韩美女在线看| 自拍偷拍亚洲一区| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品av在线播放| 国产日韩亚洲欧美| 国产成人精品免费久久久久| 亚洲aaaaaa| 日韩电影在线观看中文字幕| 亚洲国产精品va在线观看黑人| 日韩视频欧美视频| 久久久成人精品视频| 成人免费视频xnxx.com| 亚洲国产精品国自产拍av秋霞| 国产精品欧美日韩一区二区| 亚洲大胆人体视频| 国产欧美日韩专区发布| 91中文在线观看| 91精品国产91久久久久| 亚洲国内高清视频| 91人人爽人人爽人人精88v| 97精品伊人久久久大香线蕉| 久久在精品线影院精品国产| 日韩视频中文字幕| 精品国偷自产在线视频99| 日韩黄色av网站| 九九久久久久久久久激情| 96sao精品视频在线观看| 精品小视频在线| 亚洲日本成人女熟在线观看| 亚洲欧洲激情在线| 国产成人免费av电影| 欧美韩国理论所午夜片917电影| 欧美在线视频网站| 91性高湖久久久久久久久_久久99| 欧美成人精品在线视频| 91嫩草在线视频| 亚洲国产精品99久久| 日韩中文字幕精品| 欧美黑人又粗大| 国产美女精品视频| 欧美www在线| 亚洲欧美精品伊人久久| 奇米四色中文综合久久| 亚洲精品中文字| 国产午夜精品久久久| 17婷婷久久www| 在线成人激情视频| 成人网在线免费观看| 国产精品自拍偷拍视频| 久久免费在线观看| 超碰97人人做人人爱少妇| 性亚洲最疯狂xxxx高清| 91精品国产九九九久久久亚洲| 国产在线98福利播放视频| 91豆花精品一区| 九九精品在线播放| 成人av在线天堂| 96pao国产成视频永久免费| 欧美激情精品久久久久久变态| 国产一区红桃视频| 亚洲成人av资源网|