|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。假如你对ApacheCocoon有懂得大概以涉足,你大概对在Cocoon中怎样利用Java更好
的完成特定的逻辑有所困惑。这篇文章将给您先容怎样利用XSP(ExtensibleServerPage)
和Action。同时另有示例和计划准绳。
你大概听到了一些来自Apache的关于Cocoon的声响。如今,在履历了三年的开展后,
Cocoon已渐渐的从一个复杂的完成XSL(ExtensibleStylesheetLanguage)转换
的servlet发展为一个丰满的Web使用框架。
Cocoon是用Java开辟的,一样平常做为servlet运转在象Tomcat如许的servlet容器中。
在这篇文章里,我们将先容到两种举措来在基于Cocoon的使用中利用Java完成贸易逻辑。
起首,让我们来总的懂得一下Cocoon。
Cocoon正式的界说是一个XML公布引擎,我们能够了解Cocoon为一个用来发生、转换、处置
和输入数据的框架。也能够了解Cocoon是一个从多种数据源吸收数据再使用分歧的处置,最
后将数据以想要的格局输入的呆板。
我们也能够界说Cocoon是一个数据流呆板。也就是说,当你利用Cocoon时,你界说数据的路
径大概流程来发生Web使用的页面。
上面是Cocoon次要的一些基础的道理:
1、Cocoon把一切的数据做为SAX(SimpleAPIforXML)事务来处置,任何非XML的数据都要
变化成XML形貌。
2、天生器(能天生SAX事务)的组件卖力处置输出数据
3、序列化器卖力处置输入数据,将数据输入到客户端(扫瞄器、文件等)。
4、开辟职员组合天生器、序列化器和别的组件组成管道。一切的管道都在一个叫做站点舆图的
文件中界说。
5、经由过程URI(UniformResourceIdentifier)来婚配管道,但URI是与物理资本离开的。
第5点必要申明一下:
关于传统的Webserver,URI一样平常映照到物理资本。
比方,这个URIhttp://localhost/index.html在Apacheserver将映照到一个叫index.html的
HTML文件。
在Cocoon中,URIs和物理资本能够是没有任何相对的互相干系的。你能够自在的计划URI来帮
助用户更好的扫瞄你的站点。最初,你能够更好的构造你的文件让其简单办理和保护。
为了更好的懂得Cocoon的处置模子,能够看一个复杂的管道。
上面这个例子界说了一个叫index.html的页面。这个管道位于叫sitemap.xmap站点舆图中:
<map:matchpattern="index.html">
<map:generatetype="file"src="content/mainfile.xml"/>
<map:transformtype="xslt"src="content/stylesheets/mainstyle.xsl"/>
<map:serializetype="html"/>
</map:match>
这个管道有三步:
起首是一个天生器组件FileGenerator从XML文件"content/mainfile.xml"读取数据。
(FileGenerator实践上已提早在舆图中界说,能够经由过程"type"属性来援用。Cocoon中一切的
管道组件都是经由过程它们的type属性来援用的。)
接着举行转换,转换器TraxTransformer将XSLstylesheet使用到引进的数据。
最初,序列化器HTMLSerializer将数据写到客户真个扫瞄器。
你大概困惑,下面所说的和Java开辟有甚么接洽呢?
我们把Cocoon的使用分红三个部分:
1、数据的搜集层DataCollection(Generation)
2、数据的处置和转换层DataProcessing&Transforming
3、数据的输入层DataOutput(Serialization)
那末,Java开辟在Cocoon的处置转换层长短常主要的。Cocoon的转换和处置层是基于Cocoon的
使用的中心,经由过程这一层对输出数据的处置,逻辑的使用,你就能够失掉所希冀的输入。
在Cocoon中,你能够有上面四种完成逻辑的办法:
1、利用转换器(Transformer)组件:他们依照你给定的划定规矩转换传进的数据。典范的例子
即是TraxTransformer。
2、经由过程分歧的request、session、URI来选择分歧的组件做出准确的处置。
3、利用已有的大概本人完成的Action。
4、利用夹杂了Java代码和内容的XSP。
这篇文章先容最初两种举措:XSP和Action。XSP和Action的开辟都是在servletcontext内。
切实的说,两种组件(实践上是一切的组件)都要存取request,response,session,和
context对象。在某些方面,你要完成的大批的逻辑城市与这些对象互相感化。
XSP
XSP是Cocoon项目标立异。你能够把它和JSP比拟较,由于它们都是夹杂逻辑和内容并且JSP的
taglib和XSP的logicsheet也很类似。
XSP位于管道的出发点,实践上它被Cocoon转换成天生器(Generator)来给管道中其他的组件提
供数据。
让我们看上面这个叫sample1.xsp复杂的示例:
<?xmlversion="1.0"?>
<xsp:pagelanguage="java"xmlns:xsp="http://apache.org/xsp">
<xsp:logic>
Datenow=newDate();
Stringmsg="Boo!";
</xsp:logic>
<content>
<title>WelcometoCocoon</title>
<paragraph>
ThisisanXSP.Youcanseehowweitcontainbothlogic
(insidethe<xsp:logic>tags)andcontent.Inthelogicblock
above,wecreatedaDateobjectwhosevalueis<xsp:expr>now</xsp:expr>.
Oh,wealsohadaspecialmessageforyou:<xsp:expr>msg</xsp:expr>
</paragraph>
</content>
</xsp:page>
起首注重这个文档的根标志是<xsp:page>。
<xsp:pagelanguage="java"xmlns:xsp="http://apache.org/xsp">
这个标志界说XSP的language(能够是Java大概JavaScript)和用到的逻辑单的namespace。
接着是我们界说了两个Java变量的<xsp:logic>块。
这些<xsp:logic>块能够有多个,能够呈现在你但愿的任何中央,并且能够包括各类Java代码。
最初,是我们本人的内容,从用户本人的跟标签入手下手,在下面的示例中是<content>。在内容部分里,
我们能够用<xsp:expr>这个标签失掉在后面界说的变量。
记着,一个XSP实践上就是一个天生器Generator。Cocoon将其转换成Java源文件然后编译、实行它。
(假如想看XSP转换成的Java源文件,到你的servlet容器的事情路径下往找。比方,
假如你利用Tomcat4.0.4,那末路径就是上面如许:
$CATALINA_HOME/work/Standalone/localhost/cocoon/cocoon-files/org/apache/cocoon/www.)
XSP实行后发生的XML数据被传送给管道其他的组件。
看上面这个管道实例:
<map:pipelinematch="*.xsp">
<map:generatetype="serverpages"src="examples/{1}.xsp"/>
<map:serializetype="xml"/>
</map:pipeline>
这里,我们利用一个指定的天生器ServerPagesGenerator,来处置我们复杂的XSP。前往给客户
端未加润色的XML。
注重例子中利用了出格的{1}变量援用:它取代值在管道入手下手处的通配符唆使的值。也就是说,
假如我们在扫瞄器中翻开我们的Web使用中的sample1.xsp,那末{1}的值即是sample1。
记着,同多半Cocoon组件一样,XSP会见request,response,session,和context对象。这些
对象实践上是HttpServletRequest,HttpServletResponse,HttpSession,和
HttpServletContext的封装,Cocoon正式版本供应了大批的存取这些对象的办法。
XSP在从数据库读取数据的时分出格有效。
数据库数据天然地以行和列构造,以是数据库数据很简单转换到XML。但是,JDBC
(JavaDatabaseConnectivity)没有合适地代码完成向XML的转换。
XSP可让我们在读取数据时很简单,这要感激ESQL逻辑单。ESQL逻辑单除埋没了具体
的JDBC代码,还同意将行和列放进到特定的标签中。同时ESQL逻辑单也能够实行嵌套查询
和实行更新命令。
上面,我们举个XSP使用的例子:
假设我们想将一些Cocoon的资本(称号和URL)存储到数据库。
起首,我们界说寄存资本的数据表,然后当用户经由过程关头字搜刮时,我们利用XSP来找到响应
的行,将数据显现给用户。
随后,我们构建一个表单来增添新的列。
表的界说和拔出的数据以下面所示。我们这里利用的数据库是MySQL,假如您利用的是别的的
数据库,要注重做响应的修改。这个例子中,必需要有设置好数据库毗连池。
表布局以下:
usetest;
createtableResources(
ResourceURLvarchar(255)notnull,
ResourceNamevarchar(64)notnull
);
拔出一些资本数据:
insertintoResourcesvalues
(http://xml.apache.org/cocoon,CocoonHomePage);
insertintoResourcesvalues
(http://www.galatea.com/Flashguides/cocoon-tips-2.xml,Cocoon2.0TipsandTricks);
表建好后而且Cocoon也准确的设置事后,我们就能够写上面这个XSP例子:
<?xmlversion="1.0"?>
<xsp:pagelanguage="java"
xmlns:xsp="http://apache.org/xsp"
xmlns:esql="http://apache.org/cocoon/SQL/v2">
<xsp:logic>
Stringkeyword=request.getParameter("value");
</xsp:logic>
<content>
<title>Searchresults</title>
<esql:connection>
<esql:pool>resources</esql:pool>
<esql:execute-query>
<esql:query>
select*fromResources
whereResourceNamelike%<xsp:expr>keyword</xsp:expr>%
</esql:query>
<esql:results>
<resources>
<esql:row-results>
<resource>
<esql:get-columns/>
</resource>
</esql:row-results>
</resources>
</esql:results>
</esql:execute-query>
</esql:connection>
</content>
</xsp:page>
注重在<xsp:page>标签中声明的称号空间(namespace)。任什么时候候,在XSP中利用逻辑单的时分,
必需要声明其称号空间(namespace)。你能够在Cocoonwebapp路径下的WEB-INF/cocoon.xconf找
到逻辑单的界说。XSP称号空间的声明就是要申明这是个XSP逻辑单。
实践上,一切的XSP最少要完成XSP逻辑单。在XSP被转换成Java源文件之前,个中的逻辑单
(实践上仅是XSL文件)会先做XSLT处置转换成Java代码。因而,在下面的例子中的一切的
ESQL标签城市转换成了我们所熟习的JDBC代码。可是并非一切的标签都能够酿成JDBC代码,
注重下面示例中的<esql:pool>块,它触及到了在WEB-INF/cocoon.xconf文件中界说的数据库
毗连池。下面程序中利用的毗连池叫做"resources",固然你可使用你所喜好的界说。
注重,我们这里利用<resources>这个标签将了局集包了起来并且每行的数据都放到<resource>标
签里。如许我们就能够很简单的编写款式表来将XML转换成别的扫瞄器能够了解的格局。我们没有
为表的列界说任何标签,经由过程利用<esql:get-columns/>,Cocoon会将每列的值放到主动以响应
的列名界说的标签内里。
如今,让我注重一下例子中的SQL查询语句,正如你所看到的,这条SQL是静态天生的。当用户
经由过程GETs大概POSTs提交数据到这个XSP后,在XSP的顶部,我们将request参数的值赋给
了keyword变量,然后依据keyword构成SQL语句。
既然这个例子很复杂,让我们把它变庞大一点,到场Email功效,能够在用户供应Email地点后,
将查询了局发送给用户。
XSP示比方下:
<?xmlversion="1.0"?>
<xsp:pagelanguage="java"
xmlns:xsp="http://apache.org/xsp"
xmlns:esql="http://apache.org/cocoon/SQL/v2"
xmlns:sendmail="http://apache.org/cocoon/sendmail/1.0"
xmlns:xsp-request="http://apache.org/xsp/request/2.0"
>
<content>
<xsp:logic>
Stringkeyword=<xsp-request:get-parametername="value"/>;
StringemailAddr=<xsp-request:get-parametername="email"/>;
StringemailBody="";
</xsp:logic>
<title>Searchresults</title>
<esql:connection>
<esql:pool>resources</esql:pool>
<esql:execute-query>
<esql:query>
select*fromResourceswhereResourceNamelike
%<xsp:expr>keyword</xsp:expr>%orderbyResourceName
</esql:query>
<esql:results>
<resources>
<esql:row-results>
<resource>
<xsp:logic>
emailBody+=<esql:get-stringcolumn="ResourceName"/>;
emailBody+=","+<esql:get-stringcolumn="ResourceURL"/>+"
";
</xsp:logic>
<esql:get-columns/>
</resource>
</esql:row-results>
</resources>
</esql:results>
</esql:execute-query>
</esql:connection>
<xsp:logic>
if(emailAddr!=null){
<sendmail:send-mail>
<sendmail:charset>ISO-8859-1</sendmail:charset>
<sendmail:smtphost>MY_SMTP_HOST</sendmail:smtphost>
<sendmail:from>MY_FROM_ADDRESS</sendmail:from>
<sendmail:to><xsp:expr>emailAddr</xsp:expr></sendmail:to>
<sendmail:subject>CocoonSearchResults</sendmail:subject>
<sendmail:body><xsp:expr>emailBody</xsp:expr></sendmail:body>
</sendmail:send-mail>
}
</xsp:logic>
</content>
</xsp:page>
来自sendmail逻辑单的几个标签让我们具有了发送EMAIL的才能。在这个例子中,我们将查询了局
的每行相加赋值给emailBody变量做为邮件的注释。当用户经由过程request参数供应一个EMAIL地点,
我们就能够发送EMAIL了。固然这必要您提早设定好SMTP服务器和FROM地点。
Cocoon晓得依据sendmail逻辑单来处置在sendmail称号空间里的标签,由于这个称号空间已
在<xsp:page>标签中已声明。检察示例中的声明,你会看到xsp-request这个称号空间。
xsp-request逻辑单供应了Request经常使用办法的封装。固然在XSP中间接会见request对象和
利用xsp-request逻辑单没有甚么功效上的区分,可是,实际上利用logicsheet的标签比直
接的JAVA代码更幽美。
在运转这个例子之前,你必需要先在cocoon.xconf文件中设置sendmail逻辑单,Cocoon的设置
文件都在Webapplication的WEB-INF目次下。用你熟习的编纂器翻开cocoon.xconf文件,
找到<target-languagename="java">标签。在这个块内,你会发明一切别的逻辑单的界说。
在最初一个逻辑单(SOAP逻辑单)后到场上面的内容:
<builtin-logicsheet>
<parametername="prefix"value="mail"/>
<parametername="uri"value="http://apache.org/cocoon/sendmail/1.0"/>
<parametername="href"
value="resource://org/apache/cocoon/components/language/markup/xsp/java/sendmail.xsl"/>
</builtin-logicsheet>
这个界说将http://apache.org.cocoon/sendmail/1.0称号空间和已包含在CocoonJAR中
的sendmail.xsl款式表团结起来。
要利用sendmail逻辑单的功效,Cocoon必需要mail.jar和activation.jar这两个JAR。
假如您利用的Server是Tomcat4.x的话,那末它们位于$CATALINA_HOME/common/lib。
Actions
Action功效很壮大,你能够将它放到管道的任何中央。Action能够以为是小的自包括的呆板,
它猎取某些输出数据,做一些处置,然后前往HashMap对象。分歧于Cocoon中的Generators,
Transformers,Serializers组件,Action不合错误实践的XML内容做任何事变,它次要在管道中
完成一些逻辑。
进修Action包含要对管道参数做些懂得,偶然管道的组件必需交换数据。固然,XML内容会通
过SAX事务传送;可是,我们所说的是管道组件自己的功效必要的值。
管道参数有两种:input和output。Input参数是由紧跟在组件声明前面的一个大概多个
<map:parameter>标签来界说的。它们为组件供应一个大概多个值来影响其操纵。
Matcher和Action这两个组件能够为它们前面的组件供应能存取的Output变量。
这些output参数放在HashMap对象里,能够经由过程key称号(如:{1})来援用。
一切的管道都最少有一个由管道入手下手处的Matcher供应的HashMap。我们在管道中利用这个
HashMap对象,利用{1}能够获得HashMap中Key为1的值。
Cocoon自己包括一些内置的Action。个中有一个是依托数据库来判别用户的Action。当我们
想回护Cocoon中的某些页面,只同意受权的用户会见时,能够将用户的ID和暗码存储到数据
库里,然后利用DatabaseAuthenticationAction来做登录确认。
这个DatabaseAuthenticationAction请求我们供应一个XML形貌文件来讲明要利用哪一个表和哪
些列。上面是这个形貌文件的示例:
<?xmlversion="1.0"encoding="UTF-8"?>
<auth-descriptor>
<connection>resources</connection>
<tablename="Users">
<selectdbcol="USER_NAME"request-param="userid"to-session="userid"/>
<selectdbcol="USER_PASSWORD"request-param="userpwd"/>
</table>
</auth-descriptor>
下面这个文件申明用户认证Action将利用resources毗连池和User表,request提交的userid参数
和userpwd参数将与User表中的USER_NAME和USER_PASSWORD列来对照,假如乐成确认,将参
数userid写到session里。
当你在管道中利用一个Action时,它必需先在站点舆图中的<map:components>块中的
<map:actions>块中界说。以下:
<map:components>
<!--allothercomponentdefinitionsgohere-->
<map:actions>
<map:actionname="authenticator"
src="org.apache.cocoon.acting.DatabaseAuthenticatorAction"/>
<!--otheractionsdefinitionsgohere-->
</map:actions>
</map:components>
一旦界说事后,就能够利用这个Action来卖力我们要回护的地区。上面为要回护的地区定
义了三个管道:
<map:matchpattern="protected/login.html">
<map:readmime-type="text/html"src="secret/login.html"/>
</map:match>
<map:matchpattern="protected/login">
<map:acttype="authenticator">
<map:parametername="descriptor"value="secret/auth-info.xml"/>
<map:redirect-touri="index.html"/>
</map:act>
<map:redirect-touri="login.html"/>
</map:match>
<map:matchpattern="protected/*">
<map:matchtype="sessionstate"pattern="*">
<map:parametername="attribute-name"value="userid"/>
<map:matchpattern="protected/*.html">
<map:readmime-type="text/html"src="secret/*.html"/>
</map:match>
<map:matchpattern="protected/*.xsp">
<map:generatetype="serverpages"src="secret/{1}.xsp"/>
<map:serializetype="xml"/>
</map:match>
</map:match>
<map:redirect-touri="login.html"/>
</map:match>
第一个管道复杂的供应了一个登录的表单,是个HTML文件,不必要转换。第二个管道处置
从login.html提交的实践的登录举措。第三个来处置我们要回护的内容。
上面我们做具体的叙述:
DatabaseAuthenticationAction依托形貌文件来考证登录。可是,我们怎样晓得考证是不是
乐成呢?关于Action,假如它们前往了无效的HashMap,那末在<map:act>块里的部分将执
行。假如前往null值,那末块上面的部分将实行。也就是说,依照下面管道的界说,我们
有两种大概的了局,即:假如认证经由过程,我们就能够抵达受回护的地区,假如失利将前往
到Login页面。
在protected/*管道有几个嵌套的Matcher,第二个的type是sessionstate,这个Matcher
实践上是WildcardSessionAttributeMatcher,在这里用来读取session里的userid的值。
在这个例子中,我们晓得DatabaseAuthenticationAction设置了一个叫userid的session属
性,我们经由过程检测userid属性来判别用户是不是登录乐成,假如它不存在,则转向到login页面。
在Cocoon已有一个DatabaseAddAction可用来拔出数据,但为了更好的了解Action,我们
将写一个本人的Action用来将新的Resource纪录拔出到Resources表中。
我们设想你已编写了一个HTML页面,可用来POST两个变量name和url到管道。我们的
Action将从Request对象中找回name和url参数,将其拔出到表中,最初前往一个HashMap对象。
上面是程序代码:
packagetest;
importorg.apache.avalon.excalibur.datasource.DataSourceComponent;
importorg.apache.avalon.framework.component.ComponentException;
importorg.apache.avalon.framework.component.ComponentManager;
importorg.apache.avalon.framework.component.ComponentSelector;
importorg.apache.avalon.framework.parameters.Parameters;
importorg.apache.avalon.framework.thread.ThreadSafe;
importorg.apache.avalon.framework.component.Composable;
importorg.apache.avalon.framework.activity.Disposable;
importorg.apache.cocoon.environment.ObjectModelHelper;
importorg.apache.cocoon.environment.Redirector;
importorg.apache.cocoon.environment.Request;
importorg.apache.cocoon.environment.Session;
importorg.apache.cocoon.environment.SourceResolver;
importorg.apache.cocoon.acting.AbstractAction;
importjava.sql.Connection;
importjava.sql.Statement;
importjava.sql.SQLException;
importjava.util.HashMap;
importjava.util.Map;
publicclassAddResourceActionextendsAbstractAction
implementsThreadSafe,Composable,Disposable
{
protectedComponentSelectordbselector;
protectedComponentManagermanager;
publicvoidcompose(ComponentManagermanager)throwsComponentException{
this.dbselector=
(ComponentSelector)manager.lookup(DataSourceComponent.ROLE+"Selector");
}
protectedfinalDataSourceComponentgetDataSource(Stringpool)
throwsComponentException{
return(DataSourceComponent)this.dbselector.select(pool);
}
publicMapact(Redirectorredirector,SourceResolverresolver,
MapobjectModel,String
source,Parametersparam)
throwsException
{
Requestreq=ObjectModelHelper.getRequest(objectModel);
Sessionses=req.getSession(true);
StringpoolName=param.getParameter("pool");
StringresourceName=req.getParameter("name");
StringresourceUrl=req.getParameter("url");
if(poolName==null){
getLogger().error("Missingapoolname");
returnnull;
}
if(resourceName==null||resourceUrl==null){
getLogger().error("Missinginputparameters");
returnnull;
}
Mapmap=newHashMap();
DataSourceComponentdataSource=getDataSource(poolName);
Connectionconn=null;
booleanstatus=false;
try{
conn=dataSource.getConnection();
Statementstmt=conn.createStatement();
Stringcmd="insertintoResourcesvalues("+
resourceName+","+
resourceUrl+")";
stmt.executeUpdate(cmd);
map.put("resource-name",resourceName);
map.put("resource-url",resourceUrl);
getLogger().debug("Resourcesinsertcompletedbyuser"+
ses.getId());
status=true;
stmt.close();
}catch(Exceptione){
getLogger().error("Stmtfailed:",e);
}finally{
try{
if(conn!=null)conn.close();
}catch(SQLExceptionsqe){
getLogger().warn("Errorclosingthedatasource",sqe);
}
}
if(!status)returnnull;
return(map);
}
publicvoiddispose(){
this.manager.release(dbselector);
}
}
这儿有大批的工具必要消化,出格是假如你不熟习Cocoon的布局。我们一步步的来讲明。
起首,Cocoonaction的主办法是act(),当在管道中利用Action时Cocoon将挪用这个办法。
在这个示例中,act()失掉Request参数、从毗连池中失掉数据库毗连,实行拔出,然后添补
HashMap对象,并将其前往。
在Act办法的入手下手是从ObjectModelHelper组件中获得Request对象,然后失掉两个参数。这个
Action必要别的一个参数,pool;它将告知我们利用哪一个毗连池。假如这个参数没有,那末
Action将前往null并且将毛病写到日记里。有了pool的称号,我们就能够从毗连池失掉数据
库的毗连。Avalon的Excalibur组件用来卖力Cocoon的毗连池。假如你不熟习Avalon,能够
会见这里http://jakarta.apache.org/avalon/。
代码中的insertstatement是间接的JDBC语法。在拔出乐成后,会将乐成的信息写到日记里。
关于日记,假如按下面Action的写法,一切的日记信息都写到你的WebApplication的
WEB-INF/logs/sitemap.log文件。
最初,我们将两个输出参数写到了Map对象,固然它们都在Request对象中,如许做是过剩的,
但我们如许做是为了示例Map对象的用法。
看一下这个Action在站点舆图中的界说。我们必需起首在站点舆图的<map:components>区定
义这个Action。
<map:components>
<!--allothercomponentdefinitionsgohere-->
<map:actions>
<map:actionname="authenticator"
src="org.apache.cocoon.acting.DatabaseAuthenticatorAction"/>
<map:actionname="add-resource"src="test.AddResourceAction"
logger="sitemap.action.AddResourceAction"/>
<!--otheractionsdefinitionsgohere-->
</map:actions>
</map:components>
在管道中利用这个Action:
<map:matchpattern="addresource">
<map:acttype="add-resource">
<map:parametername="pool"value="resources"/>
<map:readmime-type="text/html"src="examples/confirmation.html"/>
</map:act>
<map:readmime-type="text/html"src="examples/addresource.html"/>
</map:match>
能够看到,在<map:act>行的上面,紧随着的<map:parameter>标签为Action供应"pool"参数。
统统顺遂的话,Action将前往一个Map对象,confirmation页面将被显现。
在扫瞄器中翻开http://localhost:8080/cocoon/addresource,你会看到一个输出表单。
表单提交后,假如拔出乐成,将显现confirmation页面,假如呈现毛病,将再次前往到表单
页面。检察WEB-INF/logs/sitemap.log,毛病信息会告知你呈现了甚么毛病。
怎样无效的利用XSP和Action?
XSP和Action是在Cocoon中完成逻辑的两种分歧的举措。选择哪种更合适呢?
XSP在取数据大概创立布局化的数据方面是很有效的。Action被证实在把持数据流程
(其实不发生大概影响数据)的逻辑完成上很有效。我们下面看到的用户考证和数据库
操纵即是如许的两个例子。
但是,有一点必要申明的成绩:XSP会将逻辑和内容夹杂。而Cocoon的一个基础的准绳
就是逻辑、内容、暗示的分别。
在利用XSP的时分,我们提出以下几点倡议:
起首,尽量的利用逻辑单,逻辑单会很好的将Java代码埋没。
第二,只管利用Cocoon的供应的功效,如:在做数据库的Select的时分,我们也能够用
SqlTransformer来完成。
第三,在决议方面的逻辑尽量的利用Selector,Matcher或Action组件。
最初,当没法制止在你的XSP中拔出Java逻辑的话,尽量的让<xsp:logic>小,并且不要
把它们分布到各类你的标签中。
Java的B/s开发是通常是javaweb开发,又叫J2EE开发,J2SE是手机开发。C#的C/s和B/s开发是说.net和Asp开发。。u在这里说明一点;资深一点的Java和C#程序员都明白一点 |
|